Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 避免贫血模型和允许序列化之间的冲突_C#_Json_Serialization - Fatal编程技术网

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

C# 避免贫血模型和允许序列化之间的冲突,c#,json,serialization,C#,Json,Serialization,在一篇文章中,我被建议“小心让你的域模型中的每个属性都有公共的getter和setter。这会导致你的域模型贫血。” 但是,我随后遇到一个问题,即具有私有setter的实体,如下所示: public class Phrase { public int PhraseId { get; private set; } public string PhraseText { get; private set; } } 公共类短语 { public int PhraseId{get;priv

在一篇文章中,我被建议“小心让你的域模型中的每个属性都有公共的getter和setter。这会导致你的域模型贫血。” 但是,我随后遇到一个问题,即具有私有setter的实体,如下所示:

public class Phrase { public int PhraseId { get; private set; } public string PhraseText { get; private set; } } 公共类短语 { public int PhraseId{get;private set;} 公共字符串短语文本{get;private set;} } 无法将JSON从视图序列化到控制器(使用ASP.NET MVC)。这是由于私人setter造成的


如何允许使用私有setter进行序列化?

您可以随时重写序列化,或者只编写自己的JSON反序列化方法。我个人认为这不值得努力。只要把二传者公之于众就行了。setter私有化真正为您带来了什么?

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


但就我个人而言,在这种情况下,我会接受公众的意见。。。这是.NET DTO和基于.NET的序列化的一个非常常见的特性。不可变/工厂模式虽然在java中很常见,但在.NET中却没有得到那么多的支持;我不能说我太在意了。

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

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

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


将它们全部公开会使您将域对象耦合到对象的私有部分,这些私有部分可能在域之外发生更改。它还鼓励其他人提取此类信息,根据这些数据做出决策,并将值设置回原来的值,这是您应该关心的领域。

谢谢您的想法。我同意。这也许只能买到一些学术上的满足感。。。