相互关联的上下文事件 - 存储消息合同的模块/项目

时间:2013-03-27 09:12:51

标签: domain-driven-design

我们的每个有界上下文都有一个事件消息处理器,它将消息从上下文总线中拉出,并通过内存总线本地发送(Reactive Extensions或https://github.com/flq/MemBus)。

在DDD书籍中,我已经阅读过有关将消息放入项目中的模块的讨论,例如mycompany.accounts.infrastructure.messagesmycompany.ordering.infrastructure.messages

对于我有多个上下文的问题,引用这些消息会导致循环引用。

如何最好地组织不同的有界上下文消息合同:

  1. 每个有界上下文是否都有一个单独的项目,其中包含该上下文的所有可能消息,以便其他有界上下文可以引用?

  2. 或者,对于将通过上下文总线的所有消息分别使用共享库是否更好?

1 个答案:

答案 0 :(得分:1)

我解决了为每个有界上下文构建(至少)两个程序集的类似问题:

  1. 一个用于合同(事件,例外,共享标识符等等)
  2. 一个用于实体的实施。
  3. 这样,不同的有界上下文实现可以引用相同的契约,而不需要任何cicle。

    修改
    至于命名约定,我通常在有界上下文的“常规名称”之后命名程序集,例如

    1. BankName.FinancialAdvisory为合同
    2. BankName.FinancialAdvisory.POCO for implementation
    3. BankName.FinancialAdvisory.ORMOrOtherTechnologicalCouplingName当我需要专门化某些类以在特定技术环境中使用它们时。
    4. 但是,在POCO程序集中,根名称空间与合同的名称空间相同(例如BankName.FinanicalAdvisory):这是因为在没有任何技术问题的情况下在代码中表达业务规则的POCO具有相同的开发实时循环合同。相反,包含技术专业的程序集使用的根命名空间等于程序集名称(例如BankName.FinancialAdvisory.ORMOrOtherTechnologicalCouplingName)。

      然而,与域相关的所有程序集共享相同的命名空间结构:例如,如果BankName.FinancialAdvisory下存在名称空间“Funds”,它也存在于POCO和ORMOrOtherTechnologicalCouplingName中(当然,如果它包含任何类)。 / p>