11

在 DDD 中,关键概念之一是存储库,它允许您检索实体(或聚合根),然后在更新后将它们保存回来。

假设我们需要对实体执行一些“批量”操作,并且实体的数量使得将它们检索到内存中是绝对不可能的。ie操作只能在数据库中进行。

这种“批量”操作的地方在哪里?它应该是存储库上的方法吗?它不会通过数据库特定操作“泄漏”存储库抽象吗?它不会将业务操作从实体转移到存储库吗?

4

4 回答 4

7

我觉得应该是服务。

Evans 在他的书中建议,当您因为认为某个类不属于该类而怀疑是否将“闻起来很糟糕”的方法放入类时,请在其中创建一个带有操作的 ServiceFoo 类。

于 2009-08-26T03:48:13.953 回答
4
void DoLongInvolvedTask();

我认为将批量任务作为方法放入存储库中没有任何问题。他们不会泄露任何东西。拥有批量操作并不意味着任何特定于数据库的操作,除非您的方法类似于 ReBuildMSSQLIndexesOnMyBigTable()。

于 2009-02-18T17:54:25.683 回答
3

您需要的是领域驱动设计中的服务。服务用于对程序任务进行建模。像您描述的那样,批量更新操作将是服务的理想候选者。

编辑:原始链接消失了。您可以在此处找到 DDD 术语表,但它不如原始页面有用。http://dddcommunity.org/resources/ddd_terms/

于 2009-08-26T03:26:13.217 回答
1

您不应该在域对象中保存、检索逻辑(我假设您正在使用域模型)。这是存储库的责任。所以你的批量方法属于存储库。

如果您使用 ORM,那么您的存储库将不依赖于数据库。他们会将所有请求转发到 ORM 层。

如果您正在编写自己的映射器,则存储库会将请求转发给实体的映射器。我认为这种耦合是可以的。

于 2009-02-18T17:59:42.520 回答