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

use*_*291 2 domain-driven-design

行情来自

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

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

b)

不是需要注入任何东西到你的域实体.

引入域事件的原因是我们不必将服务注入域实体.但是,由于将域服务 DS注入到实体中也不是很理想,在这种情况下处理程序(即它们的操作)不能是域概念(即不是将DS注入实体,处理程序会调用此DS)?

c)如果确实处理程序也可以将DS注入到域实体中,那么处理程序是否也可以替换DS本身?

d)

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

不要处理属于基础设施层?那些叫DS的处理程序怎么样?

更新:

一个)

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

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

b)只是为了确定 - 我的原始问题的回答是,在某些情况下,而不是实体调用DS,我们可以让处理程序调用适当的DS吗?

C)

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

那么c)的答案是,在某些情况下,处理程序确实可以取代DS?但如果是这样,我们不能争辩说在这种情况下,处理程序(即他们的行为)是域概念吗?

d)

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

一世.

处理程序实际上并不属于您的域,因为它们所做的就是委派适当的基础结构服务或域服务.

只是为了确定 - 我假设"委托"你的意思是代替实体调用适当的DS基础结构服务,我们将调用特定服务的工作委托给处理程序

II.

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

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

第二次更新:

D - II

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

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

a)那么在那些情况下,处理程序会违反SRP吗?

b)

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

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

2)假设动作 一个返回一个,我们如何决定是否是更好地执行一个通过注射(注意-我在这里使用的术语" 注射服务为实体 "两种传递服务构造器,或把它当作一个参数的方法)服务 小号(这反过来执行)转换为实体或使用域事件代替(这反过来会调用方法小号)?

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

eul*_*rfx 6

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

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

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

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

UPDATE

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

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

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

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

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

更新2

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

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

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

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

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