在埃里克·埃文(Eric Evan)的书“域驱动设计”(人们通常称其为“DDD的最佳示例”)中,有许多满足特定请求的聚合根(大多数是域模型或实体)示例。

让我们来看下面的例子:

public Car : IAggregateRoot {

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

    public void ReplaceWheels();

}

为了更换车轮,我必须向GarageService请求一组新的车轮,该服务本身会从WheelRepository中收集车轮。在一种情况下,我不是客户,而是车库老板/机修工替换了轮子,所以调用我很自然:
myCar.ReplaceWheels();
// I'm a domain expert! I have the capabilities to replace the wheels

我的问题是:将WheelService作为聚合根的依赖项注入(inject)是否正确?还是我最好只通过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);

最佳答案

聚合根很可能具有依赖性。例如,如果您有一个发票聚合根实体,则很可能会有一个LineItem集合。编辑订单项的唯一方法是使用InvoiceRepository。

如果发票不是汇总根,则发票行项目将具有其自己的存储库。

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

关于c# - 聚合根是否应该具有依赖性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22449597/

10-11 01:24