5

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

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

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

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

你将如何实现这一点?

编辑:

好的,这就是我认为我实际上正在努力解决的问题。准备图案:)

最终该项目是 WPF MVVM。因此,我们正在查看模型以了解商店在这里的情况。

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

我想要完全的持久​​性无知,所以想象我的域包括一个客户、一个订单和订单行。

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

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

这听起来合理吗?它对我有用,我认为这是定义分离的地方。我很想在模型和存储库之间有另一个 API。不,这很愚蠢。

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

4

3 回答 3

6

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

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

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

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

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

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

最后,保持对存储库的访问权限仅通过您的工作单元进行访问,这使 API 对开发人员来说很简单。对于初学者,您只需要实例化 1 个对象(工作单元)而不是 1 个工作单元对象以及您可能需要的许多存储库对象。它使您的代码保持简单(恕我直言),并使开发人员更不容易出错。

于 2011-02-10T14:19:16.600 回答
2

没有更多细节很难确定,但我会考虑从IDbConnection接口和相关接口实现。它为您提供了一个大多数具有任何经验的 C# 编码人员都会熟悉的界面。

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

于 2011-02-10T14:00:25.937 回答
0

我将通过使用像 NHibernate 或实体框架这样的框架来实现这一点。:) NHibernate 允许您使用 POCO,并且已经为您完成了所有工作。

于 2011-02-10T14:01:58.533 回答