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

时间:2009-01-18 21:00:20

标签: c# json serialization

this answerrecent question,我被建议

“警惕让你的域模型中的每个属性都有公共getter和setter。这可能会导致你贫血领域模型。“
然而,我遇到了一个私有setter实体的问题,如:

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

无法从View到控制器进行JSON序列化(使用ASP.NET MVC)。这是由于私人制定者。

您如何允许使用私人制定者进行序列化?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

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

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

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