Domain Driven Design: How to access child of aggregate root(域驱动设计:如何访问聚合根的子级)
问题描述
如果我有一个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聚合的引用的常规类。
这篇关于域驱动设计:如何访问聚合根的子级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:域驱动设计:如何访问聚合根的子级
基础教程推荐
- 如果条件可以为空 2022-01-01
- SonarQube C# 分析失败“不是指针的有效行偏移" 2022-01-01
- 从 C# 控制相机设备 2022-01-01
- 更新 Visual Studio 中的 DataSet 结构以匹配新的 SQL 数据库结构 2022-01-01
- 获取C#保存对话框的文件路径 2022-01-01
- C# 9 新特性——record的相关总结 2023-04-03
- Mono https webrequest 失败并显示“身份验证或解密失败" 2022-01-01
- 将数据集转换为列表 2022-01-01
- 重新排序 WPF TabControl 中的选项卡 2022-01-01
- 在 VB6 或经典 ASP 中使用 .NET 2022-01-01
