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)
聚合根很可能具有依赖性。例如,如果您有一个 Invoice 聚合根实体,它可能会有一个 LineItem 集合。编辑行项目的唯一方法是使用 InvoiceRepository。
如果发票不是聚合根,则发票行项目将拥有自己的存储库。
如果您不需要在汽车环境之外使用车轮,那么您的示例看起来不错。唯一的问题是汽车可以更换自己的轮子吗?如果不是,则该方法可能位于错误的位置。
| 归档时间: |
|
| 查看次数: |
1222 次 |
| 最近记录: |