如何使用存储库持久化聚合?

How to persist aggregates with repositories?

我正在尝试学习有关 DDD 的一些概念,而持久化聚合的部分让我有些困惑。我已经阅读了有关 SO 主题的各种答案,但其中 none 似乎回答了我的问题。

假设我有一个产品的聚合根。现在我不想注入 ProductRepository ,它将在 Product class 本身的构造函数中保留此聚合根。想象一下我写的代码像

var prod = new Product(Factory.CreateProductRepository(), name, costprice);

在UI层。如果我不想通过聚合根中的依赖注入来注入我的存储库,那么问题是这段代码应该去哪里?我应该创建一个 class 只是为了持久化这个 AR 吗?谁能建议解决此问题的正确和推荐方法是什么?

我关心的不是使用哪个 ORM 或如何使这个 AR ORM 友好或易于持久化,我的问题是关于正确使用存储库或任何持久性 class。

应用程序服务

你是对的,领域层应该对持久化一无所知。所以将存储库注入 Product 确实是个坏主意。

您正在寻找的 DDD 概念称为 应用程序服务。应用服务不是领域层的一部分,而是位于服务层(有时称为应用层)。应用程序服务代表一个用例(与域概念相反)并具有以下职责:

  • 执行输入验证
  • 强制访问控制
  • 执行事务控制

最后一点意味着应用服务将查询存储库以获取特定类型的聚合(例如通过 ID),使用其方法之一对其进行修改,然后将其传回存储库以更新D B。

存储库粒度

关于你的第二个问题

Should I create a class only for persisting this AR?

是的,为每个聚合创建一个存储库是一种常见的方法。通常,像 getById()update()delete() 等标准存储库操作被提取到可重用的 class(基础 class 或通过聚合)。

您还可以为非域信息创建额外的存储库,例如统计数据。但是,在这些情况下,请确保您不会不小心错过领域概念。