【问题标题】:Domain driven design: Handling atomic operations and transactions领域驱动设计:处理原子操作和事务
【发布时间】:2012-07-26 04:24:21
【问题描述】:

在每个聚合中必须保证一致性。在存储库中很容易做到这一点,因为我总是可以使用数据库或框架中的事务。我对存储库之外发生的事情表示怀疑。一项服务可能需要使用多个聚合来处理请求。在服务中的处理过程中或聚合持续存在时可能会出现问题。

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

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

【问题讨论】:

    标签: transactions domain-driven-design atomic


    【解决方案1】:

    工作单元模式提供了解决方案 - 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

    【讨论】:

    • uow 可以在一台机器上解决这个问题,但是如果聚合可以分布式,人们说分布式事务是邪恶的,我想知道 uow 在这种情况下如何帮助
    • 分布式事务与 UOW 或域中的任何事物无关。但是,正如我提到的,在 .NET 中,TransactionScope 处理分布式事务。
    • 我认为可能有更简单的方法。在蓝皮书中,一切看起来都简单而完美,但实际上却很复杂。我发现如果不使用不同的框架并在各处实现东西和层以将实体粘合在比贫血域模型“更清晰、更简单”的东西中,我发现几乎不可能实现体面的域设计。
    • @Pleonc - 这是非常正确的。但有时,为了避免一些过于复杂和冗长的实现,只打破一两个 DDD“最佳实践”是完全可以的。毕竟,我们正在处理真正的业务问题、真正的系统集成挑战和真正的最后期限。这些书是关于理论和最佳案例场景的。
    猜你喜欢
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2011-01-06
    • 1970-01-01
    • 2012-07-18
    相关资源
    最近更新 更多