Domain driven design DDD中聚合的不同持久性存储库
我有一个包含根实体(文档)和VO(文档)的聚合。文档与文件(PDF、图像、office文档等)关联,因此我必须将聚合保存在数据库中,并将文件保存在ftp服务器中(文件无法保存在数据库中,因为空间文件太大)。 MyDB repository类使用FindXXX、AddDocument、removedDocument等方法实现一个接口。如何实现ftp持久性?我的数据库存储库是否应连接到AddDocument和RemoveDocument中的ftp设置程序?或者我应该创建一个实现该接口的ftp存储库类。如果是这样,像FindXXX这样的方法就没有意义了。 据我所知,每个聚合只有一个接口存储库,表示如何持久化。它可以有多种“持久化模式”(在数据库、ftp、文件等中),但接口应该相同 据我所知,每个聚合只有一个接口存储库,表示如何持久化 这基本上是正确的;人们通常认为整个聚合将存储在一个地方。当您将聚合的状态分布到多个存储单元时,需要非常小心地注意故障模式Domain driven design DDD中聚合的不同持久性存储库,domain-driven-design,ddd-repositories,Domain Driven Design,Ddd Repositories,我有一个包含根实体(文档)和VO(文档)的聚合。文档与文件(PDF、图像、office文档等)关联,因此我必须将聚合保存在数据库中,并将文件保存在ftp服务器中(文件无法保存在数据库中,因为空间文件太大)。 MyDB repository类使用FindXXX、AddDocument、removedDocument等方法实现一个接口。如何实现ftp持久性?我的数据库存储库是否应连接到AddDocument和RemoveDocument中的ftp设置程序?或者我应该创建一个实现该接口的ftp存储库类
要考虑的是单独存储的文档是否是聚合的一部分,或者是集合所引用的内容。
如果它们被聚合引用,则将它们视为对其他聚合的任何其他引用。文档聚合存储文档的标识符/引用/提示,并在需要时利用域服务访问文档 如果它们是聚合的一部分,那么通常的答案是“存储库”将是复杂基础设施前面的一个门面,它掩盖了文档和文档分开存储的事实换句话说,基础设施层将尝试协调加载和存储操作,系统的其余部分不需要知道细节。延迟响应。但是,简单地说,您应该有两种服务。在我阅读DDD时,存储库通常被视为基础设施服务。在本例中,您有两个:
从根本上说,测试单个部件和替换底层实现应该很容易。如果有一天您决定从FTP切换(甚至包括支持)到Google云存储/AWS S3,那么可能会涉及更多的工作和测试用例的更改。Mmm。。有趣的问题。我也不确定。部分原因是它是聚合的一部分,因为文件(文档VO类)是文档实体的一部分。但是,另一方面,当我在存储库中执行FindXXX方法时,我不会加载ftp站点中的所有文档,我只加载db信息。我不确定什么是正确答案。