在MVC中使用实体框架时是否需要实现IDisposable?
我在许多例子中看到有关MVC,库模式,工作的单位和EF,例如here,这两个接口和类实现IDisposable
接口。我想这个界面只显示了带有2个重载的方法Dispose()
。在MVC中使用实体框架时是否需要实现IDisposable?
但是,在高级程序员制作的许多其他示例中,我没有看到这样的实现。实际上,对我来说,每个Web请求中都有一个组件被解雇似乎相当逻辑,因为每个请求都会得到一个全新的控制器实例。
或者即使情况并非如此,我猜想通过使用依赖注入框架(如Ninject),我们将所有这些处置任务委托给该框架。
在EF或MVC框架的旧版本中,还需要执行IDisposable。
有人可能会指出我正确的方向吗?
UPDATE
自动处置上下文可以以分层的应用中可以看出与服务和库层。假设由两个组件我们回到IQueryable<T>
对象,如果我们试图从控制器填充的对象,通过迭代的项目或致电ToList()
方法,我们得到一个运行时错误说,环境是不可达(关闭)
常见模式是在每个控制器中都有一个存储库实例,并将Disposal链接到Controller的Dispose()中。
所以我会说模式通常是必需的。
但是在高级程序员所做的许多其他例子中,我没有看到这样的实现。
有几个可能性:
- 它演示代码,错误和资源处理省略。
- 图案以非明显的地方实施(基类)
指向一个具体的例子,我们可以找到答案。
谢谢,我的意思是例如这些教程http://www.asp.net/mvc/tutorials。此外,如果我有服务和存储库层和我回IQueryables
这些教程看似“演示代码“。至于IQueryable,请在问题中写出来。 – 2012-03-27 09:32:51
感谢看到更新 – CiccioMiami 2012-03-27 09:47:33
通常在大多数示例中,您可以在interner上找到有关使用EF的Repository
模式,Context有Dispose
方法。
现在你不严格需要呼吁Context
Dispose方法,但它可能是以下原因一个很好的做法:
DataContext的保存状态(例如,一个SqlConnection和指向的对象你已经检索到)。一旦你释放了所有的引用,这些对象最终会被GC清除,但是其中一些对象(例如底层的SqlConnection)可能会占用你一旦完成后通常想要释放的资源,而不是依靠GC来清理。
对于懒惰的人:你甚至可以换一个using语句将调用Dispose内为你的背景下,当物体从的使用本身
更多信息的范围得到了:
在这里你还可以找到关于EF
http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C
库图案的例子_you并不严格需要调用Dispose method_ - 当访问者数量上升这可能意味着麻烦... – 2012-03-27 09:25:18
谢谢,如果我有服务和存储库层和我回IQueryables从他们两个
“懒人”?从什么时候将上下文封装为'使用'是懒惰?我认为这是谨慎和勤奋。那么我想我很懒惰。 – Will 2015-04-14 14:42:30
关于连接状态,EF应该是相当不错的,只在需要时才保持连接打开(http://msdn.microsoft.com/en-us/library/bb896325.aspx)。该链接还显示如何更好地控制连接状态。
_guess此接口公开了方法Dispose()与2个overloads_ - 否,接口定义了1个重载。另一个属于实现模式。 – 2012-03-27 09:15:31