据我了解,UnitOfWork类旨在表示域中业务事务的概念。它并不直接表示数据库事务,这只是一个可能的实现的细节。
问:那么为什么关于工作单元模式的大量文档会引用“提交”和“回滚”方法?
这些概念对域或域专家毫无意义。业务事务可以“完成”,因此UnitOfWork应该提供“完整”方法。同样,它不应该被建模为“清除”而不是“回滚”方法吗?
更新
答案:以下两个答案都是正确的。它们是UoW的两种变体:对象注册和呼叫者注册。在对象注册中,Rollback用于撤消对所有内存中对象的更改。在调用者注册中,Rollback用于清除所有记录的更改,以便后续调用Commit将不执行任何操作。
答案 0 :(得分:2)
工作单元设计模式,至少由Fowler在Patterns of Enterprise Application Architecture中定义 - 是关于object- 关系持久性映射的实现细节。它不是Evans'Domain Driven Design中定义的实体。
因此,它既不应该是业务讨论的一部分,也不应该是在域模型中直接暴露的实体 - 可能除了commit()
方法之外。相反,它的目的是跟踪“干净”和“脏”的业务实体 - 来自域模型的对象暴露给客户端。目的是允许在Web上下文请求中与域模型进行多次交互,而无需每次都从持久性(通常是数据库)读取和写入。
业务实体在调用方法时调用它。当他们的国家被改变时,他们将自己注册为工作单位。然后,工作单元commit()
在写出对象图时处理整个持久性事务,rollback()
表示将实体状态恢复到它们的状态。所以它的实现很大程度上渗透到了“抽象”,但它的意图非常明确。
另一方面,“撤消”和“完成”不一定与此定义一一对应。 “撤消”或“清除”可能仅部分地回滚对象图,例如取决于业务上下文。虽然“完成”可能正在改变某个实体的状态以及提交图形。因此,我将这些具有商业意义的方法放在服务层或聚合根对象上。
答案 1 :(得分:1)
我同意。我的猜测是它使用术语“回滚”和“提交”,因为它们确实是已知的术语(并且确实揭示了意图,特别是对程序员而言)。但是我认为使用“完整”一词更为正确。关于“清除”,我并不倾向于同意你。我认为任何领域专家都不会同意您“清除”商业交易。在我看来,“撤销”是一个更合适的术语。