在 DDD 中,关键概念之一是存储库,它允许您检索实体(或聚合根),然后在更新后将它们保存回来。
假设我们需要对实体执行一些“批量”操作,并且实体的数量使得将它们检索到内存中是绝对不可能的。 IE。操作只能在数据库中进行。
这样“批量”操作的地方在哪里?它应该是存储库上的方法吗?它不会“泄漏”数据库特定操作的存储库抽象吗?不会把业务操作从实体转移到存储库吗?
我认为这应该是一种服务。
Evans 在他的书中建议,当你怀疑是否要把一个“闻起来很糟糕”的方法放在一个类中,因为你认为它不属于那里时,创建一个包含该操作的 ServiceFoo 类。
我认为将批量任务作为方法放入存储库中没有任何问题。他们不会泄漏任何东西。进行批量操作并不意味着任何特定于数据库的操作,除非您的方法类似于 ReBuildMSSQLIndexesOnMyBigTable()。
如果您使用 ORM,那么您的存储库将不依赖于数据库。他们会将所有请求转发到 ORM 层。
如果您正在编写自己的映射器,那么存储库会将请求转发给实体的映射器。我认为这种耦合还可以。