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

时间:2014-03-17 08:24:06

标签: c# dependency-injection domain-driven-design service-layer

Eric Evan的书" Domain Driven Design" (人们经常称之为“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作为聚合根的依赖注入是否正确?或者我应该更好地谈谈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);

1 个答案:

答案 0 :(得分:3)

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

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

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