Nhibernate 从域对象访问服务的规则

Nhibernate 从域对象访问服务的规则,nhibernate,dependency-injection,domain-driven-design,castle-windsor,ioc-container,Nhibernate,Dependency Injection,Domain Driven Design,Castle Windsor,Ioc Container,我正在比较从域模型使用服务的可能性(从进程本地组件的意义上来说,如Windsor IoC容器中的组件) 我有3种方法来实现这一点: 发布域事件并让服务层代码处理它 通过模型对象上的方法注入服务 在模型对象中注入服务 (4.使用服务定位器) 第一种是非常有表现力和重复性的模式,为其他简单的任务创建过程式的域事件和处理程序。但它最好地将模型与所使用的环境解耦(模型是自定义的) 第二种方法使方法参数变长,并且看起来它破坏了封装(如果模型对象的操作需要其他服务,则所有调用方都必须更改) 第三个将注入当前

我正在比较从域模型使用服务的可能性(从进程本地组件的意义上来说,如Windsor IoC容器中的组件)

我有3种方法来实现这一点:

  • 发布域事件并让服务层代码处理它

  • 通过模型对象上的方法注入服务

  • 在模型对象中注入服务

  • (4.使用服务定位器)

    第一种是非常有表现力和重复性的模式,为其他简单的任务创建过程式的域事件和处理程序。但它最好地将模型与所使用的环境解耦(模型是自定义的)

    第二种方法使方法参数变长,并且看起来它破坏了封装(如果模型对象的操作需要其他服务,则所有调用方都必须更改)

    第三个将注入当前事务不需要的依赖项。还需要为此“扩展”NHibernate。由于阅读了其他建议,我将避免使用这种方法

    当我想在我们的文档中写这篇文章时,我需要告诉读者何时使用哪种方法。我一直在想“如果你想把域事件处理程序放到模型程序集中,就使用方法注入”,但这并没有真正说到点子上

    此规则的建议?

    如果AR(聚合根目录)需要来自服务的某些数据,则应将该数据视为依赖项(而不是服务)。基本上,AR根本不知道这项服务

    如果某个方法确实具有依赖性,而将其注入构造函数没有意义,请将其作为方法参数传递。我认为您不应该通过服务(但这要视情况而定),直接传递所需的数据

    如果AR做了一些需要服务来更新内容的事情,我认为消息驱动是最好的选择(生成事件)

    关于NHibernate或其他细节,AR不需要知道。如果它不是域概念,请将其远离AR

    就我个人而言,我尝试对AR建模,这样它就不需要服务了。如果场景中涉及多个AR,我将使用域事件和可靠的服务总线。这意味着任何db事务都是不可能的。我只将事务性内容保存在AR中,更确切地说,保存在AR存储库中,其他所有内容最终都会保持一致性。

    回答得很好(特别是数据方面)。我将制定规则:“使用域事件”。虽然我发现使用“域概念”服务非常程序化和重复性,但这是一条问题最少的规则。