本文介绍了域驱动设计:如何访问聚合根的子级的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果我有一个Order类作为聚合根和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){}
}
那么Customer类将充满子操作方法。所以我宁愿做
addressInstance.Street = "someStreet";
我想我误解了整个概念。:)
推荐答案
- 通过简单的只读属性或GET方法访问聚合根的子级没有任何错误。
重要的是要确保与子项的所有交互都由聚合根进行中介,以便有一个可预测的单一位置来保证不变量。
所以Order.LineItems
可以,只要它返回(公开的)不可变对象的不可变集合。同样Order.LineItems[id]
。有关示例,请参见the source for the canonical Evans-approved ddd example,其中聚合根Cargo
类公开其几个子级,但子级实体是不可变的。
- 聚合根可以包含对其他聚合根的引用,但它们不能相互更改。
如果您有";蓝皮书";(Domain-Driven Design),请参阅第127页的示例,其中您可能有Car.Engine
,其中Car
和Engine
都是聚合根,但是引擎不是汽车聚合的一部分,您不能使用Car
的任何方法对引擎进行更改(反之亦然)。
- 在域驱动设计中,您不必让所有类聚合聚合的根或子聚合。您只需要聚合根来封装一组有凝聚力的类之间的复杂交互。您建议的
Customer
类听起来根本不应该是聚合根-只是一个包含对Contract
和Address
聚合的引用的常规类。
这篇关于域驱动设计:如何访问聚合根的子级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!