从Web服务返回域对象

本文关键字:对象 返回 服务 Web | 更新日期: 2023-09-27 18:02:07

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

我目前正在一个基于浏览器的游戏(客户端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; } 
}

我还有一个中队存储库,它返回一个完全填充的中队对象,基于它的ID。我有一个web服务(基本上,GetSquadron),应该返回中队。但是,附加的User对象有一些我可能不希望暴露给任何客户机的信息(密码,作为一个明显的例子)。虽然看起来Password应该是这个Domain对象的一部分…我不太希望有人住在这里。

我考虑过添加另一层逻辑(在填充Domain对象之后),以确保调用用户可以访问某些字段,但我想知道我可以在社区中找到什么最佳实践。我试着用谷歌搜了一下,但没怎么找到。

谢谢!

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

EDIT 2 (Phillip):我已经填充了User对象,因为我确实需要客户端(Username和UserID,可能还有Email)中的几个字段。也许创建一些DTO是解决问题的办法。我想我认为在所有的图层中有一个通用的模型会很好。

从Web服务返回域对象

我会考虑用Owner (User)属性代替UserID属性。我看不出有什么真正的理由让你在《Squadron》中需要整个User对象。但是,我不太了解你的设计和意图。传递用户密码也是一种非常糟糕的做法,即使它是加密的。

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

我同意PhillipPDX关于不传递密码的观点,但我对使用dto从web服务传递数据持犹豫态度。

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

更现代的方法是使用NewtonSoft的JSON序列化器将POCO (Plain Ol’c# Object)转换为JSON字符串,然后由web服务返回。因为你的游戏是基于浏览器/Javascript的,所以JSON很适合这个用例。