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