如何使用存储库来保存聚合?

时间:2015-11-18 09:24:02

标签: c# domain-driven-design persistence aggregateroot

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

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

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

在UI图层中。如果我不想通过Aggregate Root中的依赖注入注入我的存储库,那么问题是这个代码应该去哪里?我应该只为持久化这个AR创建一个类吗?任何人都可以建议什么是正确的&建议的方法来解决这个问题?

我担心的不是使用哪种ORM或如何使AR ORM友好或易于持久,我的问题是正确使用存储库或任何持久性类。

1 个答案:

答案 0 :(得分:6)

应用服务

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

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

  • 执行输入验证
  • 实施访问控制
  • 执行交易控制

最后一点意味着应用程序服务将在存储库中查询特定类型的聚合(例如,通过ID),使用其中一种方法对其进行修改,然后将其传递回存储库以更新数据库。

Repository Ganularity

关于你的第二个问题

  

我是否应仅为持久存在此AR而创建一个类?

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

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