什么是工作单元模式的.net参考实现?

时间:2009-06-03 16:59:59

标签: c# nhibernate design-patterns orm unit-of-work

Unit of Work模式是一种保持在上下文中的方式,可以跟踪您域中的所有操作,并在您可能复杂的逻辑完成后立即应用它们。

当与ORM(例如NHibernate)一起使用时,使用用于基础数据库的每个操作的共享ISession(或Linq 2 Sql中的DataContext)来实现工作单元被认为是一种好习惯。

实现正确可能很棘手,特别是在处理服务器应用程序时,主要是ASP.Net MVC或ASP.Net Webforms。

我已经涉足Rhino.Commons(面向NHibernate)的实现,我知道其他几个,但没有很好地掌握它们的优点和缺点。

最常用的是什么,以及如何将它们无缝集成到ASP.Net MVC(或WebForms中,但我最感兴趣的是MVC)?

1 个答案:

答案 0 :(得分:3)

  

更新:我在回复后看到了这个(unit-of-work-pattern-in-net)。

也许System.Transactions.Transaction就是你所追求的。

工作单元是几年前最初应用于基于大型机的应用程序的术语。这些应用程序将执行一系列步骤。如果任何一个步骤失败,数据库将回滚到先前的“同步点”。在成功完成工作单元中的所有步骤后,应用程序将记录新的同步点。这些步骤就像一个单位。

这个比喻已经发展,所以在.NET中,我们有一个Transaction构造。在事务范围内对可恢复数据存储执行的工作作为一个单元执行,具有ACID属性。这些数据存储的示例可能是:任何现代RDBMS,排队系统(如MSMQ),或者在Windows上,文件系统或注册表(通过KTM)。当事务解决时,它将提交或回滚所有事务存储上的所有操作。

我不知道nHibernate或ISession构造。但是如果你使用传统意义上的“工作单元”这个词,那么我认为你想要的是一个交易。

至于将事务集成到ASP.NET MVC中 - 不确定这意味着什么。事务不关心UI模型是什么,或者您如何设计UI流控制。如果更新数据库(我想是“模型”),那么您可以选择在事务中包含该更新。仅当您有多个更新时才真正有意义,作为单个事务的一部分。另一方面,您不希望允许交易长时间保持开放状态。数据库上的锁定将导致争用并导致吞吐量下降。