聚合根是否有依赖关系

本文关键字:依赖 关系 是否 | 更新日期: 2023-09-27 17:50:31

在Eric Evan的书《领域驱动设计》(人们通常称之为"DDD的最佳示例")中,有许多实现特定请求的聚合根(主要是领域模型甚至实体)的示例。

让我们看下面的例子:

public Car : IAggregateRoot {
    public List<Wheel> Wheels { get; set; }
    public void ReplaceWheels();
}

为了替换轮子,我必须从GarageService请求一组新的轮子,GarageService自己从WheelRepository收集轮子。在一个场景中,我不是客户,而是一个更换车轮的车库老板/机械师,所以调用:

感觉很自然:
myCar.ReplaceWheels(); 
// I'm a domain expert! I have the capabilities to replace the wheels

我的问题是:是否可以将WheelService作为聚合根的依赖项注入?或者我最好只通过WheelService说话?

public class MyCar : IAggregateRoot {
    private readonly IWheelService _wheelService;
    public List<Wheel> Wheels { get; set; }
    public MyCar(IWheelService wheelService) {
        this._wheelService = wheelService;
    }
    public void ReplaceWheels() {
        this.Wheels = _wheelService.getNewSet();
    }
}

myWheelService.getNewSet(Car car);

聚合根是否有依赖关系

聚合根很可能有依赖关系。例如,如果您有一个Invoice聚合根实体,那么它很可能有一个LineItem集合。编辑行项的唯一方法是使用InvoiceRepository。

如果Invoice不是聚合根,Invoice行项将有它们自己的存储库。

如果您从不需要在汽车的上下文中处理车轮,那么您的示例看起来很好。唯一的问题是这辆车能更换自己的轮子吗?