问题标签 [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 回答
5121 浏览

asp.net-mvc - 在 ASP.NET MVC 中实现工作单元的方法

我目前正在研究如何将工作单元模式添加到我现有的使用 NHibernate 的 ASP.NET MVC 应用程序中。我在各种实现中看到了很多变化,我无法确定哪些方法在给定情况下最有效。

为了提供帮助,我想我会要求 Stack Overflow 社区列出他们最喜欢的在其 ASP.NET MVC 应用程序中实现工作单元模式的方法。

也许您在创建控制器时使用 IoC 实例化 NHibernate 会话,然后将其传递到存储库。或者,也许您创建了一个工作单元类/接口。在描述您的方法后,请不要犹豫链接到其他资源。

此外,如果存在与您的方法相关的任何优点和缺点,请务必列出。

0 投票
2 回答
1361 浏览

castle-windsor - 使用 Castle Windsor 的存储库类的适当生命周期

当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。

存储库给我的印象是一个具有单例生命周期的类。我应该有一个 FooRepository 的实例来在应用程序的生命周期中加载并将 Foos 保存到数据库中。

但是,每个存储库都包含对 UnitOfWork 的引用,它执行脏检查,与数据库一起工作等。 UnitOfWork 具有 PerWebRequest 的生命周期 - 将 UnitOfWork 作为单例完全没有意义,因为单例实例可以(例如)同时刷新多个用户会话所做的更改。

那么我有一个单例 FooRepository 持有对 UnitOfWork 的引用,它在会话结束时被释放!我什至不确定这会对存储库的行为产生什么影响,但这听起来不太好。

任何人都可以用简单的英语(好吧,也许用一些代码)解释在 Web 应用程序中管理 Repository 和 UnitOfWork 类的生命周期的适当方法吗?

0 投票
1 回答
547 浏览

asp.net-mvc - ASP.NET MVC/EF:我应该如何处理新实体的导航属性?

我的特定应用程序是使用实体框架的 ASP.NET MVC 应用程序。

我有一个对象 Entity0,其中包含对 Entity1 的引用(* 到 1)...

我在 Entity_0 中也有一些逻辑,但是这个逻辑要求 Entity_1 不能为空......

当通过控制器中的模型绑定创建 Entity_0 的新实例时,将设置 Entity_1_ID 属性,但是 Entity_1 导航属性保持为空,直到它被持久化到数据库中。

我需要调用 GetEntity_2() 并将 Entity_0 和 Entity_2 作为单个工作单元保存到数据库中。现在这意味着我必须在调用函数之前从存储库中手动检索 Entity_1 并将其分配给 Entity_0。

我考虑的另一个选项是使 Entity_1 成为 GetEntity_2 方法的参数,但是在其他任何时候调用该方法 Entity_1 都不会为空,因此需要一个参数是多余的。

所以显然现在一切正常,但我的问题是我是否违反了一些 OOP 设计规则,a)有一个可以抛出空引用异常的方法,或者 b)指定一个只应该使用的方法参数时间。

不得不手动分配导航属性真的让我很烦。我希望你们中的一些人对我如何改进这一点有一些建议。

谢谢!

0 投票
1 回答
5440 浏览

asp.net - ASP.NET MVC,Ninject,每个请求的单个实例对多个构造函数

我试图通过将工作单元实例传递到我的存储库来实现工作单元模式。

来自 Global.asax 的相关代码。


存储库构造函数:


我想要的SqlUnitOfWork是每个请求最多创建 1 个实例并将其传递到我的存储库中(通过它们各自的构造函数)。

绑定上的InRequestScope()方法够吗?IUnitOfWork如果不是我怎么能做到这一点?

0 投票
1 回答
467 浏览

c# - 我在这里使用正确的工作单元吗?(Entityi 框架 4 POCO)

我找到了一些关于如何使用 ef4 创建工作单元的示例,我没有使用过 di/ioc,我想保持简单,这是一个示例(90% 的灵感),我认为这没关系,但因为我正在看从现在开始使用的模式我想最后一次征求意见。

最后

