在this answer到recent question,我被建议
“警惕让你的域模型中的每个属性都有公共getter和setter。这可能会导致你贫血领域模型。“然而,我遇到了一个私有setter实体的问题,如:
public class Phrase { public int PhraseId { get; private set; } public string PhraseText { get; private set; } }
无法从View到控制器进行JSON序列化(使用ASP.NET MVC)。这是由于私人制定者。
您如何允许使用私人制定者进行序列化?
答案 0 :(得分:1)
您始终可以覆盖序列化或只编写自己的JSON反序列化方法。我个人认为这不值得。只需让setter公开并完成它。什么是私人的私人真正买你?
答案 1 :(得分:1)
我不知道你是否可以用MVC覆盖反序列化过程,但请注意DataContractSerializer
支持非公共访问器,并且有一个JSON版本:DataContractJsonSerializer
- 也许值得一看?
就个人而言,我只是接受这种情况下的公共设置器......这是.NET DTO和基于.NET的序列化的一个非常常见的特性。不可变/工厂模式虽然在java中很常见,但在.NET中并没有那么多。我不能说我过分思考。
答案 2 :(得分:1)
我是这个问题中引用的人。您可能会注意到我从未建议您使用私人制定者。如果你能提供帮助的话,我只是说不要把每一个都公之于众。
在您的情况下,我倾向于将它们打包为私有或内部,并将执行序列化的类放置到后端/为您的UI构建DTO /在同一个包或程序集中的任何内容。
不让每个私人成员公开获取和设置的原因是一个耦合问题,这是完全实用的。您的域模型需要与域概念相结合。如果这些概念由getter体现,那么使用它们。
将它们全部公开会让您将域对象耦合到对象的私有部分,这些部分可能会在域外发生变化。它还鼓励其他人提取此类信息,根据该数据做出决策,并重新设定价值,这是您正确关注的贫血领域。