工作单元,回滚选项

Ian*_*Ian 5 c# design-patterns unit-of-work

我正在尝试构建一个遵循存储库和工作单元模式的系统,以允许持久性无知/单元测试等.我正在寻找有关处理Rollback的建议.理想情况下我想使用POCO,但我想我可能至少需要实现一个接口来提供一些零碎的东西.

因此,假设我们有两个存储库,一个上下文/工作单元.

我添加一个项目,修改另一个项目并删除第三个项目.重复第二个存储库,然后我调用rollback.

在过去,我使用了类似于DataSet的东西.每个对象都有pendingNew,pendingAmended,pendingDeleted,clean状态.还有用于回滚的对象的最后一个持久版本的副本.

你会如何实现这个?

编辑:

好的,这就是我认为我实际上想要了解的问题.准备好图案:)

最终该项目是WPF MVVM.所以我们正在看模型到这里的商店.

我想我一直在尝试将模型与存储库的想法混为一谈,我认为模型应该使用UOW和存储库来提供模型需要提供的功能.这听起来更好吗?

我想要完全持久性无知,所以想象一下我的域名包括客户,订单和订单线.

GUI假设有一个按钮新订单,允许用户填写客户详细信息,订单详细信息和1-n OrderLine详细信息.他点击保存并进入数据库,他点击取消他们没有.

因此,在这种情况下,模型可能会向CustomerRepository询问客户,然后向OrderRepository询问新订单,然后询问每个新行的OrderLineRepository,然后告诉工作单元保存它们.

这听起来合理吗?这对我来说,我认为这是分离的定义.我很想在模型和存储库之间使用另一个API.不,那太傻了.

编辑2:这是一篇很好的文章,有点帮助.

Kal*_*exx 6

我设计了我的工作单元和存储库类,类似于MSDN上的描述.IUnitOfWork该类的基本思想是它处理所有数据库工作本身.

然后我添加了(到我的IUnitOfWork类和实现)一个BeginTransaction()方法,它打开一个TransactionScope()对象,然后添加一个EndTransaction(bool commit)方法.此方法通过将事务提交到数据库(如果为true)或回滚事务(如果为false)来处理关闭事务.

这允许我控制复杂的事务,允许回滚多个提交.

编辑: 我的想法是你希望你的UnitOfWork对象知道存储库,而不是相反.这是我的看法,你会发现喜欢相反的人,但这就是原因.

当您想以某种方式处理数据库时,您希望它们都受当前工作单元的限制.因此,对我来说,通过工作单元来访问您的存储库是合乎逻辑的,而不是让您的存储库访问您的工作单元.

如果您需要在不同的数据库上分支并执行多项操作(例如,如果历史数据写入与实时数据不同的数据库,或者您正在进行水平数据库分区),它也会更容易,因为每个数据库都有它是自己的工作单位.原因是如果您使存储库知道工作单元,您需要为每个数据库创建一个工作单元,以及您可能需要访问它的每个工作单元所需的每个存储库的副本.

最后,保持对您的存储库的访问只能通过您的工作单元访问,这使得开发人员可以简化API.对于初学者,您只需要实例化1个对象(工作单元)而不是1个工作对象单元加上您可能需要的许多存储库对象.它使您的代码保持简单(imho)并使开发人员更容易出错.