问题标签 [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 投票
2 回答
4200 浏览

c# - 将 UnitOfWork 与存储库模式一起使用

FluentNHibernate 非常新,但我也对该领域感到兴奋。我最近开始使用上述方法开发一个新的 DAL,并且一直在阅读存储库模式。我喜欢这种模式采用的通用形式,并希望将此模式与 UnitOfWork 模式结合使用来进行会话管理。

我很好奇,这是正确的前进方向吗?我应该使用 UoW 创建一个伪单例 NHibernate 会话吗?这个问题确实围绕着 NHibernate 会话管理的主题跳舞。我已经查看了一个可用的UoW 实现,尽管我也不清楚我是否应该努力实现这个库,或者抽象我自己的。

编辑:

只是为了重新澄清问题:

在 FluentNHibernate 环境中将 UoW 模式与存储库模式一起使用是常见的做法吗?

0 投票
3 回答
3389 浏览

database - 关于数据库对象的工作单元是什么?

用外行的话来说,关于数据库对象的工作单元是什么?我正在研究如何将数据库表转换为 C# 类,并且经常遇到这个术语,但似乎每个人都将其描述为好像您应该已经知道它是什么一样。

0 投票
1 回答
158 浏览

database - 工作单元 - 在网络场中存储临时对象的最佳方法是什么?

我需要设计和实现类似于 Martin Fowler 所说的“工作单元”模式的东西。我听说其他人将其称为“购物车”模式,但我不相信需求是相同的。

具体问题是用户(和我们的 UI 团队)希望能够在创建父对象之前创建和分配子对象(在数据库中具有参照完整性约束)。我今天遇到了我们的另一位设计师,我们提出了两种替代方法。

a) 首先,在数据库中创建一个 dummy parent 对象,然后创建 dummy children 和 dummy assignments。我们可以使用否定键(我们的正常键都是肯定的)来区分数据库中的绵羊和山羊。然后当用户提交整个交易时,我们必须更新数据并添加和对齐真正的键。

我看到这个有几个缺点。

  • 它会导致对索引的扰动。
  • 我们仍然需要想出一些东西来满足对具有它们的列的唯一约束。
  • 我们必须修改许多现有的 SQL 和生成 SQL 的代码,以便为许多 WHERE 子句添加另一个谓词。
  • 可以更改 Oracle 中的主键,但这是一个挑战。

b) 为需要能够参与这些反向事务的对象和分配创建瞬态表。当用户点击提交时,我们生成真正的条目并清除旧条目。

我认为这比第一个替代方案更干净,但仍然涉及增加的数据库活动级别。

如果会话在用户执行提交或取消请求之前丢失,这两种方法都要求我有某种方法来使瞬态数据过期。

有没有人以不同的方式解决了这个问题?

在此先感谢您的帮助。

0 投票
1 回答
509 浏览

entity-framework - 存储库模式与工作单元或 ActiveRecord 的一致性如何

虽然我没有做完整的 DDD,但我发现存储库模式很有吸引力,并且我确实尝试沿聚合根边界对存储库进行分段。我在实体框架之上实现存储库,这里 ObjectContext 允许工作单元样式,因为它跟踪实体的更改,并在调用 SaveChanges 时生成适当的 SQL。

我在我的存储库中使用两种不同的方法来解决何时调用 SaveChanges 的问题——区别似乎在于我是采用工作单元还是活动记录语义。如果我将存储库接口定义为如下所示:

和 IUnitOfWork 是

然后在 Add(T entity) 实现中,我似乎有两个选择:

或者

在前一种情况下,存储库的 Add 方法在每个操作上发送 SQL。在后一种情况下,调用代码负责从存储库中获取工作单元,并在认为合适时调用 SaveChanges。这允许工作单元跨越不同的存储库(我确保每个存储库在其构建中获得相同的工作单元)。

我的直觉是第二种方法更灵活。采用工作单元模式还意味着对实体的更新会更好一些,因为调用代码只需更新存储库返回的实体的属性,然后调用 UnitOfWork.SaveChanges。

在使用存储库模式时,一种方法通常优于另一种方法吗?

0 投票
1 回答
364 浏览

design-patterns - 我要写“工作单元”,请帮我找出所有的噱头

我打算用 C# 编写我自己的 DAL。我决定使用“工作单元”模式(接下来称为 uow),请求作为范围和身份映射存储在 HttpContext.Items 中。

我现在对实施 CRUD 方法有疑问。它们是如何/在哪里实施的?它们是在每个业务类中实现(如在活动记录模式中)还是在 uow 类中以某种方式实现(如果是,如何实现)?

我还假设我不仅需要将请求用作范围,还需要将数据库连接用作范围。但是怎么做?我应该在请求开始时打开连接并在处理时关闭它吗?

非常感谢每条建议,尤其是您的“真实世界”体验。

谢谢你们 :)

0 投票
2 回答
11279 浏览

linq-to-sql - 使用 IoC、依赖注入、工作单元的 Linq to SQL 的存储库模式

