【问题标题】:Identity Reference between two bounded contexts两个有界上下文之间的身份引用
【发布时间】:2020-09-27 09:49:29
【问题描述】:

我希望获得有关处理有界上下文之间关系的 DDD/CQRS 原则的最佳实践。

我们有两个 BC 属性管理上下文和租户门户上下文。我们在租户门户上下文中有 Home 聚合,它的运行完全独立于物业管理上下文中的 Property 聚合。但是,在创建 Home 时,我们发现需要在初始事件中存储来自其他 BC 的 PropertyId 作为查找。

我最初认为不鼓励跨 BC 引用事件标识。然而,我团队中的某个人对这种观点提出了质疑,我正在努力寻找支持这两种论点的资源。

在其他有界上下文中引用聚合根是否可以接受?

如果不建议这样做,更好的替代方法是通过尝试使用特定于上下文的语言(例如 LookUpCode 或 ExternalReferenceCode)来故意模糊关系。尽管有一种隐含的理解,即这实际上是 PropertyId,在不久的将来不太可能是其他任何东西。

我对类似问题看到的两个不同的相反建议是:

【问题讨论】:

    标签: design-patterns domain-driven-design cqrs event-driven-design bounded-contexts


    【解决方案1】:

    您引用的建议实际上并不矛盾。

    使用外部 ID 来引用在其他上下文中定义的实体是合理的,但是:

    • 如果 BC 使用外国 ID,那么它不应该将其用作自己实体的 ID;事实上
    • 假设内部实体和外部实体之间存在 1-1 对应关系通常不是一个好主意;和
    • 假设外部 ID 是实体 ID 甚至不是一个好主意。它是与外部上下文交互所需的 ID。它是根据您在这些交互中可以用它做什么来定义的,并且应该没有其他目的

    因此,例如,如果 TenantPortal 需要执行某些操作或从 PropertyMgmt 获取某些信息,则 TenantPortal.Home 可以包含一个 PropertyRef,它可以用来执行这些操作或获取该信息。它没有其他用途,并且不应该是 TenantPortal 中任何内容的(一部分)ID。

    PropertyRef 是 PropertyMgmt 中的实体 ID 这一事实与 TenantPortal 无关。

    【讨论】:

    • 所以你说的是 Matt,TenantPortal.* 无法知道来自其他 BC 的实体 ID,但它可以知道一些可用于触发行为的 信息在另一个 BC(通过事件/svcs?)?所以在 TenantPortal.Home 中没有办法知道它属于某个 P​​ropertyMgmt.Property,因为那些是 diff 上下文?那你能做什么?仅在调用域服务或发出域事件的范围内将 PropertyId 存储在 Home 中?我的意思是你应该被允许做所有事情吗?因此,即使 PropertyId 是实体 ID,您也不能在 Home 中这样想?
    • 不,没有什么限制。只是将某物指定为属性 ID 不仅意味着它引用属性,而且它是在 PropertyMgmt 中引用属性的规范方式,它总是引用相同的属性,它是引用该属性的唯一 ID。如果可以避免的话,PropertyMgmt 域不应该向其他 BC 做出此类保证。
    • 所有这些属性与属性的讨论都令人困惑。例如,我认为您的意思是“将某物指定为属性 ID 意味着......”而不是带有小 p 的属性,这可能意味着您正在谈论一个 ID 属性(如 object.ID)。顺便说一句,谢谢你把事情弄清楚,我现在明白了。 :D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    • 2012-10-16
    • 2017-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多