Architecture 使用DocumentDb或事件源处理DDD/CQR中包含大型集合的聚合

Architecture 使用DocumentDb或事件源处理DDD/CQR中包含大型集合的聚合,architecture,domain-driven-design,storage,cqrs,Architecture,Domain Driven Design,Storage,Cqrs,我正在从事一个项目,该项目管理批量生产大量文档。 工作流程 用户根据定义其需求的模板(需求通常是用户必须上传并由系统处理的文件),使用应用程序创建一个新的“批处理” 一旦满足所有要求,系统将处理所有输入并生成大量文档(数千份) 这些文件需要及时进行后期处理 某些批处理操作必须完成,例如,发布所有文档,在这种情况下,所有这些文档都需要先进行后处理 对于哪些操作可以同时运行,每个文档最多只能进行一次后处理等都有限制 我目前已将“批处理”本身建模为聚合根,但不将生成的文档列表存储在“批处理”对象本身中

我正在从事一个项目,该项目管理批量生产大量文档。 工作流程

  • 用户根据定义其需求的模板(需求通常是用户必须上传并由系统处理的文件),使用应用程序创建一个新的“批处理”
  • 一旦满足所有要求,系统将处理所有输入并生成大量文档(数千份)
  • 这些文件需要及时进行后期处理
  • 某些批处理操作必须完成,例如,发布所有文档,在这种情况下,所有这些文档都需要先进行后处理
  • 对于哪些操作可以同时运行,每个文档最多只能进行一次后处理等都有限制
  • 我目前已将“批处理”本身建模为聚合根,但不将生成的文档列表存储在“批处理”对象本身中,而是使用“批处理”对象中保留的集合id从数据存储中检索这些文档。我选择这样做的唯一原因是,我不想让聚合根包含大量集合并变得臃肿,但这妨碍了业务逻辑的开发,因为现在我必须在“批处理”中处理跨文档的一致性问题

    我的问题是,在DDD/CQRS中,当使用文档数据库进行持久化和/或使用事件源时,应该如何处理包含大型集合的聚合

    我已经看到,但都没有解决我的问题,其中一个使用的nhibernate集合过滤器对我来说既不是和选项,也不是解决此问题的正确方法,因为它会将存储逻辑泄漏到域模型中,另一个更多的是访问嵌套聚合中的对象,而不是解决存储/检索问题


    仅供参考,使用.net、c#、服务总线,使用一个由SQL支持的过于简化的通用存储库,计划在不久的将来切换到MongoDb。

    恐怕我没有一个快速的答案。我认为这取决于您的域的设计——特别是事务性和最终的一致性。很难摆脱以数据为导向的思维模式。 我发现沃恩·弗农的原著后续书非常有用。他的书是以他的散文为基础的。我发现他们在这方面很有见地