问题标签 [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.
c# - 工作单元和存储库模式
我有一个使用 NHibernate 的存储库模式设置。基类如下所示:
如您所见,我允许通过构造函数填充工作单元(使用 StructureMap)。我在我的 ASP.NET Web 服务上填充存储库对象,如下所示:
正如您可能推断的那样,我的问题是通过设计,我现在已经失去了对工作单元生命周期的控制。以前,我将工作单元设为上下文敏感对象,存储库将通过以下方式获取对它的引用:
以前的设计允许我通过在 using 语句中从 UnitOfWorkFactory 创建工作单元来控制代码中工作单元的生命周期。我试图将更多的工作交给 IoC 容器,但我认为我实际上倒退了一步。您对这两种实施方式有何看法?
c# - 工作单元和存储库模式之间的交互
在阅读了大量文章后,我仍然不确定与存储库交互时工作单元模式的职责。
存储库负责加载和保存聚合根实体,因此请考虑以下示例代码:
工作单元接口将使用以下方法定义:
假设存储库是使用非常简单的 SQL 映射器实现的,因此 FindByName 包含一些直接返回 ARoot 的 SQL,Save 实现看起来像这样:
然后,工作单元提交代码将构造所有必需的 SQL 以将实体映射回数据库?
问题2)
如果我将聚合根添加到工作单元中,工作单元是负责持久化根及其子实体,还是应该是存储库的 Save 方法将更改的实体添加到工作单元中?例如
或者......或者
工作单元是否只处理聚合根,并在提交时为其更改集中的每个对象调用存储库 Save 方法,保留 SQL 映射代码以将实体持久存储在存储库中,将第一个代码示例更改为
谢谢,
詹姆士
asp.net-mvc - 如何在 MVC 中实现工作单元:责任
谁有责任
谁负责在 MVC 架构中启动和完成工作单元?
repository-pattern - 在服务层或存储库层管理事务?
我有一个特定的场景,其中插入和更新是基于一些约束在多个表上完成的。所以在这些场景中使用事务范围是很自然的。现在,我有一个存储层和一个服务层。服务层调解存储库和 UI,并且是持久无知的。现在我很困惑在服务层或存储库层中使用事务的位置。我没有使用任何 ORM。我还看到有人提倡这种情况下的工作单元模式。有没有适合我当前场景的工作单元模式的例子,我看到的所有例子都是使用 ORMS。
谢谢,
winforms - 在 WinForms MDI 中使用具有存储库模式的实体框架
我们即将启动一个与前一个项目类似的新项目。我可以复制旧设计,但我对旧设计不太满意。
它是建立在 .Net 3.5 (Winforms MDI) 之上的“标准”业务系统(销售、盘点、仓储等),后端有实体框架。
所有表单都继承自基本表单(继承 Windows.Form)。该表单公开了一个名为 ObjectContext 的属性,该属性在第一次调用时会实例化一个新的 ObjectContext。我认为这构成了一个非常好的 UnitOfWork,在每种形式中都隔离了所有数据访问。
然而。
我已将所有查询和常见的 CRUD 封装在“可怜的人存储库”中。这些存储库作为 ObjectContext 的属性公开。
因此,如果我想绑定并订购一个表单,我会调用 OrderLinesGrid = ObjectContext.OrderRepository.GetOrderLinesByID(orderID)。
OrderRepository 获取对为表单创建的 objectcontext 的引用,如下所示
(在我的部分 ObjectContext 类中)
我不喜欢的是:
对存储库的调用是通过 ObjectContext 进行的。因此,我没有得到我想要的查询和数据访问层之间的抽象。
对于我的域中的每种新类型,我需要在我的 ObjectContext 中创建一个属性
我对 OrderRepository 的调用应该只返回域对象,而不用担心它是如何持久化的。此外,我不能让每个存储库都有它自己的 ObjectContext,因为这需要我在将 Country 引用到 Order.Country 属性时附加和分离对象。
我将不胜感激有关此设计的任何想法和反馈 :)
.net - 不确定如何在 WinForm 应用程序中使用依赖注入 + 存储库模式 + 工作单元模式
(为文字墙道歉...... :))
概括
在我的 Winfor 应用程序中使用依赖注入会创建大量的存储库上下文。我不确定我使用它的方式是对还是错,或者常见的做法是什么。
细节
在过去的 6 个多月里,我一直在制作 ASP.NET MVC 应用程序,这些应用程序使用存储库模式实现了 Unit Of Work 模式。最重要的是,我一直在对所有这些 Web 应用程序使用依赖注入并取得了一些成功。
所以这是我连接我的存储库的一个例子。
好的 - 效果很好。这里要注意的主要是
- 我假设生命周期是 Web 场景的正确生命周期。
- 上下文将只存在一次,每个请求命中网络服务器。
科尔。
现在,对于我的 WinForm 应用程序,我最初创建了一个单一的工作单元对象(还没有依赖注入),并不断地将这个婴儿传递给所有服务(然后传递给存储库)。
对于这个 win 应用程序,它会访问数据库以找出它需要解析的所有文本文件。(例如 25 个文件)。然后,对于每个文件,它创建一个新的解析器,读取每一行并将解析的数据放入数据库表中。美好的。
问题是,所有解析器都共享此上下文,这在整个商店中都严重引发了错误。
然后我添加了一些依赖注入并使用上面的注册表代码。Sorta 同样的事情 - 很多严重的错误。这是因为再次为单线程-> winform 创建了一个上下文。
因此,我现在将上下文注册表调整为以下内容:-
因此,对于 WinForm 应用程序,它现在不设置生命周期。我认为这创造了大约 160 个左右的上下文!(但它也没有真正出错)。
所以,我不确定这是否是正确的做事方式。
所以我的应用程序实际上有 25 个不同的计时器,每 .. 说 .. 10 秒检查一个文件。如果有新数据,它会解析它。否则,请在 10 秒后返回。
每一个被解析的文件都应该是它自己的线程吗?然后为每个线程创建一个上下文?(我觉得类似于网络场景)。或者这样好吗?我知道它有很多上下文,但是每个上下文并不意味着与数据库的实时连接..并且使用连接池,这应该不是问题。
它有这么多上下文的原因是因为下面的代码......(这些是一些存储库类的单独构造函数......)
对于主要服务...
因此该服务需要一个 UoW 并且每个存储库也需要一个 ..这意味着正在为每个存储库创建一个新的。
我确定我的结构不正确...
任何建议将不胜感激!
c# - 使用 Unity for Work/Repository 模式创建实体框架对象
我正在尝试实现工作单元/存储库模式,如下所述:http: //blogs.msdn.com/adonet/archive/2009/06/16/using-repository-and-unit-of-work-带有实体框架的模式 4-0.aspx
这要求每个 Repository 接受 IUnitOfWork 实现,例如使用部分类扩展的 EF 数据上下文以添加 IUnitOfWork 接口。我实际上使用的是 .net 3.5,而不是 4.0。我的基本数据访问构造函数如下所示:
到目前为止,一切都很好。
我想要做的是使用 Unity 框架添加依赖注入。
使用 Unity 创建 EF 数据上下文是一次冒险,因为它在解析构造函数时遇到了麻烦——我最终所做的是在我的分部类中使用新的重载构造函数创建另一个构造函数,并用[InjectionConstructor]
.
(我知道我需要将连接字符串传递给基础对象,它可以等到所有对象都正确初始化后)
因此,使用这种技术,我可以愉快地将我的实体框架对象解析为 IUnitOfWork 实例:
伟大的。我现在需要做的是为 DataAccessLayer 创建对存储库对象的引用——DAL 只需要知道接口,所以我猜我需要将它实例化为 Unity Resolve 语句的一部分,并将其传递给适当的IUnitOfWork 接口。
过去,我只是将数据库连接字符串传递给 Repository 构造函数,然后它就会消失,创建一个本地实体框架对象并仅在 Repository 方法的生命周期内使用它。这是不同的,因为我在 Unity Resolve 语句期间创建了一个实体框架实例作为 IUnitOfWork 实现,并且我需要将该实例传递给存储库的构造函数 - 这可能吗?如果可以,如何?
我想知道是否可以将存储库设为属性并将其标记为依赖项,但这仍然无法解决如何使用正在解决 DAL 的 IUnitOfWork 对象创建存储库的问题
我不确定我是否正确理解了这种模式,并且很乐意就实现它的最佳方式提出建议 - 实体框架仍然存在,但如果不是最好的方法,Unity 可以被换掉。如果我把整个事情颠倒了,请告诉我
.net - Unity 框架 - 重用实例
没有人喜欢我关于这个的第一个问题: Creating Entity Framework objects with Unity for Unit of Work/Repository pattern
因此,我设法将其改写为您可以阅读而不会入睡/失去生存意愿的内容。
我正在创建一个对象 DataAccessLayer,它在构造函数中采用 2 个接口:IUnitOfWork 和 IRealtimeRepository:
现在,实现 IRealtimeRepository 的构造函数也接受一个 IUnitOfWork 参数:
然后在 Unity 容器设置中添加两个实现:
发生的情况是 Unity 创建了 2 个新的 IUnitOfWork 实例(实际上是一个实体框架数据上下文),一个用于 DataAccessLayer 构造函数,一个用于 DemoRepository 构造函数
由于这适用于工作单元模式,因此重用相同的实例非常重要。有任何想法吗?我看到以前有人问过类似的问题,但没有被接受
.net - 为什么这两条sql语句会死锁?(包括死锁图+详细信息)
我有以下死锁图,它描述了两个相互死锁的 sql 语句。我只是不确定如何分析这个问题,然后修复我的 sql 代码以防止这种情况发生。
主要死锁图
alt text http://img140.imageshack.us/img140/6193/deadlock1.png 点击这里查看大图。
左侧,细节
alt text http://img715.imageshack.us/img715/3999/deadlock2.png 点击这里查看大图。
右侧,细节
alt text http://img686.imageshack.us/img686/5097/deadlock3.png 点击这里查看大图。
原始死锁模式 xml 文件
表架构
替代文字 http://img509.imageshack.us/img509/5843/deadlockschema.png
LogEntries 表详细信息
替代文字 http://img28.imageshack.us/img28/9732/deadlocklogentriestable.png
已连接的客户端表详细信息
替代文字 http://img11.imageshack.us/img11/7681/deadlockconnectedclient.png
代码在做什么?
我正在同时读取多个文件(例如,对于这个例子,我们说 3 个)。每个文件包含不同的数据但相同类型的数据。然后我将数据插入LogEntries
表中,然后(如果需要)我从ConnectedClients
表中插入或删除某些内容。
这是我的sql代码。
现在每个文件都有自己的UnitOfWork
实例(这意味着它有自己的数据库连接、事务和存储库上下文)。所以我假设这意味着数据库有 3 个不同的连接同时发生。
最后,这是Entity Framework
用作存储库,但请不要让这阻止您考虑这个问题。
使用分析工具,Isolation Level
是Serializable
. 我也试过ReadCommited
and ReadUncommited
,但他们都错误: -
ReadCommited
: 同上。僵局。ReadUncommited
: 不同的错误。EF 异常表示它期望返回一些结果,但一无所获。我猜这是预期的LogEntryId
Identity (scope_identity
) 值,但由于脏读而无法检索。
请帮忙!
PS。顺便说一句,这是 Sql Server 2008。
更新#2
在阅读了Remus Rusanu的更新回复后,我觉得我可以尝试提供更多信息,看看其他人是否可以提供进一步的帮助。
EF图
替代文字 http://img691.imageshack.us/img691/600/deadlockefmodel.png
现在,Remus 建议(并注意,他确实说他不熟悉 EF)...
谜题的最后一块,PK_ConnectedClients 上的无法解释的左节点锁定,我将假设来自 InsertOrUpdate 的 EF 实现。它可能首先进行查找,并且由于在 ConnectedClients 和 LogEntries 之间声明的 FK 关系,它会在 PK_ConnectedClients 上查找,从而获取可序列化锁。
有趣的。如上所述,我不确定为什么左节点有一个 lock on PK_ConnectedClients
。好的,让我们看看该方法的代码......
唔。这是一个简单的AddObject
(又名。插入)或Attach
(又名。更新)。没有参考。Sql 代码也没有提示任何查找内容。
好吧……我确实有其他两种方法……也许他们正在做一些查找?
在 ConnectedClientRepository ...
不-> 也是基本的,如。
幸运的最后一种方法?哇..现在这很有趣....
所以,看上面,我抓住了一个我想删除的记录的实例......如果它存在,然后删除它。
所以..如果我注释掉那个方法调用,以我最初的逻辑方式直到这篇SO帖子的顶部......会发生什么?
有用。哇。
当我不调用该方法时,它也可以作为一个Serializable
或两个工作。Read Commited
Delete
那么为什么删除方法会被锁定呢?是因为 select (with serializable
) 做了一个锁并且发生了一些死锁吗?
有了read committed
,我是否有可能同时发生 3 个删除调用。
- 第一个抓取数据的一个实例。
- 第二个(和第三个)抓取相同数据的另一个实例。
- 现在,第一次删除。美好的。
- 第二次删除..但是该行已经消失了..因此我得到了一个奇怪的错误,即影响了意外的行数(0)。<== 零个项目被删除。
可能的?如果是这样......呃......我该如何解决这个问题?这是竞争条件的经典案例吗?是否有可能以某种方式防止这种情况发生?
更新
- 修复了图片的链接。
- 链接到原始 XML 死锁文件。这是相同的链接。
- 添加了数据库表模式。
- 添加了两个表的详细信息。
c# - 我应该在以下代码的哪一行提交我的工作单元?
我有以下代码在交易中。我不确定我应该在哪里/何时提交我的工作单元。
故意地,我没有提到我正在使用什么类型的 Respoistory - 例如。Linq-To-Sql、Entity Framework 4、NHibernate 等
如果有人知道在哪里,他们能否解释一下他们为什么说,在哪里?(我试图通过示例来理解模式,而不是仅仅让我的代码工作)。
这就是我所拥有的:-