DDD中聚合的不同持久性存储库

时间:2018-02-02 11:29:35

标签: domain-driven-design ddd-repositories

我有一个带有根实体(文档)和VO(文档)的聚合。文档与文件(pdf,图像,办公文档等)相关联,因此我必须将聚合持久保存在数据库和ftp服务器中的文件中(文件无法保存在数据库中,因为空间文件太大)。 我的db存储库类使用FindXXX,AddDocument,RemoveDocument等方法实现接口。我怎么能实现ftp持久性?我的db存储库是否应该连接到AddDocument和RemoveDocument中的ftp setver?或者我应该创建一个实现接口的ftp存储库类。如果是这样,像FindXXX这样的方法没有意义。 据我所知,DDD每个聚合只有一个接口存储库,代表了如何持久化。它可以有多种"持久性模式" (在db,ftp,file等中)但接口应该相同。

2 个答案:

答案 0 :(得分:1)

  

据我所知,DDD每个聚合只有一个接口存储库,代表了如何保存。

这大部分是真的;人们通常认为整个聚合将存储在一个地方。当您在多个存储单元中分配聚合状态时,您的故障模式需要非常小心。

因此,需要考虑的一件事是,单独存储的文档是否是聚合的部分,或引用聚合的内容。

如果它们引用聚合,那么您将它们视为对另一个聚合的任何其他引用。文档聚合存储文档的标识符/引用/提示,并在需要时利用域服务访问文档。

如果他们是聚合的一部分,那么通常的答案是"存储库"将是一个复杂的基础设施之前的门面,掩盖了文档和文档分开存储的事实。

换句话说,基础设施层将尝试协调加载和存储操作,系统的其余部分不需要知道详细信息。

答案 1 :(得分:0)

最新回应。但是,简单来说,您应该有两项服务。在我阅读DDD时,通常将存储库视为基础结构服务。在这种情况下,您有两个:

  1. 用于存储和基本检索文档ID,元数据和引用的存储库/接口
  2. 用于存储和基本数据块检索的存储库/接口

有时候,有多个聚合和存储库是有意义的。实际上,有关边界上下文(https://github.com/VaughnVernon/IDDD_Samples)的一些Vaughn Vernon示例的确包含了对其他聚合的引用的聚合。我认为您应该做有意义的事情,认为合适的事情。

实际上,如果您经营的是邮局收件中心,则可能会采用以下方法:1.存储小包裹或大包裹,并2.确定每个小包裹或大包裹在中心的位置索引以便您可以检索它。

  

我的数据库存储库类使用诸如FindXXX,AddDocument,RemoveDocument等方法实现接口。如何实现ftp持久性?我的数据库存储库是否应该在AddDocument和RemoveDocument中连接到ftp setver?或者,我应该创建一个实现该接口的ftp存储库类。

如果除了其他一些数据存储之外,数据库存储库还连接到FTP,则可以说您在一个区域中放置了过多的逻辑和责任。也就是说,这样做也没有错。

  

如果是这样,则类似FindXXX的方法就没有意义。据我对DDD的了解,每个聚合只有一个接口存储库,该接口存储库表示如何持久化。

对于此特定问题,大多数DDD从业人员将建议您使用单独的视图服务/模型。它可以跨存储库或服务生成物化/查看DTO。

从根本上讲,应该容易测试各个部分并替换基础实现。如果您决定有一天将FTP从FTP切换(甚至包括支持)到Google Cloud Storage / AWS S3,那么可能涉及更多的工作,并且需要更改测试用例。