C# 工作单元、回滚选项

C# 工作单元、回滚选项,c#,design-patterns,unit-of-work,C#,Design Patterns,Unit Of Work,我正在尝试构建一个遵循存储库和工作单元模式的系统,以允许持久性忽略/单元测试等。我正在寻找有关处理回滚的建议。理想情况下,我希望使用POCO,但我认为我可能至少需要实现一个接口来提供一些细节 假设我们有两个存储库,一个上下文/工作单元 我添加一项,修改另一项,删除第三项。对第二个存储库重复上述操作,然后调用回滚 在过去,我使用了类似于数据集的东西。每个对象都具有pendingNew、PendingMended、pendingDeleted和clean的状态。还有一个用于回滚的对象的副本最后一个持

我正在尝试构建一个遵循存储库和工作单元模式的系统,以允许持久性忽略/单元测试等。我正在寻找有关处理回滚的建议。理想情况下,我希望使用POCO,但我认为我可能至少需要实现一个接口来提供一些细节

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

我添加一项,修改另一项,删除第三项。对第二个存储库重复上述操作,然后调用回滚

在过去,我使用了类似于数据集的东西。每个对象都具有pendingNew、PendingMended、pendingDeleted和clean的状态。还有一个用于回滚的对象的副本最后一个持久化版本

您将如何实现这一点

编辑:

好的,这是我想我实际上是想让我的头。准备制作图案:)

最终,该项目是WPF MVVM。因此,我们正在研究这家商店的模型

我认为我一直在试图将模型与存储库的概念混为一谈,因为我认为模型应该使用UOW和存储库来提供模型需要提供的功能。听起来更好吗

我想要完全的持久性,所以假设我的域包括一个客户、一个订单和订单行

比如说,GUI有一个按钮new order,它允许用户填写客户详细信息、订单详细信息和1-n订单行详细信息。他点击保存,他们进入数据库,他点击取消,他们没有

因此,在这种情况下,模型可能会向CustomerRepository请求一个客户,然后向OrderRepository请求一个新订单,然后向OrderLineRepository请求每一行,然后通知工作单元保存这些订单

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


编辑2:这是一篇很好的文章,有点像。

如果没有更多细节,很难确定,但我会从
IDbConnection
接口和相关接口来研究实现。它为您提供了一个大多数有经验的C#编码器都会熟悉的界面


老实说,这实际上取决于存储机制的效率。如果它能有效地处理大量更改,那么最好让回滚机制构建一个执行回滚时应该采取的操作列表,该列表在“提交”时被丢弃。另一方面,如果更新成本很高,那么让事务机制维护提交时要执行的操作列表,这些操作在回滚时被丢弃。您还需要考虑其他代码是否应该在提交之前看到更新;使用前一种方法,他们会这样做,而使用后一种方法,他们不会这样做。

我将使用NHibernate或Entity framework之类的框架来实现这一点。:)
NHibernate允许您使用POCO,并且已经为您完成了所有的管道工作。

我设计了与描述类似的工作单元和存储库类。
IUnitOfWork
类的基本思想是它自己处理所有数据库工作

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

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

编辑: 我的想法是,您希望UnitOfWork对象了解存储库,而不是相反。这是我的观点,你会发现人们喜欢相反的观点,但原因如下

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

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


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

我的目标之一是在工作单元之外/后面为NHibernate和EF提供一个持久层。有两个项目,一个是真实世界的工作,另一个是原型测试平台,这是我目前正在进行的平台,以确定代码的形状。是的,我遇到了很多“视情况而定”,我完全理解这一点。我可以看到六种具体实现的方法,过去也有过,但它定义了我正在努力解决的抽象,特别是在这些模式的指导下。这是一篇好文章,我以前从未见过。我想我仍在为哪些类知道哪些其他类而挣扎,即存储库是否知道工作单元,工作单元是否知道所有存储库?事实上,这里有一个粘液