domain-driven-design - 上下文映射 - 关系

标签 domain-driven-design microservices bounded-contexts

2 个限界上下文可以在它们之间进行上游通信是否被认为是一个坏主意?

例如,订单 BC 将发布事件,库存 BC 将订阅该事件,同时库存 BC 可以发布事件,订单 BC 将订阅

最佳答案

不,这不是一个坏主意,事实上这是一个好主意,让我解释一下。

首先考虑你的限界上下文,实际上他们应该对彼此一无所知,即使多个 Contexts正在共同努力创建一个完整的解决方案,所有上下文knows about 是其自身,它的OWN 关注点。

采取 OnboardingContext负责新员工何时开始在公司工作,这里是Employee实体是第一次添加到系统中。此处员工有姓名、电话号码、开始日期、地址、婚姻状况等。

考虑 PayrollContext , 它也有一个 Employee实体,但这里所有的实体都有一个 Id、一个薪水、开始日期和结束日期 - 在这里它不关心地址或婚姻状况,它甚至不一定关心名字,因为 这个上下文名称并不重要,重要的是工资、开始日期和结束日期。

因此,如果这两个上下文不应该相互了解,但可能关心与两者相关的一些信息,那么我们如何获得新的 Employee 的事实?已经开始并且需要得到报酬?

领域事件

域事件用于分布式系统。该模型当然会变得更复杂,但也更具可扩展性。域事件用于 event driven architecture

这是它的工作原理

  1. 一名新员工开始工作并在 OnboardingContext 中添加到系统中,一切正确,模型成功持久化。
  2. OnboardingContext引发事件,该事件称为 NewEmployeeEvent

OnboardingContext 就这些了就它而言,它已经完成了。它处理了新员工,保存了它,并引发了一个漂亮的系统范围事件来说明某事(一个事件)已经发生。

现在到 PayrollContext

  1. PayrollContext对几件事感兴趣,特别是它想知道新员工何时开始工作。
  2. 它订阅了NewEmployeeEvent此事件属于普通类型,它不知道事件来自何处,事实上它可能来自任何地方,但它对一小袋数据或有关该事件的信息感兴趣。
  3. 当此上下文引发事件时 handles该事件(在本例中是获取有关工资和员工编号的相关信息)将其保存到自己的数据存储中,以供稍后在工资核算期间使用。

繁荣完成。

您的系统现在监听并响应事件,这些事件在您的系统中以任何方向、所有方向流动。

当感兴趣的事情发生并引发事件时,对该事件感兴趣的任何人(上下文)都会订阅、处理并使用与该事件相关的数据做它想做的事情。

那么你是怎么做到的呢?

有很多阅读要做,只需谷歌 DDD 和领域事件。

您会看到 Jimmy Bogard (a better domain events pattern) 和 Udi Dahan (Domain Events Salvation) 关于这个主题的很多文章

看看nservicebus (付费)和 masstransit (开源)它们是非常棒的开箱即用事件和消息系统。

Nservice bus 在 https://docs.particular.net/nservicebus/architecture/principles 上有一些关于该主题的精彩视频

关于domain-driven-design - 上下文映射 - 关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39791667/

相关文章:

domain-driven-design - DDD 跨有界上下文引用子实体

c# - 如何为其中一个是事件项目的项目集合建模?

repository - 存储库中聚合对象的正确重构?

spring-boot - Spring boot admin 列出 kubernetes 内部 url。无法导航到应用程序页面

maven - 通过 Spring Boot 在 jar 文件中提供静态资源

不同限界上下文聚合根之间通信的.net实现

domain-driven-design - 状态模式和领域驱动设计

domain-driven-design - 规范模式对象应该在哪一层 "new' 编辑”?

java - 共享库与微服务?

java - 从 react 堆级别运行时的 Maven 强制执行器问题