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

this answerrecent question,我被告知

“要小心,让你的域模型中的每个属性都有公共的getter和setter . 这可能会导致你陷入贫血的域模型 . ”
然而,我遇到了一个私有setter实体的问题,如下所示:

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

不能从View到控制器(使用ASP.NET MVC)进行JSON序列化 . 这是由私人二传手 .

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

回答(3)

2 years ago

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

但就个人而言,我只是接受了这种情况下的公共设置器......这是.NET DTO和基于.NET的序列化的一个非常常见的特性 . 不可变/工厂模式虽然在java中很常见,但在.NET中并没有那么多 . 我不能说我过分谨慎 .

2 years ago

您始终可以覆盖序列化或只编写自己的JSON反序列化方法 . 我个人认为这不值得 . 只需让setter公开并完成它 . 什么是私人的私人真正买你?

2 years ago

我是这个问题中引用的人 . 您可能会注意到我从未建议您使用私人制定者 . 如果你能提供帮助的话,我只是说不要把每一个都公之于众 .

在您的情况下,我倾向于将它们打包为私有或内部,并将执行序列化的类放置到后端/为您的UI构建DTO /在同一个包或程序集中的任何内容 .

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

将它们全部公开会使您将域对象耦合到对象的私有部分,这些部分可能会在域外发生变化 . 它还鼓励其他人提取此类信息,根据该数据做出决策,并重新设定值,这是您正确关注的领域贫血症 .