如果 IUnitOfWork 和 IDisposal 摆脱后,CreateUser 看起来像这样:

0 投票
3 回答
963 浏览

mysql - Asp.Net MVC UNitOfWork 和 MySQL 和休眠连接

我有一个基于以下架构的 MVC Web 应用程序

Asp.Net MVC2、Ninject、Fluent NHibernate、使用工作单元模式的 MySQL。

每个到 MySQL 的连接都会生成一个睡眠连接,可以将其视为 SHOW PROCESSLIST 查询结果中的一个条目。

最终,这将产生足够的连接以超出应用程序池限制并使 Web 应用程序崩溃。

我怀疑连接没有正确处理。

如果是这种情况,应该在哪里以及如何发生?

这是我正在使用的代码的快照:

0 投票
1 回答
7757 浏览

c# - Entity Framework 4 - 在哪里放置“ApplyCurrentValues”逻辑?

我正在使用“存根技术”来更新我的 POCO(在分离的上下文中使用,ASP.NET MVC)。

这是我目前在我的控制器中的代码(有效):

如您所见,到处都有代码气味。:)

几点:

  1. 我基本上对所有东西都使用依赖注入(基于接口)
  2. 我使用工作单元模式来抽象 ObjectContext 并提供跨多个存储库的持久性
  3. 目前我的IUnitOfWork接口只有 1 种方法:void Commit();
  4. 控制器有IUserContentServiceDIIUnitOfWork注入
  5. IUserContentService调用Find存储库,它使用ObjectContext.

这是我不喜欢上面的代码的两件事:

  1. 我不想将IUnitOfWork 转换MySqlServerObjectContext.
  2. 我不希望控制器必须关心ApplyCurrentValues

我基本上希望我的代码看起来像这样:

有什么想法我该怎么做?(或类似的东西)。

我已经很聪明地根据类型(泛型的组合、复数形式)计算出实体集的名称,所以不要太担心。

我想知道最好的放置位置在ApplyCurrentValues哪里?将它放在接口中似乎不合适IUnitOfWork,因为这是一个持久性 (EF) 问题。出于同样的原因,它不属于服务。如果我把它放在我的MySqlServerObjectContext类中(有道理),我会从哪里调用它,因为没有任何东西可以直接访问这个类 - 当有东西请求时它是通过 DI 注入的IUnitOfWork

有什么想法吗?

编辑

我有一个使用存根技术的解决方案,但问题是如果我事先检索了我正在更新的实体,它会引发异常,说明具有该键的实体已经存在。

这是有道理的,虽然我不确定如何解决这个问题?

我是否需要“检查实体是否已附加,如果没有,请附加它?”

任何 EF4 专家都可以提供帮助吗?

编辑

没关系 - 找到了解决方案,请参阅下面的答案。

0 投票
3 回答
22905 浏览

nhibernate - 正确使用 NHibernate Unit Of Work 模式和 Ninject

我有以下实现,并希望得到一些关于它是否正确使用 NHibernate 进行会话和事务的反馈。

Ninject 绑定

下面是一个用法示例:

在我之前的实现中,我会像这样将 IUnitOfWork 注入到我的存储库构造函数中

但是 Dispose() 方法不会执行,导致后续调用抛出此异常:“无法访问已处置的对象。对象名称:'AdoTransaction'。”

0 投票
0 回答
730 浏览

linq-to-sql - 使用 SOA、UoW、Repository、DataContext 和多个数据库设计多租户应用程序

让我首先为这篇文章的长度道歉,但我想提供尽可能多的细节以增加答案的机会。提前致谢。

我正在向集成来自多个数据库的数据的现有应用程序添加新功能。简而言之,它允许客户和/或其会计师访问和更新有关其位置的财务信息。该应用程序有 3 层,带有一个 Web 客户端(我希望很快将其替换为 Silverlight 客户端)、一个在应用服务器上运行的服务层和一个数据库层。

