如果我有一个订单类作为聚合根和 1000 个订单项。
如何仅加载 1000 个订单项中的一个?据我了解,订单项只能通过 Order 类访问,并且具有“本地”标识。我是否仍会在 OrderRepository 中创建像“GetLineItemById”这样的存储库方法?
编辑评论答案:目前我认为拥有一个一成不变的孩子是不合理的。如果我有一个包含多个地址、合同甚至更多子集合的 Customer 类,该怎么办?我想在一个巨大的实体上执行 CRUD 方法。
我会
public class Customer
{
public IEnumerable<Address> Addresses { get; private set; }
public IEnumerable<Contracts> Contracts { get; private set; }
...
}
如果用户更正地址的街道或合同的属性,我是否必须执行类似的操作?
public class Customer
{
public void SetStreetOfAddress(Address address, street){}
public void SetStreetNumberOfAddress(Address address, streetNumber){}
}
那么客户类将充满子操作方法。所以我宁愿这样做
addressInstance.Street = "someStreet";
我想我误解了整个概念..:)
- 通过简单的只读属性或 get 方法访问聚合根的子级没有任何问题。
重要的是要确保所有互动与孩子的关系是由聚合根调节的,因此有一个单一的、可预测的地方来保证不变量。
So Order.LineItems
没问题,只要它返回(公开)不可变对象的不可变集合。同样地Order.LineItems[id]
。有关示例,请参阅经 Evans 批准的规范 ddd 示例的来源 http://sourceforge.net/projects/dddsample/files/DDDSample%20Source/,其中聚合根Cargo
类公开了它的几个子实体,但子实体是不可变的。
- 聚合根可以保存对其他聚合根的引用,但它们不能相互改变。
如果你有“蓝皮书”(领域驱动设计 https://dddcommunity.org/books/),请参阅第 127 页的示例,其中显示了您可能如何Car.Engine
,其中两者Car
and Engine
是聚合根,但引擎不是汽车聚合的一部分,您不能使用以下任何方法对引擎进行更改Car
(或相反亦然)。
- 在领域驱动设计中,您不必使所有类聚合根或聚合的子级。您只需要聚合根来封装一组内聚的类之间的复杂交互。这
Customer
您提出的类听起来根本不应该是聚合根 - 只是一个包含引用的常规类Contract
and Address
聚合体。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)