我刚刚开始使用 .NET ORM,甚至还没有在 Entity Framework 和 NHibernate 之间做出决定。但在这两种情况下,我都遇到了一个问题,因为他们似乎希望我以各种方式损害域模型的完整性,特别是在 C# 对象设计的更精细的方面。这是有关该主题的几个问题之一。
我非常习惯使用如下所示的模式对适当的属性强制执行不变性:
public class Foo
{
private readonly string bar;
public string Bar { return this.bar; }
public Foo(string bar)
{
this.bar = bar;
}
}
NHibernate 或实体框架似乎不支持这一点。他们想要默认构造函数和public
设置器;看起来甚至private
setter(和默认构造函数)可以工作(有时?),因为 ORM 可以使用反射。
我想我可以通过使用来解决这些问题private
二传手和一个private
默认构造函数。至少公共 API 不会受到损害。只是我正在修改所有类的实现以添加未使用的private
建设者,并且必须相信他理解的未来多梅尼克private
在我的设置器上实际上意味着“除了在构造函数中之外不要调用我”。持久层正在泄漏到我的领域对象设计中。
它似乎也没有必要——为什么 ORM 不知道使用非默认构造函数?也许他们能够做到,但我只是没有找到合适的博客文章来解释如何做到这一点。
最后,在某些情况下我的不可变的值对象实际上很适合(不可变)值类型, i.e. struct
s。我的猜测是这是可能的,因为在数据库中,我的结构的字段将显示在存储父实体的同一行中。你能确认/否认吗?这篇博文 http://geekswithblogs.net/opiesblog/archive/2006/08/05/87218.aspx看起来很有希望,因为它给出了肯定的答案,但代码量(实际上特定于所讨论的值类型)令人震惊。
令人沮丧的是,经过几年的阅读,像这样的书有效的 C#或者像 Eric Lippert 这样的博客,它们就如何设计富有表现力和防弹的 C# 对象提供了很好的建议,但使用 ORM 的需要让我把很多知识抛到了九霄云外。我希望这里有人能够指出我错在哪里,无论是在我对他们能力的理解上,还是在我对领域建模和 ORM 的作用的思考上。