特别是跨两个系统:系统 A 的域可以调用系统 B 的应用程序服务/远程门面吗?
例如,如果 Ordering System 在其域中有 Order 实体,该 Order 实体的验证方法是否应该调用 Stock Keeping Service 的应用程序服务来检查是否有足够的产品来完成订单?
我的直觉是,这不是正确的做事方式。
这是以前的一个相当复杂的问题的简化版本: 集成各种领域驱动设计系统之间的集成 这不是必要的,也不建议您参考上一个问题。
特别是跨两个系统:系统 A 的域可以调用系统 B 的应用程序服务/远程门面吗?
例如,如果 Ordering System 在其域中有 Order 实体,该 Order 实体的验证方法是否应该调用 Stock Keeping Service 的应用程序服务来检查是否有足够的产品来完成订单?
我的直觉是,这不是正确的做事方式。
这是以前的一个相当复杂的问题的简化版本: 集成各种领域驱动设计系统之间的集成 这不是必要的,也不建议您参考上一个问题。
首先,考虑您的架构是值得的。为什么你的域逻辑必须直接连接到另一个域?不能消费其他域发布的数据吗?如果不是,我们真的是在谈论两个不相交的域,还是它们真的是同一个有界上下文的一部分?
可能是另一个系统是封闭的,因此您无法扩展它。也可能是其他系统没有根据事件发布数据,你只能通过API访问。在这种情况下,最好在您的域模型中使用代理。也就是说,您的域逻辑应该包含一个代理(代理),它连接到远程系统,但就像它是本地的一样。这甚至封装了实际逻辑/数据不是本地的事实。
在我看来,有很多方法可以克服这样的问题。首先,为什么你的领域模型需要访问其他领域模型?
a) 用于制作更复杂的领域模型 ==> 这个领域模型可以作为服务层的用户来制作 ViewModel。==> 这个 viewModel 将返回给客户端。
在这种情况下,组装应该参与您的服务层,而不是域层。换句话说,向您的领域模型和相邻服务发送一些请求,从中获取结果,将它们组合到特定的 ViewModel 中,最后将结果返回给客户端。
b) 你的领域模型负责检查一些业务规则。假设其中一些将在其他系统中进行检查,因此您决定访问域模型中的相邻系统。
考虑到您的域模型的责任——属于你的系统——正是检查关于你的系统的一些规则,而不是它边界之外的任何东西。我的意思是,您的域模型不应访问其他系统域。它使这些系统之间产生了一些依赖性。这不是基于面向服务架构的好方法。这与松散耦合设计背道而驰。相反,您应该在服务层中的这些系统之间进行编排。服务层向不同的系统发送一些请求并从它们那里得到一些响应。现在将根据整体结果做出最终决定。