【发布时间】:2011-07-18 21:13:18
【问题描述】:
我刚刚开始使用 .NET ORM,甚至还没有在 Entity Framework 和 NHibernate 之间做出决定。但是在这两种情况下,我都遇到了一个问题,他们似乎希望我以各种方式损害我的域模型的完整性,尤其是在 C# 对象设计的更精细点上。这是有关该主题的几个问题之一。
有a reason virtual is not the default for methods in C#。我的领域模型中的对象不准备对子类的行为做出承诺,除非在非常特殊的情况下我将它们标记为此类。换句话说,对于我的域对象上的极少数方法,为未指定的新功能添加挂钩是合适的。
然而 NHibernate 想要我制作所有东西 virtual,而 Entity Framework 想要我制作所有实体引用 virtual。我意识到他们为什么需要它(创建代理对象),并且我意识到这实际上是对继承的合法使用,virtual---他们实际上正在连接到我的属性以添加新的功能。但令我感到恼火的是,我必须用完全与持久性有关的东西来注释我的域模型类,而不是表达它们与实现者和消费者的实际合同。
作为一个较小的问题,我意识到我可能无能为力,通常用 sealed for all the usual reasons 注释我的类很有表现力。不过,这有点不那么令人讨厌,因为为了持久性而从我的域对象中省略注释似乎没有添加注释那么糟糕。
令人沮丧的是,在阅读了诸如 Effective C# 之类的书籍或 Eric Lippert 之类的博客(它们为如何设计富有表现力和防弹的 C# 对象提供了很好的建议)之后,使用 ORM 的必要性是令人沮丧的。让我把很多知识扔出窗外。我希望这里的人能指出我错在哪里,无论是在我对他们能力的掌握中,还是在我对领域建模和 ORM 角色的思考中。
【问题讨论】:
-
我以完全相反的方式查看代码——我希望
virtual是默认值(用于方法),我可以计算我手指上有sealed类的次数:如果您继承并破坏某些东西,那是您的错 :-) 我遇到了太多不灵活的代码(来自其他库),我无法很好地使用并且无法更改。 -
我对虚拟的使用有着完全相反的信念——尽可能多地使用它,除非你定义了一些必须保持原样的东西。此外,我不会相信任何来自 MS 的人为默认不使用虚拟方法的决定辩护。您可以简单地浏览来自 MS 提供的不同 .NET API 的代码,包括 ASP.NET、EF、WCF、WF 等。您会发现,它们提供的不是正确的设计和可扩展架构,而是由密封的内部隐藏的有限或没有可扩展性,非虚拟和静态特征。顺便说一句。虚拟框架通常需要模拟框架。
-
@Ladislav:但是...我有一个新的未开发项目!我内心的纯粹主义者想出来嬉戏;他厌倦了被棕地问题推到一边;)
-
@Domenic:我完全同意。我也厌倦了我必须在工作中做的开发,但你应该明白,持久性框架在背后提供了一些魔力,但它们需要钩子才能执行这种魔力。这就是妥协。
-
@pst:“如果你继承并破坏了你的错”的另一种观点是“如果你在你的超类中引入了一个安全漏洞,一个敌对的子类可以用来攻击你的用户,那是编写超类的人的错”。
标签: .net nhibernate entity-framework orm class-design