域驱动设计:处理原子操作和事务

时间:2012-07-25 20:08:21

标签: transactions domain-driven-design atomic

在每个聚合内部,必须保证一致性。在存储库中很容易实现,因为我总是可以使用数据库或框架中的事务。我怀疑存储库外发生了什么。服务可能需要使用多个聚合来处理请求。在服务处理期间或聚合持久存在时可能存在问题。

如果在服务处理期间出现问题,我可能会引发异常。那样操作就是原子的。这是我的第一个担忧。这是一个好习惯吗?我看到的问题是很难从中恢复。没有简单的方法可以将所有聚合保留在失败操作之前的状态。

我遇到的另一个问题是如果其中一个聚合无法持久化会发生什么。如何确保信息的一致性?我是否必须在存储库之外使用数据库事务?我认为它可能不是最好的解决方案,因为在设计域模型时我不应该在数据库中思考。

1 个答案:

答案 0 :(得分:3)

工作单元模式中提供了对此的解决方案 - http://martinfowler.com/eaaCatalog/unitOfWork.html

您可以根据需要将任意数量的聚合根操作封装到单个UOW中。然后,具体实现的工作单元可以包含其自己的提交和回滚逻辑,特定于持久性方法和所涉及的技术。例如,如果您在.NET中工作,则处理TransactionScope对象(http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx)。

这是一篇关于如何实现基本UOW模式的好文章 - http://msdn.microsoft.com/en-us/magazine/dd882510.aspx