DDD:要读取的存储库和要写入的工作单元?

Raj*_*sad 5 domain-driven-design repository ddd-repositories unit-of-work repository-pattern

在浏览了多篇堆栈溢出帖子和博客文章后,我做出了这样的决定:我们需要UnitOfWork 设计模式来维护事务完整性,同时将域对象写入各自的存储库。

然而,我们在阅读/搜索存储库时不需要这种完整性。鉴于此,将存储库和工作单元的用途分开,前者仅用于读取域对象,后者仅用于创建/写入/刷新/删除域对象,这是一个好的设计吗?

Voi*_*son 4

Eric Evans,领域驱动设计:

(存储库的)实现会有很大差异,具体取决于用于持久性的技术和您拥有的基础设施。理想的情况是对客户端隐藏所有内部工作(尽管不是对客户端的开发人员),这样无论数据存储在对象数据库、关系数据库中还是简单地保存在数据库中,客户端代码都将是相同的。记忆....

实施的可能性如此多样,我只能列出一些需要记住的问题......

将交易控制权留给客户。尽管 REPOSITORY 会在数据库中插入和删除,但它通常不会提交任何内容。例如,保存后提交很诱人,但客户端可能具有正确启动和提交工作单元的上下文。如果 REPOSITORY 放手,事务管理将会更加简单。

也就是说;我特别提请您注意上述讨论中的一个重要短语:数据库。这里的基本假设是,所有被修改的聚合都以可以原子方式提交工作单元的方式存储。

如果情况并非如此,例如,如果您将聚合存储在不承诺多个文档的原子更新的文档存储中,那么您可能需要考虑在模型中明确这种分离,而不是试图掩盖事实上,您正在尝试协调多个提交。

对于读取用例使用一组存储库是完全合理的,这些存储库与写入用例中使用的存储库不同。换句话说,当我们有不同的语义时,我们应该有一个不同的接口,其实现可以根据需要进行调整。