【问题标题】:DDD Bounded Context integration - Application Service vs Domain Service vs RepositoriesDDD 有界上下文集成 - 应用程序服务与域服务与存储库
【发布时间】:2016-10-15 04:25:11
【问题描述】:

我有一个带有应用程序服务的有界上下文,它通过 DTO 公开应用程序用例。

有界上下文还包括一个域服务,它通过丰富的域对象公开域用例。 Application Service 是 Domain Service 的“客户端”。

最后,允许域对象持久化的存储库。

域中存在其他限界上下文,拥有该限界上下文的团队之间的关系是客户/供应商,因此团队朝着同一个目标保持一致,并且可以合作将所需的用例暴露给其他限界上下文。

在这种情况下,“客户有界上下文”应该在哪里连接到“供应商有界上下文”?

“供应商有界上下文”可以直接访问存储库或公开“供应商有界上下文”的丰富域对象的域服务吗? (在“客户有界上下文”中使用 ACL 来保护“供应商有界上下文”免于在域中泄漏)。我不确定这种方法是否良好,因为域重构会破坏所有 ACL 并需要维护。我知道这是 ACL 的目标,但是...

或者“消费者有界上下文”是否最好只连接到“供应商有界上下文”的应用程序服务,其中公开 DTO? (不需要 ACL)。我不确定这种方法是否良好,因为它强制应用程序服务模仿域服务仅用作访问点,即使用例显然是域用例。

有什么意见吗?有没有人尝试过这两种方法中的一种,有好的/坏的体验?

我没有从 Vaughn Vernon 的书或 Scott Millett 的书中找到明确的答案。

【问题讨论】:

    标签: domain-driven-design bounded-contexts


    【解决方案1】:

    两个团队应该合作为供应商 BC 定义一个 API。不要直接耦合到其他 BC 应用服务甚至模型。

    API 通常以 REST API 的形式实现,但从您的问题看来,您正在将多个 BC 集成到一个应用程序中。如果是这种情况,那么您应该将 API 定义为接口库。

    应该对接口库进行版本控制和记录。它应该由供应商团队维护,消费者团队根据他们的需要提出更改请求。

    仅当供应商 BC 有一个非常简单的模型时,才通过 API 公开领域模型本身。 在所有其他情况下,定义封装所需用例的应用服务是有意义的。然后,只有这些应用服务会作为 API 公开。

    【讨论】:

    • 在模型非常简单的情况下,是否也可以考虑将存储库的访问权限直接暴露给其他有界上下文?这对于让消费者有界上下文管理和决定数据库事务范围的配置方式而不是让供应商上下文以“通用”方式管理所有消费者上下文是否有用?
    • 我会尽量避免它,就像我尽量避免直接暴露域模型一样。您当然可以采用这种方法,但请注意,这会导致两个 BC 之间的耦合度非常高。不要避免额外的应用服务,因为它们看起来像很多代码 - 它们添加了一个重要的抽象层,并且实现和维护它们通常是直截了当的。
    • 您是否同意您所描述的内容看起来像 OHS?我在想 OHS 是有界上下文演变的又一步,当多个消费者总是执行相同的 ACL 逻辑,并且您的系统足够成熟以公开“真实”公共签名时,允许删除所有消费者的 ACL .
    • 不,OHS(据我了解)是一项开放(即不是特定于消费者的)服务。您的供应商应用程序服务将根据特定消费者的要求进行设计,因此您确实拥有供应商-消费者关系。创建 OHS 通常要付出更多努力,因为您需要构建一个必须在各种应用程序中都有意义的服务
    • 开放主机只是模式之一。所有这些都在红皮书中进行了描述。如果这是一个“应用程序”(尽管我们知道应用程序边界非常适合有界上下文边界),我会使用 MediatR 之类的东西。
    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 2011-09-29
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-19
    • 2013-11-27
    相关资源
    最近更新 更多