域事件是否也会将域服务注入实体?

时间:2013-02-13 18:20:43

标签: domain-driven-design

报价为from

注意 - 这里我使用术语" 将服务注入实体"将服务传递给构造函数或将其作为参数传递给方法

a)处理程序域操作触发的操作/操作之间的区别是什么,但是在本身?也许不同之处在于前者(即处理程序,或者更确切地说,他们的操作)不代表域概念,而后者代表域概念

b)

  

需要向你的域实体注入任何东西。

引入域事件的原因是我们不必将服务注入域实体。但是,由于将域服务 DS 注入实体也不是很理想,因此在这种情况下无法处理程序(即他们的行动)是域概念(即不是将 DS 注入实体处理程序会调用此 DS )?

c)如果处理程序确实也可以替换 DS 注入域实体,是否还存在处理程序的情况>可以取代 DS 本身吗?

d)

  

处理程序类不属于域模型。

处理程序是否属于基础架构层?那些调用 DS

处理程序呢?

更新

A)

  

中心区别在于之后调用域事件处理程序   事实。

但是操作/操作 A (我们在中处理的那个而不是处理程序中的那个 )操作触发 OP 也可能在事后发生(即 OP 完成后)。所以我们不能认为这些两种类型的操作之间的主要区别在于 A 表示域概念,而执行的操作处理程序代表域概念

b)只是为了确定 - 我的原始问题的回答是,在某些情况下,而不是实体调用 DS ,我们可以拥有处理程序< / em>拨打适当的 DS

c)中

  

在以下情况下,域事件可以消除对域服务的需求   上述

回答 c),在某些情况下处理程序确实可以取代 DS ?但如果是这样,我们不能说在这种情况下处理程序(即他们的操作)是域概念

d)

  

处理程序并非真正属于您的域名,因为他们所做的一切都是   委派适当的基础结构服务或域服务。   它们只是一种粘合剂,类似于应用程序服务。他们   仍然可以在域项目中声明,但通常他们不会   需要。

  

处理程序并非真正属于您的域名,因为他们所做的一切都是   委派适当的基础设施服务或域名服务。

只是为了确定 - 我假设&#34;委托给&#34;您的意思是代替实体调用相应的 DS 基础结构服务,我们委托调用特定服务的工作处理程序

II。

  

它们仍然可以在域项目中声明,但通常是它们   不需要。

正如您在 c)中所述,在某些情况下,处理程序可以替换 DS 本身(即他们不会调用 DS ,但实际上是自行执行所需的操作。在这种情况下,我们不能认为处理程序域概念,因此属于域层?!

第二次更新:

D - II

  
    

正如您在c)中所述,在某些情况下,处理程序可以替换DS本身(     即他们不会拨打DS,但实际上他们会执行所需的操作     通过他们自己 )。在这种情况下,我们不能认为处理程序是     域概念因此属于域层?!

  
     

在这些情况下,我会说处理程序有两个责任 -   连接事件和执行操作的连接。接线   部分不是域概念,但操作本身就是。

a)那么在那些情况下 handler 会违反SRP吗?

b)

  

接线部分不是域概念,而是操作本身   是

在这种情况下处理程序应该放入域层吗?

2) 假设操作 A 返回,我们如何决定执行 A 是否更好注入(注意 - 这里我使用术语&#34; 将服务注入实体&#34;用于传递服务 to constructor 或将其作为参数传递给方法 service S (后者执行< strong> A )进入实体或使用域事件代替 S )?

也许决定取决于某些域代码是否需要 A 的结果才能进行进一步的处理

1 个答案:

答案 0 :(得分:6)

a)中心区别在于事件后调用域事件处理程序。该事件已经发生并且是不可变的。因此,处理只能做出响应已经发生的事情的事情。此外,处理程序可能导致不属于源实体职责的行为,例如发送电子邮件。

b)域事件是确保更大程度的封装和解耦的模式。例如,可以通过几种方式实现在某些操作之后发送电子邮件的事实。一种方法是将电子邮件服务传递给实体。然后,实体将在需要时调用电子邮件服务。另一种方法是让调用应用程序服务调用电子邮件服务。第一种方法的问题是现在该实体与电子邮件服务耦合并违反了SRP - 该域现在处理技术问题。第二种方法的问题在于它负责知道何时在应用程序服务上发送电子邮件。域事件解决了这两个问题,因为现在实体决定事件何时发生,处理程序决定如何处理事件。

c)在上述情况下,域事件可以消除对域服务的需求,但是在所有情况下它们都不会消除对域服务的需求。在某些情况下,实体可能需要域服务才能首先调用行为。这是域事件无法帮助的地方,因为它们只能解决事后情况。

d)处理程序实际上并不属于您的域,因为它们只是委托给相应的基础结构服务或域服务。它们只是一种粘合剂,类似于应用程序服务。它们仍然可以在域项目中声明,但通常它们不需要。

<强>更新

a)情况并非总是如此。域事件处理程序可以调用另一个域操作。这是在单个进程中执行事件驱动架构的一种方式。

b)是的,域事件处理程序可以调用域服务。让处理程序调用域服务以响应事件是一种以分离方式向实体添加行为的方式 - observer pattern的一种形式。

c)通常,处理程序会委托某些东西来执行域操作。处理程序本身只是粘合剂。但是,您可以将域逻辑放入处理程序中,在这种情况下,它将像域服务一样运行。

d1)是的。处理程序将是一个简单的类,对某些服务具有构造函数依赖性。当它处理事件时,它会在所述服务上调用适当的方法。

d2)在这些情况下,我会说处理程序有两个职责 - 连接事件和执行操作。接线部分不是域概念,但操作本身就是。

更新2

a)是的我会这么说。根据域事件的实现方式,处理程序可能只是一个lambda - 它不需要是一个类。

b)如果处理程序委托给域服务,那么它可以进入域层。如果它使用基础设施服务,则可能需要进入基础设施层。另外,如a)中所述,处理程序不需要是类,它可以是lambda。

2)域事件是在域中发生的值得注意的事情。使用域事件,您可以在其中设想订阅者对该事件感兴趣。此事件可用于调用域中的其他行为或在外部发布。主要观察结果是,它是过去时的不可变事件。

  

也许决定取决于某些域代码是否需要   A的结果是否需要进一步处理?

这是事实。如果域操作需要域服务S的结果以继续执行其行为,则应将该服务传递给该行为方法。实体无法接收已发布域事件的处理结果。