因此不可能切换到另一个ORM(不是我们想要的)。
好像错了 存储库模式的主要优点是隐藏了数据访问逻辑,并且可以轻松交换。
到目前为止,感觉好像我将业务逻辑放入域模型中,并通过存储库与ORM(无论选择哪种)一起使用。但是,如果我想继续在应用程序的ORM部分中使用MDA工具,则此处创建的模型将非常贫乏(即不包含任何业务逻辑)。同样,如果我将实体框架(.net)或NHibernate用于我的ORM,它也将是贫血模型。我不确定如果我刚刚使用NHibernate,您会将业务逻辑放在哪里。
贫血领域模型被许多人(例如Martin Fowler)认为是不良做法。您应该避免这样的设计,因为这样的模型会导致过程设计技巧,而不是好的面向对象设计。然后,您将拥有数据类和管理器/处理类,这意味着您将状态和行为分开了。但是,一个对象确实应该是“状态与行为”。
NHibernate在持久性无知方面做得很好。您可以使用XML或FluentNHibernate隐藏映射详细信息,而只需编写普通的POCO。使用NHibernate创建富域模型非常容易。我认为您也可以使用实体框架和MDA工具来做到这一点。只要此工具生成部分类,您就可以相当轻松地扩展生成的代码,而不必担心新一代可能会破坏用户编写的代码。
简而言之。当您使用NHibernate时,什么也没做,我什么也没重复,使您无法使用丰富的域模型。我建议将它与FluentNHibernate一起使用,并手动进行映射。映射代码只需要5到10分钟即可编写。我想对于实体框架也是如此,它的工具至少会创建易于扩展的部分类。
我是否以这种方式正确思考,换句话说,使用DDD使用域中的所有业务逻辑,而仅使用ORM通过存储库进行持久化?
在大多数情况下,您是正确的。您应该有一个丰富的域模型。尤其是当事情变得越来越复杂时,如果正确设计,它更易于维护和扩展。但是请记住,DDD还知道(域层和应用程序层)服务以实现业务逻辑,工厂也知道工厂以封装创建逻辑。
我也倾向于将业务逻辑分为领域逻辑和实际应用程序业务逻辑。域逻辑是域交互和行为的方式,而完全不同的应用逻辑封装了域如何用于特定用例/应用程序。通常,我不得不更新域模型以支持特定的用例并使其更强大。