【问题标题】:Should aggregate roots have dependencies?聚合根应该有依赖关系吗?
【发布时间】:2014-04-22 09:02:33
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • “唯一的问题是汽车可以更换自己的车轮吗?”像这样的问题是 DDD imo 的核心,无论出于何种原因,这也是开发人员最难接受的价值。
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多