【问题标题】:Rules for accessing services from domain objects从域对象访问服务的规则
【发布时间】:2012-12-21 04:02:19
【问题描述】:

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

我有 3 种方法可以做到这一点:

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

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

  3. 在模型对象中注入服务

(4. 使用服务定位器)

第一个导致非常有表现力和重复性的模式,以程序风格创建领域事件和处理程序,以完成原本简单的任务。但它最好将模型与其使用的环境解耦(模型是自定义的)。

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

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

因为我想在我们的文档中写这个,我需要告诉读者什么时候使用哪种方法。我正在考虑“如果要将域事件处理程序放入模型程序集中,请使用方法注入”这一行,但它并没有真正切中要害。

对此规则的建议?

【问题讨论】:

    标签: nhibernate dependency-injection domain-driven-design castle-windsor ioc-container


    【解决方案1】:

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

    如果某个方法确实具有在构造函数中注入没有意义的依赖关系,请将其作为方法参数传递。我认为您不应该通过服务(但这取决于),直接传递所需的数据。

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

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

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

    【讨论】:

    • 非常好的答案(尤其是数据点值得注意)。我会制定规则:“使用域事件”。虽然我发现使用“领域概念”的服务非常程序化和重复,但这是一个问题最少的规则。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2020-02-20
    • 1970-01-01
    • 2011-02-11
    • 2011-08-17
    • 1970-01-01
    相关资源
    最近更新 更多