【问题标题】:Bounded Contexts in DDD with CQRS. Sharing Aggregates/Entities. Possible?带有 CQRS 的 DDD 中的有界上下文。共享聚合/实体。可能的?
【发布时间】:2013-07-28 19:28:10
【问题描述】:

我找到了这个代码示例。

https://code.google.com/p/ddd-cqrs-sample/

看起来非常完整且组织良好。不是“框架”,只是一个具有非常精细和明确的做事方式的示例项目。但是,不完整。这带来了一些疑问。

他们擅长回答你的问题。在https://groups.google.com/forum/#!forum/ddd-cqrs-sample查看他们的谷歌群组

好的。问题是他们在 SALES BC 中有客户,在 CRM BC 中有客户/潜在客户。我想我们都同意指向同一个“人”。假设在销售漏斗中,此人一开始是潜在客户,然后通过购买使他成为客户的东西成为客户。

我的问题是,为什么他们对同一个“人”有三个不同的表示?它不能像“共享内核聚合”吗?我不知道这样的事情是否存在。在数据库 Client/Customer/Leads 中有三个表用于相同的“事物”,这让我有点困扰。另外,在示例中不清楚(未实施 CRM)您如何在 BC 之间进行通信。我阅读了他们的文档,但找不到任何有价值的线索。

这个过程是怎样的?假设您需要将此潜在客户/客户/客户添加一个地址来运送订单。你会选择哪一个?我猜是 Shipping BC 中的 ShippingAddress 吗?用 Id 指向?顾客?客户?您是否应该将地址直接添加到客户?以直邮为例,因为它与运费无关?

【问题讨论】:

    标签: .net domain-driven-design cqrs bounded-contexts


    【解决方案1】:

    通常不鼓励跨上下文重用。在极少数情况下共享内核可以提供帮助,但通常域对象(及其聚合)应保持在其各自上下文的本地。否则,您将引入紧密耦合并失去有界上下文的主要优势之一。他们将无法相互独立地改变和发展。

    【讨论】:

      【解决方案2】:

      共享内核在 CRM 和 Sales BC 之间引入了非常紧密耦合。

      这是另一种选择..

      CRM BC拥有个客户。您不必在 Sales BC 中复制完整的客户 AR。这避免了必须处理双向同步。您可以让 Sales BC 中的 Client AR 通过其标识符引用 CRM BC 中的 Customer AR,然后将特定的 Client 属性封装在 Sales BC 中。这会在 Sales 和 CRM BC 之间创建顺从者或客户-供应商关系,其中 Sales BC 位于下游,而 CRM BC 位于上游。 CRM 上下文可能会使用开放式主机服务使客户 AR 可供销售 BC 使用。

      【讨论】:

        【解决方案3】:

        有界上下文通常由不同的团队为不同的客户实施(例如销售部门和客户关系部门)。他们对客户都有自己的看法,我认为该项目试图通过不同的命名来夸大这一点。

        【讨论】:

        • 那部分我明白了。但他们有三张表据称指的是同一个“人”。假设每个部门开始独立修改这三个表。这不是混乱吗?我想我的问题是,无论 BC 怎么看,我怎么能对那个人使用 ONE 引用?
        • BC 不应共享任何数据。您不能让多个 BC 看同一张桌子。在那种情况下,你只需要一个 BC。 BC 可以发布事件以通知其他 BC 有关更改,但这些事件应该包含数据,仅包含 ID。因此,销售人员可以通知 CRM 客户 5232 已添加,客户 973 已成为首选客户。
        • 如果没有数据共享,这三个表可以独立演化。
        • @Steven 但数据库集成不只是有界上下文之间强一致性集成的实现吗?我的意思是,如果您有 1 个表,其中包含共享身份字段(例如 AccountId);比如果您在 1st BC 创建帐户,那么您将在 2nd BC 自动获得该帐户,无需事件集成,而是因为数据库集成
        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 2020-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多