【问题标题】:Where do all "bulk" operations belong in DDD?所有“批量”操作在 DDD 中属于哪里?
【发布时间】:2010-10-08 09:46:45
【问题描述】:

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

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

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

【问题讨论】:

  • 您是在询问对一组记录执行大型更新吗? (比如说,用一条更新语句计算数百万个价格。)

标签: domain-driven-design abstraction ddd-repositories


【解决方案1】:

我认为它应该是一项服务。

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

【讨论】:

  • 已经9年了,希望有人能帮忙回答这个后续问题。当我们实现服务时,它会循环所有聚合并随后将它们保存/添加回存储库吗?
【解决方案2】:
void DoLongInvolvedTask();

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • DDD 服务的链接似乎失效(页面/域上没有内容)
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 2016-09-19
      • 2019-07-19
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2012-12-24
      相关资源
      最近更新 更多