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

时间:2018-02-21 10:55:45

标签: repository domain-driven-design repository-pattern unit-of-work ddd-repositories

在经历了多个堆栈溢出帖子和博客文章之后,我做出了这个决定,我们需要UnitOfWork design模式来保持事务完整性,同时将域对象写入各自的存储库。

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

1 个答案:

答案 0 :(得分:1)

Eric Evans,领域驱动设计:

  

(存储库的)实现会有很大差异,具体取决于用于持久性的技术和您拥有的基础结构。理想的是隐藏客户端的所有内部工作(尽管不是来自客户端的开发人员),因此无论数据是存储在对象数据库,关系数据库中还是仅仅保存在客户端代码中,客户端代码都不一样存储器....

     

实施的可能性非常多样化,我只能列出一些需要考虑的问题....

     

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

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

如果不是这种情况 - 例如,如果您将聚合存储在不承诺多个文档的原子更新的文档存储中,那么您可能需要考虑在模型中明确区分,而不是尝试伪装你试图协调多次提交的事实。

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