C# 从Web服务返回域对象

C# 从Web服务返回域对象,c#,wcf,service,dns,repository,C#,Wcf,Service,Dns,Repository,这可能是一个哲学问题,但我想我应该在这里问它,因为我有点分析瘫痪 我目前正在开发一款基于浏览器的游戏(客户端HTML/Javascript和WCF Web服务以到达后端),我正在努力创建一个好的、丰富的域模型 这是我的问题。我有一个班叫中队 public class Squadron { public string SquadName { get; set; } public User Owner { get; set; } public int XPosition {

这可能是一个哲学问题,但我想我应该在这里问它,因为我有点分析瘫痪

我目前正在开发一款基于浏览器的游戏(客户端HTML/Javascript和WCF Web服务以到达后端),我正在努力创建一个好的、丰富的域模型

这是我的问题。我有一个班叫中队

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; } 
}
公共类用户
{
公共字符串用户名{get;set;}
公共字符串密码{get;set;}
公共字符串电子邮件{get;set;}
public int UserID{get;set;}
公共列表角色{get;set;}
}
我还有一个中队存储库,它根据中队对象的ID返回一个完全填充的中队对象。我有一个Web服务(基本上是GetSquandon),它应该返回中队。然而,附加的用户对象有一些我可能不想向任何客户机公开的信息(密码,作为一个明显的例子)。虽然看起来密码应该是这个域对象的一部分…但它似乎不是我一直想要填充的东西

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

谢谢

编辑:在任何人竖琴之前,密码是散列的。我从不在数据库中存储明文密码。我只是想我可能不应该返回密码,不管是否加密


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

< P>我会考虑用所有者(用户)属性替换USEID属性。我看不出任何真正的理由,你需要整个用户对象在中队。然而,我不太了解你的设计或意图。即使是加密的,传递用户密码也是一种非常糟糕的做法


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

< P>我会考虑将所有者(用户)属性替换为USEID属性。我看不出任何真正的理由,你需要整个用户对象在中队。然而,我不太了解你的设计或意图。即使是加密的,传递用户密码也是一种非常糟糕的做法


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

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

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


更现代的方法是使用NewtonSoft的JSON序列化程序将POCO(普通的Ol'C#对象)转换为JSON字符串,然后由web服务返回。因为您的游戏是基于浏览器/Javascript的,所以JSON自然适合这个用例

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

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


更现代的方法是使用NewtonSoft的JSON序列化程序将POCO(普通的Ol'C#对象)转换为JSON字符串,然后由web服务返回。因为您的游戏是基于浏览器/Javascript的,所以JSON自然适合这个用例

嘿PhillipPDX,谢谢你的回复。我已经更新了初始问题。DTOs将是您的最佳选择。我为我的公司开发了几个大型网络应用程序,发现创建复合模型对于特定目的非常有用。它对解决性能问题和超大数据集也有很大帮助。我已经更新了初始问题。DTOs将是您的最佳选择。我为我的公司开发了几个大型网络应用程序,发现创建复合模型对于特定目的非常有用。它还可以极大地帮助解决性能问题和非常大的数据集。您可以始终只向中队添加两个只读属性,即用户名和用户ID。您可以始终只向中队添加两个只读属性,即用户名和用户ID。