这可能是一个哲学问题,但我想我会在这里提出这个问题,因为我的分析瘫痪了。
我目前正在开发基于浏览器的游戏(客户端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; }
}
Squadron由用户拥有
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对象。我有一个Web服务(基本上是GetSquadron)应该返回Squadron。但是,附加的User对象有一些我可能不想暴露给任何客户端的信息(密码,作为一个明显的例子)。虽然看起来Password应该是这个Domain对象的一部分......但它似乎并不像我总是想要填充的东西。
我考虑添加另一层逻辑(在填充Domain对象之后),这将确保调用用户可以访问某些字段,但我想知道我可以在社区中找到哪些最佳实践。我试过谷歌搜索,但我没有多少运气。
谢谢!
编辑:在任何人使用它之前,密码是经过哈希处理的。我从不在数据库中存储明文密码。我只是认为我可能不应该返回密码,加密或不加密。
EDIT 2(Phillip):我已经填充了User对象,因为我确实需要在客户端放下一些这些字段(Username和UserID,可能还有Email)。也许创建一些DTO可以解决问题。我想我觉得在所有图层中都有一个共同的模型很好。
答案 0 :(得分:2)
我会考虑用Owner(User)属性替换UserID属性。我没有看到你在Squadron中需要整个User对象的任何真正原因。但是,我并不了解你的设计或意图。即使用户密码被加密,传递用户密码也是一种非常糟糕的做法。
如果你确实需要Squadron对象中的Person详细信息,我建议创建一个不包含用户密码的新Person视图模型。
答案 1 :(得分:2)
我同意PhillipPDX关于不传递密码,但我会犹豫是否使用DTO从Web服务传递数据。
如果我理解该技术是正确的,您将创建DTO,序列化该对象,然后由Web服务返回。典型的对象序列化往往会带来大量开销,导致从服务返回大量数据,以及需要客户端上的.Net将数据反序列化为对象(DTO)的对象。
更现代的方法是使用类似NewtonSoft的JSON Serializer之类的东西将POCO(Plain Ol&#39; C#Object)转换为JSON字符串,然后由Web服务返回。由于您的游戏是基于浏览器/ Javascript的JSON,因此非常适合此用例。