似乎有很多关于为 Linq to SQL 实现存储库模式的示例。其中大部分以 IRepository 和 DI 为特色;有些已经实施了工作单元,有些没有。我试图阅读 SO 和 Google 在 Linq to SQL 存储库模式上搜索返回的大部分结果。尽管如此,我还没有遇到一个完整的解决方案。

根据我的阅读,我实现了一个存储库模式,如下所示:

存储库模式
(来源:sites.google.com 上的 baburajpb

我正在使用 DI 注册存储库所依赖的接口:

存储库模式的实现:

IRepository 通用接口:

Repository 类通过 IRepository 的实现(未显示)实现如下,并且依赖于 DI 负责的 IDataContextFactory:

使用 IoC 使用存储库:

我将查询结果作为业务对象的集合返回,以避免在我使用存储库的应用程序层上依赖 Linq to SQL。上述场景适用于我使用 MVVM 模式的 WPF 应用程序。我有 ViewModel aks Presenter 类,它们不依赖于 Linq-SQL 生成的类。

如何扩展此模式以便将数据保存到数据库。我想将业务对象传回存储库并保存它们。可能吗?在这种情况下如何实现工作单元。

0 投票
2 回答
1496 浏览

asp.net-mvc - nhibernate 和 asp.net mvc 中每个请求的工作单元和会话

我一直在将 ncommon 框架 ( http://code.google.com/p/ncommon/ ) 与 nhibernate 和 asp.net mvc 一起使用。我真的很喜欢工作单元模式的实现,但是在我的视图中遇到了延迟加载的问题。我正在寻找如何使用 ncommon 实现每个请求模式的会话,或者查看另一个支持的框架:

  1. linq 休眠
  2. 工作单位模式
  3. 每个请求模式的会话以支持视图中的延迟加载

非常感谢任何提示。

0 投票
3 回答
2139 浏览

repository - 用于多个存储库的非平凡 CRUD 操作的工作单元

我已经看到使用以下代码实现的工作单元模式:

然后有一些方法可以将实体添加到这些 HashSet 中的每一个。

在 Commit UnitOfWork 为每个实体创建一些 Mapper 实例,并从一些想象的 Mapper 调用 Insert、Update、Delete 方法。

这种方法对我来说的问题是:Insert、Update、Delete 方法的名称是硬编码的,所以这样的 UnitOfWork 似乎只能执行简单的 CRUD 操作。但是如果我需要以下用法怎么办:

现在三 HashSet 方法失败了,因为我只能为插入、更新、删除操作注册 A 和 B 实体,但我现在需要这些自定义操作。

所以似乎我不能总是堆叠存储库操作,然后用UnitOfWork.Commit();

如何解决这个问题呢?第一个想法是 - 我可以存储方法的地址

在 UoW 实例中并执行它们,uow.Commit()但我还必须存储所有方法参数。这听起来很复杂。

另一个想法是让存储库完全感知 UoW:在DoSomeNonSimpleUpdateHere我可以检测到有一个 UoW 正在运行,所以我不执行DoSomeNonSimpleUpdateHere但将操作参数和“待定”状态保存在存储库实例的某个堆栈中(显然我无法保存UoW 中的所有内容,因为 UoW 不应依赖于具体的存储库实现)。然后我在 UoW 实例中注册相关的存储库。当 UoW 调用Commit时,它会打开一个事务,并为每个待处理的存储库调用诸如 Flush() 之类的东西。现在 Repository 的每个方法都需要一些东西来进行 UoW 检测和操作延迟以供以后使用Commit()

所以简短的问题是 - 在 UoW 的多个存储库中注册所有待处理的更改然后Commit()在单个事务中注册它们的最简单方法是什么?

0 投票
1 回答
570 浏览

c# - 关于使用 NHibernate 和/或 Web 服务的 UnitOfWork 的建议

我正在为以下内容寻求一些建议。

我需要创建一个可在数据库和 Web 服务之间互换的 DAL。我正在使用 C# 和 WPF 进行开发。

有没有人看到任何好的 IUnitOfWork 实现并允许使用某种 DI 切换不同的 DAL?

编辑

所以在做了一些阅读之后。我决定使用存储库模式。代表模式采用 IUnitOfWork。上面的内容相反。这也是我所说的开关输入或输出的一个例子。

所以我想我需要 IUnitOfWork 方面的帮助。Web 服务存储库会很棘手。那么如何创建某种事务,以及如何排队等。

最后一件事,在 WPF 环境中,多个线程可能会将内容保存到数据库中,因此是否应该为每个线程创建自己的 UnitOfWork?我害怕一个线程可能会在另一个线程中提交等等。

0 投票
2 回答
3077 浏览

c# - asp.net mvc 应用程序中的工作单元模式

我一直在看这个名为“NHibernate 和工作单元模式”的优秀博客,并且有一个关于在 asp.net mvc 项目中使用 UnitOfWork.Start 的最佳位置的问题。

我的 SLN 分为以下项目:-

我有一个界面: -

我有一个具体的实现

我的问题是我是否使用 using(UnitOfWork.Start()) 将所有方法包装在所有存储库中,还是有更好的方法?

我正在使用 nHibernate,asp.net mvc。