65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Lambda 表达式配置 WCF Data Services

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2011 年 4 月 25 日

CPOL

1分钟阅读

viewsIcon

14770

一种简单的方法, 使用 lambda 扩展而不是字符串来配置 WCF Data Service

Configuring WCF Data Service using Lambda Expressions

编写代码时,我尽量避免使用“魔术字符串”。

硬编码的 string 是代码异味,应该尽量避免使用。在使用 WCF DataServiceConfiguration 对象时,你必须将实体集的 string 名称传递给配置方法,正如我所写的那样,我希望避免这种情况。这就是为什么在今天的文章中,我将扩展 DataServiceConfiguration 对象以支持 lambda 表达式,而不是 string 参数。

数据服务配置扩展

我创建了一个简单的 static 类,其中包含两个新的扩展方法:SetEntitySetAccessRule<DataSource>SetEntitySetPageSize<DataSource>。这两个方法都扩展了 DataServiceConfiguration 对象,并添加了接收 lambda 表达式的功能,该表达式将保存实体集名称。以下是类的实现

public static class DataServiceConfigurationExtensions
{
  public static void SetEntitySetAccessRule<DataSource>(
    this DataServiceConfiguration config,
    Expression<Func<DataSource, object>> expression,
    EntitySetRights rights)
    where DataSource : class
  {      
    string entitySetName = GetEntitySetName(expression);
    config.SetEntitySetAccessRule(entitySetName, rights);
  }
 
  public static void SetEntitySetPageSize<DataSource>(
    this DataServiceConfiguration config,
    Expression<Func<DataSource, object>> expression,
    int pageSize)
    where DataSource : class
  {
    string entitySetName = GetEntitySetName(expression);
    config.SetEntitySetPageSize(entitySetName, pageSize);
  }
 
  private static string GetEntitySetName<DataSource>(
          Expression<Func<DataSource, object>> expression)
  {
    MemberExpression memberExpression = expression.Body as MemberExpression;
    if (memberExpression == null)
    {
      throw new ArgumentException("Must be a member expression");
    }
    return memberExpression.Member.Name;
  }
}

以下是如何在配置数据服务时使用此实现

public class SchoolDataService : DataService<SchoolEntities>
{     
  public static void InitializeService(DataServiceConfiguration config)
  {
    config.SetEntitySetAccessRule<SchoolEntities>(c => c.Courses, EntitySetRights.All);
    config.SetEntitySetPageSize<SchoolEntities>(c => c.Courses, 10);  
  
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
}

现在,如果实体集的名称发生更改,你将获得编译错误而不是运行时错误。此外,这种方式更不容易出错,并且更简洁。由于 InitializeService 方法仅被调用一次,因此对性能的影响可以忽略不计。

摘要

使用“魔术字符串”是一个坏习惯。在这篇文章中,我展示了一个简单的解决方案,用于在配置 WCF 数据服务时使用 lambda 扩展代替 string

© . All rights reserved.