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

标签 c# wcf serialization dynamic data-transfer-objects

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

现在考虑以下场景:

  1. 用户打开我的 Web 应用程序 (ASP.NET MVC 4) 并从 WCF 服务请求一些实体
  2. WCF 服务从数据库中读取实体(使用 NHibernate)
  3. 实体通过安全层,我们发现用户不应该看到该实体的某些特定字段
  4. 表示层(无关紧要,它是什么 - Web 应用程序、移动应用程序)通常不应该知道用户的安全权限。表示层只是获取它从服务接收到的每个字段并进行呈现。

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

我想,我应该使用 DTO(数据传输对象),但显然我不能严格定义它们,因为在安全层(或其他字段过滤系统)启动之前我不知道哪个用户可以访问每个字段。

最佳答案

虽然我不能说这是“最佳实践”,但这至少是一种方法,由 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;
    }
}

这种方法的好处是,对于这些属性的 View 可能发生变化的各种情况,您不需要许多不同的 DTO。

关于c# - 从 WCF 服务返回实体时从实体中剥离字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14172192/

相关文章:

C#:如何将 winforms 按钮的文本绑定(bind)到资源

c# - 为什么我错误地使用了 KnownType 属性?

java - 如何序列化protobuf中的反向关系

c# - 将 CopyFileEx 转换为任务模式

c# - 在多个显示器上使用 SetWindowPos

c# 使用不支持的 html 敏捷包 URI 格式

java - 从 JsonObject 获取正确的数据

silverlight - 对* .svc的HTTP请求已超过分配的超时。分配给该操作的时间可能是较长超时的一部分。

wcf - 如何处理低级 WCF 错误?

java - 使用 ObjectMapper 反序列化具有相同属性但不同类名的多个对象