聚合根应该具有依赖性吗?

Acr*_*gma 7 c# domain-driven-design dependency-injection service-layer

在Eric Evan的书"领域驱动设计"(人们通常称之为'DDD的最佳示例')中,有很多聚合根(大多数是域模型甚至实体)的例子都满足了某个请求.

我们来看下面的例子:

public Car : IAggregateRoot {

    public List<Wheel> Wheels { get; set; }

    public void ReplaceWheels();

}
Run Code Online (Sandbox Code Playgroud)

为了更换车轮,我必须从GarageService请求一组新的车轮,车轮本身从WheelRepository收集车轮.在一个场景中,我不是客户,而是替换车轮的车库所有者/机械师,所以打电话很自然:

myCar.ReplaceWheels(); 
// I'm a domain expert! I have the capabilities to replace the wheels
Run Code Online (Sandbox Code Playgroud)

我的问题是:将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();
    }

}
Run Code Online (Sandbox Code Playgroud)

要么

myWheelService.getNewSet(Car car);
Run Code Online (Sandbox Code Playgroud)

Dmi*_* S. 2

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

如果发票不是聚合根,则发票行项目将拥有自己的存储库。

如果您不需要在汽车环境之外使用车轮,那么您的示例看起来不错。唯一的问题是汽车可以更换自己的轮子吗?如果不是,则该方法可能位于错误的位置。