在DDD中,其中一个关键概念是Repository,它允许您检索实体(或聚合根),然后在更新后将其保存回来。
假设我们需要对实体执行一些“批量”操作,并且实体数量使得它们绝对无法将它们检索到内存中。即操作只能在数据库中执行。
这种“批量”操作的地方在哪里?它应该是存储库中的方法吗?它不会“泄漏”数据库特定操作的存储库抽象吗?它不会将业务运营从实体转移到存储库吗?
答案 0 :(得分:6)
我认为这应该是一项服务。
埃文斯在他的书中建议,当你怀疑是否在一个类中放入一个“闻起来很糟糕”的方法因为你认为它不属于那个类时,请在里面创建一个ServiceFoo类。答案 1 :(得分:4)
void DoLongInvolvedTask();
我认为将批量任务作为存储库中的方法没有任何问题。它们不泄漏任何东西。具有批量操作并不意味着任何特定于数据库的操作,除非您的方法类似于ReBuildMSSQLIndexesOnMyBigTable()。
答案 2 :(得分:3)
您需要的是在域驱动设计中称为service。服务用于模拟程序任务。批量更新操作(如您所描述的操作)将是服务的理想候选者。
编辑:原来的链接消失了。你可以在这里找到DDD术语的词汇表,但它没有原始页面那么有用。 http://dddcommunity.org/resources/ddd_terms/
答案 3 :(得分:1)
你不应该有任何保存,在域对象中检索逻辑(我假设你正在使用域模型)。这是Repository的责任。因此,您的批量方法属于存储库。
如果您使用的是ORM,那么您的存储库将不依赖于数据库。他们会将所有请求突显到ORM层。
如果您正在编写自己的映射器,那么存储库会将请求转发给实体的映射器。我认为这种耦合是可以的。