【问题标题】:Returning Domain Objects From Web Service从 Web 服务返回域对象
【发布时间】:2014-05-07 16:08:32
【问题描述】:

这可能是一个哲学问题,但我想我会在这里问,因为我有点分析麻痹。

我目前正在开发一个基于浏览器的游戏(客户端 HTML/Javascript 和到达后端的 WCF Web 服务),并且我正在非常努力地拥有一个漂亮、丰富的域模型。

所以这是我的问题。我有一个班级叫 Squadron

public class Squadron
{
    public string SquadName { get; set; }
    public User Owner { get; set; }
    public int XPosition { get; set; }
    public int YPosition { get; set; }
    public int XTarget { get; set; }
    public int YTarget { get; set; }
}

中队归用户所有

public class User
{
    public string Username { get; set; }
    public string Password { get; set; }
    public string Email { get; set; }
    public int UserID { get; set; }
    public List<string> Roles { get; set; } 
}

我还有一个 Squadron 存储库,它根据它的 ID 返回一个完全填充的 Squadron 对象。我有一个应该返回中队的网络服务(基本上是 GetSquadron)。但是,附加的 User 对象有一些我可能不想暴露给任何客户端的信息(密码,作为一个明显的例子)。虽然看起来密码应该是这个域对象的一部分......它似乎不是我一直想要填充的东西。

我考虑添加另一层逻辑(在填充域对象之后),以确保调用用户可以访问某些字段,但我想知道我可以在社区中找到哪些最佳实践。我尝试了谷歌搜索,但运气不佳。

谢谢!

编辑:在任何人对它竖琴之前,密码已经过哈希处理。我从不在数据库中存储明文密码。我只是想我可能不应该返回密码,无论是否加密。

编辑 2 (Phillip):我已经填充了 User 对象,因为我确实需要客户端中的几个字段(用户名和用户 ID,可能还有电子邮件)。也许创建一些 DTO 是问题的答案。我想我认为在所有层都有一个通用模型会很好。

【问题讨论】:

  • 你总是可以只添加几个只读属性到中队,用户名,用户ID。

标签: c# wcf service dns repository


【解决方案1】:

我会考虑用 Owner (User) 属性替换 UserID 属性。我看不出有任何真正的理由需要 Squadron 中的整个 User 对象。但是,我不太了解您的设计或意图。即使用户密码是加密的,传递用户密码也是一种非常糟糕的做法。

如果您确实需要 Squadron 对象中的人员详细信息,我建议创建一个不包含用户密码的新人员视图模型。

【讨论】:

  • 嘿 PhillipPDX,感谢您的回复。我已经更新了最初的问题。
  • DTO 将是您的绝佳选择。我为我的公司开发了几个大型 Web 应用程序,并发现创建复合模型对于特定目的非常有用。它还有助于解决性能问题和非常大的数据集。
【解决方案2】:

我同意 PhillipPDX 关于不传递密码的观点,但我会犹豫使用 DTO 从 Web 服务传递数据。

如果我理解该技术正确,您将创建 DTO,序列化然后由 Web 服务返回的对象。典型的对象序列化往往会带来大量开销,并导致从服务返回大量数据,并且对象需要客户端上的 .Net 将数据反序列化回对象 (DTO)。

更现代的方法是使用类似 NewtonSoft 的 JSON 序列化程序将 POCO(Plain Ol' C# 对象)转换为 JSON 字符串,然后由 Web 服务返回。由于您的游戏是基于浏览器 / Javascript 的 JSON 非常适合此用例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 1970-01-01
    • 2011-01-22
    • 2014-06-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多