首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >工作单元原理在MVC3应用中引起了问题

工作单元原理在MVC3应用中引起了问题
EN

Software Engineering用户
提问于 2012-02-02 12:05:25
回答 2查看 5.4K关注 0票数 4

我正在实现一个网站使用MVC3,实体框架4.1和存储模式,单位的工作原则。但是我在实施这个计划的时候面临着一个大问题。

我开发了一个静态ObjectContext类。这个类跨所有存储库使用,因此遵循工作单元模式。例如,我有ICustomer、IProduct仓库。我在控制器中只使用一个存储库,这也是使用NInject注入的。

代码语言:javascript
复制
CustomerController(ICustomer customer)
{
}

ProductController(IProduct product)
{
}

由于对象上下文类是静态的和IProduct的,所以ICustomer具有参数化构造函数,它接受objectContext类,这两个类将共享相同的ObjectContext实例。

当执行是单线程时,一切都进行得很好,但在多线程中,我得到了一个未处理的异常,因为一个存储库关闭了另一个存储库使用的连接。我认为如果我使ObjectContext类不是静态的,那么这将解决问题(还没有测试),但是工作单元就不会被观察到。

你能给我一个解决办法吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2012-02-02 13:54:03

静态ObjectContext类

这比你想的还要糟糕。ObjectContext类并不是线程安全的,所以即使您设法获得了您认为良好的同步,(没有实际锁定),您仍然会一直在多用户环境中抛出异常。

ADO.NET团队建议每次计划查询数据库时都使用新的ObjectContext。如果不是这样的话,其他人怎么能把他们的数据访问类彼此分开呢?

我认为如果我使ObjectContext类不是静态的,那么这将解决问题(还没有测试),但是工作单元就不会被观察到。

一点都不对。工作单元模式与拥有整个应用程序的单个存储库无关--否则,每个实体框架教程都会向您展示如何创建静态ObjectContext。

这仅仅意味着,如果不能提交工作单元,那么整个提交将被取消,整个提交必须成功才能成功;这是一个单一的逻辑事务。

如果需要将对象保存在应用程序的生命周期内,请考虑将它们缓存在ObjectContext以外的数据结构中。

票数 6
EN

Software Engineering用户

发布于 2012-02-02 12:34:02

使用引用计数连接(以及任何其他需要在使用后进行特殊清理的共享状态)。

每当对象开始使用连接时,都要增加引用计数。当对象完成后,减少计数。当计数达到零时,关闭连接。

您将希望使用锁来保护引用计数和连接打开/关闭逻辑。在连接打开/关闭时会出现一些竞赛条件,否则会导致问题。

更普遍的情况是,您将不得不担心在多个线程之间共享的任何状态上的同步。如果保持此设计,则需要养成查找类/函数是否线程安全的习惯,并添加锁以保护不安全或不确定的任何内容。如果您有多个同步原语,则需要开始担心获取顺序和死锁的可能性。

这是多线程应用程序中静态或以其他方式共享的任何东西的最大缺点之一。同步非常容易出错,并导致难以复制和诊断错误。确保在评估您的设计时考虑到这一点,而其他设计不需要共享状态。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/132965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档