【发布时间】:2022-07-05 18:16:57
【问题描述】:
我有买方、产品、卖方和报价。买方提出购买产品,卖方要么接受要么拒绝。我还有以下不变量:
如果已经有待处理的产品,则买方无法为该产品提供报价。 卖方不能接受来自买方的不存在的报价。 我创建了以下聚合买家、产品、卖家、ProductOffers。 ProductOffers 包含来自所有用户的所有优惠。 ProductOffers 也有一个 TryMoveOfferToAccepted() 方法,当从买方提出 OfferCreatedEvent 时调用该方法。 TryMoveOfferToAccepted() 然后引发由 Product 聚合处理的事件 TryMoveOfferToAccepted,该聚合检查是否可以购买产品(检查是否有足够的数量...),如果成功引发事件 ProductBought 事件,然后由 ProductOffers 处理(移动报价从待处理到接受)。
这是一个好方法吗?在没有先检查买方的报价是否存在的情况下,我如何确定有人不会调用 Product 的聚合购买方法?
【问题讨论】:
-
如果一次只能有一个有效报价,为什么不使用
ProductOffersAR,为什么不立即为正在进行的报价预留库存以减少/消除?接受报价时缺少库存的风险?至于确保命令仅在 X 发生时发生,那么有时我将命令建模为notifyXHappened(event)而不是独立命令,例如product.notifyProductBought(event)而不是product.buy()更好地传达耦合。 -
无论如何,对我来说,
ActiveProductOffer可能是ProductAR 的一部分,而历史将存在于外部,这允许在这里实现强一致性。 -
我不预订库存,因为买家提出了要约,但他的要约可能会被拒绝。产品可以有来自许多不同买家的许多报价
-
没关系,我读这个好像是卖单。如果您没有比集合更实用的分布式系统,那么对于唯一性集验证,您总是可以只使用 DB 唯一约束。如果不是,您可以考虑使用
BuyerOffers之类的集合,而不是ProductOffers,具体取决于哪个更大。
标签: aggregate domain-driven-design clean-architecture eventual-consistency