6

据我了解,UnitOfWork 类旨在表示域中业务事务的概念。它不应该直接代表数据库事务,这只是一种可能实现的细节。

问:那么为什么这么多关于工作单元模式的文档都提到“提交”和“回滚”方法?

这些概念对领域或领域专家毫无意义。业务事务可以“完成”,因此 UnitOfWork 应该提供“完成”方法。同样,不应该将其建模为“清除”而不是“回滚”方法吗?

更新:

答:以下两个答案都是正确的。它们是 UoW 的两个变体:对象注册和调用者注册。在对象注册中,回滚用于撤消对所有内存对象的更改。在调用者注册中,回滚用于清除所有记录的更改,以便后续调用 Commit 将不会执行任何操作。

4

2 回答 2

2

工作单元设计模式,至少如 Fowler 在企业应用程序架构模式中所定义的那样 - 是有关对象关系持久性映射的实现细节。它不是 Evans 的领域驱动设计中定义的实体。

因此,它既不应该是业务讨论的一部分,也不应该是直接暴露在领域模型中的实体——也许commit()方法除外。相反,它的目的是跟踪“干净”和“肮脏”的业务实体——来自领域模型的对象暴露给客户。目的是允许与域模型进行多次交互 - 在 Web 上下文请求中 - 无需每次都从持久性(通常是数据库)读取和写入。

业务实体在调用其方法时调用它。当他们的状态改变时,他们在工作单元中将自己注册为脏。然后工作单元commit()处理整个持久性事务,即写出对象图,并rollback()意味着将实体的状态恢复到它们原来的状态。因此,它的实现非常容易泄漏到“抽象”,但其意图非常明确。

另一方面,“撤消”和“完成”不一定与此定义一一对应。“撤消”或“清除”可能仅部分回滚对象图,例如取决于业务上下文。虽然“完成”很可能会改变某些实体的状态以及提交图表。因此,我会将这些具有业务意义的方法放在服务层或聚合根对象上。

于 2011-01-20T18:35:04.467 回答
1

我同意。我的猜测是它使用术语“回滚”和“提交”,因为它们确实是已知术语(并且确实揭示了意图,尤其是对程序员而言)。但是,我认为使用“完成”一词会更正确。关于“清除”,我不太同意你的看法。我认为任何领域专家都不会同意您“清除”业务交易。在我看来,“撤消”是一个更合适的术语。

于 2011-01-20T17:24:26.040 回答