问题标签 [unit-of-work]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1779 浏览

.net - 工作单元实施

我已经能够实现一个很酷的工作单元来使用实体框架。

我想出了..

我很确定现在每个人都嫉妒这个工作单元。(开玩笑)

但是我在这个服务层有一点设计问题。

问题是工作单元需要数据库注入,所以我无法创建它的实例。我不能直接在服务层中提供工作单元,因为这没有任何意义,因为工作单元需要是一次性的。

而且因为我使用存储库来添加我的东西,所以不需要直接访问工作单元,无论如何都会在处理它时自动进行保存。

我可以在我的服务层中注入 IDatabaseFactory,但我的想法是不要在那里使用它。实际上服务层不应该知道它。

UnitOfWork 工厂怎么样?

关于如何解决这个问题的任何想法或建议?

谢谢。

0 投票
1 回答
163 浏览

linq-to-sql - LINQ to SQL 是否仅支持单个工作单元,或者我可以保留上下文并执行下一步操作?

我有一个 Windows 应用程序。我正在尝试通过 DataContext 插入记录。它在表中具有唯一标识符。即使我在插入后执行触发器。因此,我在触发器末尾进行选择查询以获取自动生成器编号并避免自动同步错误。因为它是一个 Windows 应用程序,所以我可以将 Context 保留很长时间。当我创建一个新对象(例如订单)并执行相同的先前操作时,在 SubmitChanges 操作时,它显示不能有重复键。为什么我不能使用相同的上下文来插入第二条记录?或者我需要创建一个新的上下文来插入一个新的记录吗?(这个工作单元概念是否出现在这里?)。创建新上下文是个坏主意,因为我需要再次加载所有数据..

任何想法?

一些代码示例来解释我的情况:

很多这样的设置...

正如我上面提到的,这是在 Windows 窗体上单击 Open Ticket 按钮。我在该表单上可用的文本框中更改了 fname、lname 和 all 的值,然后单击了相同的按钮。所以它会再次调用相同的方法。我收到以下指定的错误:

System.Data.Linq.DuplicateKeyException:无法使用已在使用的键添加实体。

0 投票
2 回答
183 浏览

design-patterns - 在控制器和服务之间实现外观服务是个好主意吗?

在我在每个服务类方法中使用一个工作单元以执行操作和应用程序逻辑的场景中。在控制器和服务之间实现外观服务是个好主意吗?这个想法是能够在一个事务中使用许多服务,而无需使用多个工作单元。

谢谢。

0 投票
1 回答
2852 浏览

unit-of-work - 我应该在哪里使用工作单元?为什么?

我想知道我应该在哪里使用工作单元?为什么?

  • 存储库级别?但是,如果您需要 2 个存储库怎么办?
  • 服务水平 ?但是如果您需要重用其他服务方法怎么办?
  • 控制器级别 ? 但是,如果您不想在控制器中添加任何逻辑怎么办?

想知道它在哪里最好看,应该在哪里使用。我正在使用类似的实现:

(我正在使用带有实体框架的 ASP.NET MVC 3)

谢谢。

0 投票
1 回答
5527 浏览

linq - System.Data.Linq.DuplicateKeyException:无法使用已在使用的键添加实体

我的是windows应用程序。我正在尝试通过 LINQ DataContext 插入记录。它在表中具有唯一标识符。即使我在插入后执行触发器。所以我在触发器结束时进行选择查询以获取自动生成器编号并避免自动同步错误。因为它是一个 Windows 应用程序,所以我可以长时间保留上下文。当我创建一个新对象(例如订单)并执行相同的先前操作时,在 SubmitChanges 操作时,它显示不能有重复键。我不能使用相同的上下文来插入第二条记录吗?或者我需要创建一个新的上下文来插入一个新的记录吗?(这个工作单元概念是否出现在这里?)。创建新上下文是个坏主意,因为我需要再次加载所有数据..

任何想法?

让我放一些代码示例来表达我的情况。

