我正在尝试学习关于DDD的一些概念,而持久聚合的部分让我感到困惑。我已经阅读了有关SO的主题的各种答案,但它们似乎都没有回答我的问题。
假设我有一个产品的聚合根。现在我不想注入 ProductRepository ,它会将此聚合根保留在 Product 类本身的构造函数中。想象一下我写的代码如
var prod = new Product(Factory.CreateProductRepository(), name, costprice);
在UI图层中。如果我不想通过Aggregate Root中的依赖注入注入我的存储库,那么问题是这个代码应该去哪里?我应该只为持久化这个AR创建一个类吗?任何人都可以建议什么是正确的&建议的方法来解决这个问题?
我担心的不是使用哪种ORM或如何使AR ORM友好或易于持久,我的问题是正确使用存储库或任何持久性类。
答案 0 :(得分:6)
你是对的,域层应该对持久性一无所知。因此,将存储库注入Product
确实是一个坏主意。
您正在寻找的DDD概念称为应用程序服务。应用程序服务不是域层的一部分,但它位于服务层(有时称为应用程序层)中。应用程序服务代表用例(与域概念相对),并具有以下职责:
最后一点意味着应用程序服务将在存储库中查询特定类型的聚合(例如,通过ID),使用其中一种方法对其进行修改,然后将其传递回存储库以更新数据库。
关于你的第二个问题
我是否应仅为持久存在此AR而创建一个类?
是的,每个聚合创建一个存储库是一种常见的方法。通常,标准存储库操作(如getById()
,update()
,delete()
等等被提取到可重用的类(基类或聚合)中。
您还可以为非域信息创建其他存储库,例如统计数据。但是,在这些情况下,请确保您不会意外错过域概念。