使用领域事件是 DDD 应用程序广泛认可的实践,但有些场景对我来说很棘手。
我最近正在开发一个应用程序,其中业务逻辑要求在创建新用户时,该用户也在三个独立的子系统中创建。所以基本上如果你使用事务脚本方法,它看起来像:
public void CreateUser()
{
CreateUserInSystemA();
CreateUserInSystemB();
CreateUserInSystemC();
}
我正在研究的方法是使用域事件,所以入口点看起来像:
public void CreateUser()
{
CreateUserInSystemA();
}
然后CreateUserInSystemA
会在创建用户时引发域事件。然后该事件的处理程序将在系统 B 中创建用户,引发另一个域事件,然后另一个处理程序将运行,该处理程序将在系统 C 中创建用户。所有这些都是在注册 DI 容器期间设置的,因此这几乎是硬连线的。
所以问题是:
1)这种方法是否有效地隐藏了域逻辑?通过查看 CreateUser 方法来了解我们真正在做什么并不容易。
2)如果(就像我们的例子中发生的那样),您将有一个新的工作流程,您只需要在系统 A 和 B 中创建用户 - 因此CreateUserInSystemC
不应该调用?如果我们使用现有的CreateUserInSystemB
实现,它将引发域事件,并且硬连线CreateUserInSystemC
将无论如何运行。
以正确的 DDD 方式处理这种情况的最佳方法是什么?我们是否应该使用应用程序服务层并简单地为两个工作流公开两个单独的方法,而不是基于领域事件的流程?