我正在比较从域模型使用服务(在Windsor IoC容器中的过程本地组件的意义上)的可能性。
我有3种方法可以达到这个目的:
发布域事件并使用服务层代码处理它
通过模型对象上的方法注入服务
在模型对象中注入服务
(4.使用服务定位器)
第一种导致一种非常富有表现力和重复性的模式,以程序化的方式创建域事件和处理程序,用于其他简单的任务。但它具有最佳的模型与其所使用的环境的解耦(模型是自定义的)。
第二个使方法参数更长并且看起来破坏了封装(如果模型对象的动作需要其他服务,则所有调用者都必须更改)。
第三个将注入当前Transaction所不需要的Dependencies。此外,还需要“扩展”NHibernate。由于其他建议,我会避免这种方法。
由于我想在我们的文档中写这个,我需要告诉读者何时使用哪种方法。我正在思考“使用方法注入,如果你将域事件处理程序放入模型程序集”这一行,但它并没有真正达到目的。
对此规则的建议?
答案 0 :(得分:8)
如果AR(聚合根)需要来自服务的某些数据,则应将该数据视为依赖(不是服务)。基本上,AR根本不会知道该服务。
如果某个方法确实具有在构造函数中注入没有意义的depednency,则将其作为方法参数传递。我不认为你应该通过服务(但这取决于),直接传递所需的数据。
如果AR做了一些需要服务来更新内容的东西,我认为消息驱动是要走的路(生成一个事件)。
关于NHibernate或其他细节,AR不需要了解它们。如果它不是域概念,请远离AR。
就个人而言,我尝试对AR进行建模,以便它不需要服务。在场景中涉及多个AR,我将使用具有可靠服务总线的域事件。这意味着任何db事务都是不可能的。我将交易内容保留在AR中,更确切地说是在AR存储库中,以保证最终的一致性。