Domain driven design 域驱动设计中的域事件是否隐藏了意图?

Domain driven design 域驱动设计中的域事件是否隐藏了意图?,domain-driven-design,Domain Driven Design,对于DDD应用程序,使用域事件是广泛认可的做法,但有一些场景对我来说很棘手 我最近正在开发一个应用程序,其中业务逻辑要求在创建新用户时,该用户也在三个独立的子系统中创建。因此,基本上,如果使用事务脚本方法,它将类似于: public void CreateUser() { CreateUserInSystemA(); CreateUserInSystemB(); CreateUserInSystemC(); } public void CreateUser() {

对于DDD应用程序,使用域事件是广泛认可的做法,但有一些场景对我来说很棘手

我最近正在开发一个应用程序,其中业务逻辑要求在创建新用户时,该用户也在三个独立的子系统中创建。因此,基本上,如果使用事务脚本方法,它将类似于:

public void CreateUser()
{
    CreateUserInSystemA();
    CreateUserInSystemB();
    CreateUserInSystemC();
}
public void CreateUser()
{
    CreateUserInSystemA();
}
我所看到的方法是使用域事件,因此入口点看起来像:

public void CreateUser()
{
    CreateUserInSystemA();
    CreateUserInSystemB();
    CreateUserInSystemC();
}
public void CreateUser()
{
    CreateUserInSystemA();
}
然后,
CreateUserInSystemA
将在创建用户时引发域事件。然后,该事件的处理程序将在系统B中创建用户,引发另一个域事件,并运行另一个将在系统C中创建用户的处理程序。 所有这些都是在DI容器注册期间设置的,所以这几乎是硬连线的

因此,问题是:

1) 这种方法不是有效地隐藏了域逻辑吗?通过查看CreateUser方法来了解我们真正在做什么并不容易

2) 如果(在我们的案例中)您将有一个新的工作流,您只需要在系统a和B中创建用户,那么不应该调用
createUserInSystemEMC
?如果我们使用现有的
CreateUserInSystemB
实现,它将引发域事件,硬连线
CreateUserInSystemC
将无论如何运行


以适当的DDD方式处理此场景的最佳方法是什么?我们是否应该使用应用程序服务层,并简单地为两个工作流公开两个独立的方法,而不将流程基于域事件?

对我来说,域本身就是一个子系统。在您的例子中,您有几个相互连接的系统。在这种情况下,您的事件是系统间事件,而不是域事件

因此,根据子系统之间的关系触发事件。从每个域(子系统)的角度来看,其他子系统都是集成层,可能内部有自己的域模型

因此,您的问题的答案是:

1) 不,因为该方法与系统集成完全相关

2) 流更改需要更改集成行为,而不是子系统


还有一点:我所说的子系统与服务类似。每个域都有一个与其交互的服务。服务通常通过交互连接(具有多个服务的SOA系统就是一个实现示例)。另外,每个域也可以是一个服务,可能通过服务层公开。

对我来说,域本身就是一个子系统。在您的例子中,您有几个相互连接的系统。在这种情况下,您的事件是系统间事件,而不是域事件

因此,根据子系统之间的关系触发事件。从每个域(子系统)的角度来看,其他子系统都是集成层,可能内部有自己的域模型

因此,您的问题的答案是:

1) 不,因为该方法与系统集成完全相关

2) 流更改需要更改集成行为,而不是子系统

还有一点:我所说的子系统与服务类似。每个域都有一个与其交互的服务。服务通常通过交互连接(具有多个服务的SOA系统就是一个实现示例)。另外,每个域也可以是一个服务,可能通过服务层公开