很多这样的设置...

正如我上面提到的,这是在 Windows 窗体上单击 Open Ticket 按钮。我在该表单上可用的文本框中更改了 fname、lname 和 all 的值,然后单击了相同的按钮。所以它会再次调用相同的方法。我收到以下指定的错误。System.Data.Linq.DuplicateKeyException:无法使用已在使用的键添加实体。

谢谢。

0 投票
2 回答
3887 浏览

.net - 工作单位模式

我正在寻找有关工作单元模式的一些建议。

工作单元上的提交是多次调用还是只调用一次然后将对象留给垃圾收集?

注入工作单元是一个好主意,还是在要求对象执行某些工作时应该在方法调用中传递它?

0 投票
2 回答
9191 浏览

transactions - 回滚是否可以在 DB2 中没有保存点的情况下工作?

这个问题与这个问题部分相关

为什么我的事务在使用以下 SQL 时没有回滚:

正如我从 DB2/iSeries 文档中了解到的:

ROLLBACK 语句用于结束一个工作单元并撤销该工作单元所做的数据库更改。

什么是工作单元开始或结束的指标?在上面提到的例子中会回滚什么?

我将非常感谢所有答案和链接。

PS。我正在使用 DB2/iSeries V5R4。

聚苯乙烯。对不起,我的英语不好

0 投票
2 回答
5298 浏览

java - 单线程任务而不排队进一步的请求

我需要异步执行任务,同时丢弃任何进一步的请求,直到任务完成。

同步该方法只是将任务排队并且不会跳过。我最初想使用 SingleThreadExecutor 但也将任务排队。然后我查看了 ThreadPoolExecutor,但它读取队列以获取要执行的任务,因此将执行一项任务,并且至少有一项任务排队(其他任务可以使用 ThreadPoolExecutor.DiscardPolicy 丢弃)。

我唯一能想到的就是使用信号量来阻塞队列。我提供了以下示例来展示我想要实现的目标。有没有更简单的方法?我错过了什么明显的东西吗?

样本输出

采用 axtavt 的答案并转换上面的示例给出了以下更简单的解决方案。

0 投票
3 回答
6604 浏览

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

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

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

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

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

你将如何实现这一点?

编辑:

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

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

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

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

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

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

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

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

0 投票
1 回答
293 浏览

nhibernate - 多个 ViewModel 修改同一个域对象

对不起我的英语不好。

我之前将这个问题发布为:多个 ViewModels 请求相同的域对象,我应该给它们相同/不同的实例吗?

在对此进行了一些研究之后,我意识到我以前的问题太混乱了,所以我发布了这个新问题。

假设我想构建一个 WPF 桌面应用程序来管理 10 亿人的信息。它只有一个最终用户(我),所有数据都存储在我的本地机器(SQL Server / MySQL)中。我将使用 Visual Studio、Autofac、NHibernate,并尝试实现 MVVM、DI、DDD 模式。

同一个人可以同时显示在 UI 的任何位置:在多个窗口、选项卡、列表、组合框、文本块中……每个列表可以包含几千个人,整个应用程序可以有 10~100 个列表。并且列表的内容(人)会经常更新:每次我更改列表的设置时,列表都会被清空,然后又会填充数千个新人

问题是:如果我在一个列表中修改一个人(例如更改姓名),如何将更改应用于所有其他列表?

我认为有两种方法可以解决这个问题:

  1. 对于每个人,在整个应用程序中使用一个实例。为了实现这一点,我可以通过应用程序使用单个 UnitOfWork,但似乎这种方法会导致内存泄漏。

  2. 为每个人使用多个实例(每个列表一个实例)。为了实现这一点,我认为我应该为每个列表使用一个 UnitOfWork,并且我必须找到一种方法来同步一个人的所有实例。Berryl提到了事件聚合器。但谁负责发布和注册活动?

我在这里发现了一个非常相似的问题,并且还阅读了以下文章,但我仍然感到困惑:

谢谢!