域驱动设计:如何访问聚合根的子级 [英] Domain Driven Design: How to access child of aggregate root

查看:65
本文介绍了域驱动设计:如何访问聚合根的子级的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果我有一个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";

我想我误解了整个概念。:)

推荐答案

  1. 通过简单的只读属性或GET方法访问聚合根的子级没有任何错误。

重要的是要确保与子项的所有交互都由聚合根进行中介,以便有一个可预测的单一位置来保证不变量。

所以Order.LineItems可以,只要它返回(公开的)不可变对象的不可变集合。同样Order.LineItems[id]。有关示例,请参见the source for the canonical Evans-approved ddd example,其中聚合根Cargo类公开其几个子级,但子级实体是不可变的。

  1. 聚合根可以包含对其他聚合根的引用,但它们不能相互更改。

如果您有";蓝皮书";(Domain-Driven Design),请参阅第127页的示例,其中您可能有Car.Engine,其中CarEngine都是聚合根,但是引擎不是汽车聚合的一部分,您不能使用Car的任何方法对引擎进行更改(反之亦然)。

  1. 在域驱动设计中,您不必让所有类聚合聚合的根或子聚合。您只需要聚合根来封装一组有凝聚力的类之间的复杂交互。您建议的Customer类听起来根本不应该是聚合根-只是一个包含对ContractAddress聚合的引用的常规类。

这篇关于域驱动设计:如何访问聚合根的子级的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