gpt4 book ai didi

domain-driven-design - 领域驱动设计方法重复

转载 作者:行者123 更新时间:2023-12-04 15:57:40 27 4
gpt4 key购买 nike

我目前正在阅读 Eric Evans 的领域驱动设计书,并且有一个概念让我遇到了麻烦......

根据这本书,所有聚合都应该有一个聚合根,并且聚合的所有成员只能通过这个根访问。根还应该负责强制执行不变量。但这不会导致很多方法重复吗?以下面的场景为例:

我有一个 Order 类,它由一组 OrderLine 组成。在这种情况下,类 Order 是聚合根,它必须强制执行不变式,即单个 Order 的所有 OrderLine 必须具有唯一的订单号。为确保不违反此不变量,Order 类不公开其 OrderLine,而仅提供一个方法 updateOrderLineOrderNumber(long orderLineId, int newOrderNumber),必须通过该方法更新 OrderLine。该方法只是检查 newOrderNumber 是否与现有订单号不冲突,然后调用相应 OrderLine 的 updateOrderNumber(int newOrderNumber) 方法。这很好,因为它只有一个方法,但是当类 OrderLine 有几个方法时会发生什么?由于 Order 不公开其 OrderLines,OrderLines 的所有属性都必须通过类 Order 更新,即使属性更改不需要任何不变检查。这无疑会导致大量的方法重复,随着更多的类被添加到聚合中,这种情况只会变得更糟。

我理解错了吗?是否有任何替代机制或设计模式可以用来防止这种情况?

我想到使用的一种可能的策略是验证器的概念。每当 OrderLine 的属性发生更改时,它必须首先检查一组验证器是否允许此更改。每当将 OrderLine 添加到 Order 时,Order 就可以向 OrderLine 的 name 属性添加适当的验证器。大家觉得这个策略怎么样?

任何帮助或想法将不胜感激!

最佳答案

老实说,我认为这里没有问题。首先,您为什么要更改 orderId? id 应该设置一次,不同的 id 等于不同的实体。

通常,如果您想更新 AR 的实体,您只需获取并更新它。

orderLine = order.getOrderLine(index)
orderLine.changeProduct(someProduct)

如果您需要在 AR 中保留一些不变量,例如 OrderLine.product 必须是唯一的,那么您可以调用 AR 方法。
order.changeOrderLineProduct(orderLineIndex, someProduct)

该方法在内部检查 someProduct 是否唯一,如果是,则调用上面的代码。
这里没有 DRY 违规,AR 方法检查不变量,orderLine 方法更新。

我也会考虑在这方面使用更多的 UL,例如“客户按订单更改订单线上的产品”
client.changeOrderLineProductOnOrder(orderLineIndex, product, order)

这样您就可以检查客户是否是该订单的所有者。

关于domain-driven-design - 领域驱动设计方法重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24880005/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com