代码之家  ›  专栏  ›  技术社区  ›  alex

DDD中的所有“批量”操作都属于何处?

  •  8
  • alex  · 技术社区  · 17 年前

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

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

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

    4 回复  |  直到 12 年前
        1
  •  5
  •   lurks    16 年前

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

    Evans在他的书中建议,当你怀疑是否要将一个“闻起来很糟糕”的方法放入类中,因为你认为它不属于类,那么就创建一个包含该操作的servicefoo类。

        2
  •  4
  •   Darryl Braaten    17 年前
    void DoLongInvolvedTask();
    

    我认为将批量任务作为方法放在存储库中没有任何问题。他们什么也不漏。批量操作并不意味着任何特定于数据库的操作,也就是说,除非您的方法类似于rebuildMssqlIndexesOnMyBigtable()。

        3
  •  2
  •   dthrasher    12 年前

    你需要的是一个 service 在领域驱动的设计中。服务用于建模过程任务。批量更新操作(如您所描述的)将是服务的理想候选。

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

        4
  •  1
  •   StackUnderflow    17 年前

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

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

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