【发布时间】:2021-04-13 00:42:13
【问题描述】:
我的域中有 2 个 AR:
- 产品 - 我想这个名字说明了一切 - 这是合作伙伴销售的东西。它属于:
- 合作伙伴 - 卖方。
这是一个多租户系统,其中一个假设是合作伙伴可以拥有数十万种产品,具体取决于限制 - 如果 A 公司只想销售 100 种产品,他们会购买最便宜的青铜通行证,如果他们想卖出 100 000 件产品,他们就购买了 Gold Pass。在产品导入过程中,应强制执行这些规则,因此在任何特定时刻,任何合作伙伴都不能在我们的系统中保留超过限制规则允许的产品。
Product AR 是一个很大的——它包含约 10 个业务规则和约 12 个 ValueObjects。 Partner AR 很小 - 它仅包含 Id 和电流限制值。
从代码角度看导入过程的外观: 我正在从数据库中加载合作伙伴,并为其分配当前活动产品的 id 集合。然后,当产品数据进来时,我首先通过一个方法运行它:Partner.LimitProducts(Products),它返回一个允许放入数据库的产品列表。
我没有将产品作为合作伙伴集合(因此属于它的实体)的严格部分,原因有两个:
- 性能 - 我使用的是 NoSql - 文档数据库,它无法很好地保存大型文档。
- 常识 - 产品 AR 如此之大绝非偶然,因为所讨论的微服务中发生的 99.999% 的操作仅与产品有关,它甚至从未触及合作伙伴 - 除了创建新产品,即.
但是我发现这种方法存在一些问题。对我来说,DDD 就是在聚合(不变量)中做出强有力的保证,但是当我使用一个 AR 作为对另一个 AR 的一种过滤层时,在这种情况下,它立即迫使我放置协调逻辑在所涉及的两个 AR 之上的一层,这在我看来只是一半的不变量位于错误的位置(这将是应用程序层),但它应该在哪里呢?我考虑过创建一个域服务来将协调逻辑放置在其中,甚至将限制业务规则移到那里,但我不知道我是否喜欢这样......
你们中有人看到这个的替代设计吗?
【问题讨论】: