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