【发布时间】:2018-03-17 17:10:08
【问题描述】:
想象一下这样一种情况,应用层打开一个新事务,你想在这个事务下执行 2 个存储库操作。假设我想使用 IUserRepository 添加一个新用户,然后保存在用户域模型状态更改期间生成的所有事件。我在 ApplicationLayer (TransactionScope) 中打开一个新事务,然后执行这两个操作。但是如果明天我想将存储库实现更改为 FileBasedRepository 或 HttpCloudRepository。存储库不知道它们在某些事务下运行的事实,还是应该知道? 主要问题是关于抽象的。我们都努力编写基于抽象的代码。我看到的是,如果我实现了一个工作单元并使用应用层中的 2 个存储库更新了 2 个聚合(存储库与 MSSql 一起使用),明天我无法将其中一个存储库实现更改为基于 http 或基于内存。问题是如何编写这样的代码。似乎我必须为事务创建一个抽象并自己为 HttpUnitOfWork 实现回滚。感觉我最初的工作单元与 db 紧密耦合,应该重命名为 DbUnitOfWork。但这又错了,因为没有完全不支持事务的 sql 数据库。
【问题讨论】:
-
你认为他们应该知道吗?
-
不,我认为他们不应该。
-
这个问题是 CQRS 特有的还是一般 DDD 上下文中的问题?
-
不,它一般适用于 DDD,NLayered 架构。但它也适用于 CQRS。
-
在我看来,CQRS 是一个特例。在您的示例中,这两个操作实际上只是一个,应该明确说明。
save操作具有这样的签名,很明显 Aggregates 状态与生成的事件非常耦合。换句话说,CQRS 存储库不是经典的 DDD 存储库。 CQRS 非常适合 DDD,但它的风格与经典风格截然不同。事件是一等公民,应该在整个代码库或框架中明确声明。
标签: architecture repository domain-driven-design cqrs