避免贫血模型和允许序列化之间的冲突

在对最近一个问题的回答中,我被建议“谨防让你的领域模型中的每个属性都有公共的getter和setter,这可能导致你成为贫血的领域模型。” 然而,然后我遇到了这样一个问题:具有私有setter的实体,如下所示:

public class Phrase
{
    public int PhraseId { get; private set; }
    public string PhraseText { get; private set; }
}

不能从视图到控制器使用JSON序列化(使用ASP.NET MVC)。 这是由于私人二传手。

你将如何允许与私人定制者序列化?


我不知道是否可以用MVC覆盖反序列化过程,但请注意DataContractSerializer支持非公共访问器,并且存在JSON版本: DataContractJsonSerializer - 可能值得一看?

就我个人而言,在这种情况下,我只接受公共setter ...这是.NET DTO和基于.NET的序列化的一个非常常见的功能。 不变的/工厂模式虽然在java中很常见,但在.NET中并没有真正占用过多的空间; 我不能说我太在意了。


您始终可以重写序列化或只编写自己的JSON反序列化方法。 我个人认为这是不值得的。 只要让二传手公开并完成它。 什么是私人真正购买你的二传手?


我是这个问题中引用的那个。 您可能会注意到我从来没有建议您使用私人设置器。 我只是说,如果你能帮助它,就不要让每一个人都公开。

在你的情况下,我倾向于使它们成为包私有或内部的,并且将做序列化的类/将它们保存到后端/为相同包或程序集中的任何内容构建一个DTO。

不让每个私人成员公开获取和设置的原因都是一个耦合问题,而且是完全实用的。 您的域模型需要与域概念相结合。 如果这些概念由getter体现,那么就使用它们。

将它们全部公开会让你将域对象耦合到你的对象的私有部分,这些对象可能会在你的域之外进行更改。 它还鼓励其他人提取这些信息,根据这些数据做出决定,并重新设定值,这是您正确关注的领域贫血。

链接地址: http://www.djcxy.com/p/60439.html

上一篇: Conflict between avoiding anemic model and allowing serialization

下一篇: What does Html.HiddenFor do?