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);
答案 0 :(得分:3)
聚合根很可能具有依赖性。例如,如果您有一个Invoice聚合根实体,它可能会有一个LineItem集合。编辑订单项的唯一方法是使用InvoiceRepository。
如果发票不是聚合根,则发票行项目将拥有自己的存储库。
如果您不必在汽车的环境之外使用车轮,那么您的示例看起来很好。唯一的问题是汽车可以更换自己的车轮吗?如果没有,该方法可能位于错误的位置。