gpt4 book ai didi

c# - 工作单元、回滚选项

转载 作者:太空狗 更新时间:2023-10-29 22:55:10 26 4
gpt4 key购买 nike

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

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

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

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

您将如何实现?

编辑:

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

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

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

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

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

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

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

编辑 2:这是一篇优秀的文章,有点 helped一点点。

最佳答案

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

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

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

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

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

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

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

关于c# - 工作单元、回滚选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4957902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com