当我获得所有权时,该应用程序尽管有 3 层,但非常简单。它对一切都使用 ADO.NET,Web 服务只是对其中一个数据库的动态(字符串)SQL 查询的传递。我的第一个任务是“清理”现有代码。该应用程序没有任何面向对象的内容,一切都是平坦的。我已经开始重构应用程序以利用 LINQ-to-SQL,实现了存储库模式以使业务逻辑可测试(更不用说随着我们将数据访问技术从 ADO.NET 发展到 L2S 并希望能够继续到Entity Framework)并重新编写代码以实际使用 .NET 的功能。

在大多数情况下,Web 应用程序是小菜一碟,因为每个页面都是对数据库中的表或视图的简单查询(通过 Web 服务)。在应用服务器端,我最终得到了每个数据库的 DataContext 和每个实体的 Repository(或使用 DDD 术语的聚合根)。我使用构造函数注入 (Castle Windsor) 为我的服务类以及存储库使用的 DataContext 设置正确的存储库实例。

这一切都很好,除了现在我必须将编辑功能添加到需要跨越 4 个数据库的逻辑的应用程序中,而我对正确的方法感到茫然。应用程序的流程和架构必须保持一致且可由初级开发人员维护,这一点至关重要。(除了我,团队基本上都是 VB6 开发人员,他们认为自己正在编程 .NET,因为他们使用 VS 和 BCL——他们对模式、实践、单元测试、模拟等知之甚少)</ p>

让我来看看使编辑视图工作所需的内容:

  1. 首次加载页面时,我会生成一个“可编辑”会计期间的列表。
    1. 此列表基于 SQL Server 数据库(称为“元数据”数据库)中包含的一组规则。表中的每一行都按名称标识会计期间以及可以编辑的时间范围。
    2. 这些规则用于查询 DB2 财务数据库中将期间名称和年份映射到实际日期的表。此查询将返回结束日期在过去和结束日期(结束日期加上上面的编辑长度)在今天之后的所有条目。
  2. 该页面将默认选定的时间段为最近的时间段。选择一个时间段后,我会触发另一个请求来填充当前用户在所选时间段内可以编辑的位置列表。
    1. 首先,我必须从“安全”数据库中查询用户的安全信息,并确定他们是否具有会计角色。如果是这样,那么我必须查询元数据数据库以检索当前用户的客户端列表。如果没有,那么我使用当前用户的 clientID。
    2. 接下来,我查询 DB2 财务数据库以获取位置列表,根据选定的时间段和用户可能访问的客户端 ID 列表进行过滤。我还根据状态进行过滤,因此我只返回在此期间处于活动状态的位置。
  3. 与期间一样,页面将默认选定位置为列表中的第一个位置。选择位置后,我会再次请求该位置在所选期间的实际财务数据。
    1. 这个请求是向“暂存”数据库发出的,非常简单。
  4. 如果用户选择不同的时期或位置,所有这些都会重复。

所以,让我们以 #2 为例,看看我应该如何使用工作单元和存储库模式在我的服务应用程序中实现这一点……哦,有一个问题——没有 LINQ-to-DB2,公司不会制造跳转到 EF,所以在使用该数据库时我只能使用 ADO.NET。但不要让这阻碍你,因为我想要一个尽可能与数据访问技术无关的解决方案,因为他们随时可能改变主意。事实上,就我目前所知,他们可以转变范式并转向 NHibernate。我更关心的是从服务外观到 DataContext,而不是如何实现 DataContext(或 ObjectContext)。

您能否引导我完成使用当前用户的凭据和选定的会计期间调用我的 Web 服务方法的实现,执行上面 #2 中概述的步骤并返回适当的位置列表?

唷......这是很多东西。我很感激帮助整理它。

0 投票
1 回答
759 浏览

c# - nHibernate - 跟踪“脏”属性以记录历史

我们目前在业务对象上使用我们自己的“工作单元”功能,但正在寻求迁移到 nHibernate 来管理我们所有的数据库持久性。由于 nHibernate 管理它自己的工作单元,有什么方法可以检查“脏”对象(刷新时),以便我们可以编写对数据所做更改的历史日志。

当然,如果事务会话很长,我们只感兴趣将属性的数据库值与持久化到数据库的新值进行比较,任何中间更改都不需要记录到数据库中。

有人有建议吗?