从WCF服务返回实体时从实体中剥离字段

本文关键字:实体 剥离 字段 返回 WCF 服务 | 更新日期: 2023-09-27 17:50:43

我有一个多层系统,其中所有的业务逻辑都可以通过WCF服务获得。

现在考虑以下场景:

  1. 用户打开我的web应用程序(ASP。. NET MVC 4)并从WCF服务
  2. 请求一些实体
  3. WCF服务从数据库读取实体(使用NHibernate)
  4. 实体经过一个安全层,我们发现用户不应该看到这个实体的某些字段
  5. 表示层(无所谓,它是什么- Web应用程序,移动应用程序)一般不应该知道用户的安全权限。表示层只是获取它从服务接收到的每个字段并渲染它。

我如何从服务上的实体中剥离不必要的信息,并使我的表示层不知道服务不想返回的实体字段?实现这一目标的最佳实践是什么?

我想,我应该使用dto(数据传输对象),但显然我不能严格定义它们,因为我不知道哪个用户可以访问每个字段,直到安全层(或一些其他字段过滤系统)开始。

从WCF服务返回实体时从实体中剥离字段

虽然我不能说这是"最佳实践",但这至少是Rockford Lhotka在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。