我有一个多层系统,其中所有业务逻辑都可通过WCF服务获得。
现在考虑以下情况:
如何从服务上的实体中删除不必要的信息,并使我的表示层不知道服务不想返回的那些实体字段?实现这一目标的最佳做法是什么?
我想,我应该使用DTO(数据传输对象),但显然我无法严格定义它们,因为我不知道哪个用户可以访问每个字段,直到安全层(或其他一些字段过滤系统)启动。
答案 0 :(得分:1)
虽然我不能说这是“最佳做法”,但这至少是罗克福德洛特卡在Expert C# 2008 Business Objects中采用的一种方法。
您可以让所有域实体最终派生自某个基类。该基类可以有这样的方法:
public virtual bool CanReadProperty(string propertyName) { ... }
在允许用户查看(或设置)之前,每个属性都可以调用该方法。为了获得更好的性能,该基类可以缓存授权角色,因此检查不是一项昂贵的操作。而且,当然现在我们有表达式树,CanReadProperty()
可以采用表达式,以便它是强类型的。
属性的示例如下所示:
public string Name
{
get
{
if (!CanReadProperty("Name")) { return string.Empty; } // or return null, whatever...
return _name;
}
}
这种方法的好处是,对于查看这些属性可能会发生变化的各种情况,您不需要许多不同的DTO。