使用 Lambda 表达式配置 WCF Data Services
一种简单的方法,
编写代码时,我尽量避免使用“魔术字符串”。
硬编码的 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
。