2012-03-27 52 views
4

我在许多例子中看到有关MVC模式,工作的单位和EF,例如here,这两个接口和类实现IDisposable接口。我想这个界面只显示了带有2个重载的方法Dispose()在MVC中使用实体框架时是否需要实现IDisposable?

但是,在高级程序员制作的许多其他示例中,我没有看到这样的实现。实际上,对我来说,每个Web请求中都有一个组件被解雇似乎相当逻辑,因为每个请求都会得到一个全新的控制器实例。

或者即使情况并非如此,我猜想通过使用依赖注入框架(如Ninject),我们将所有这些处置任务委托给该框架。

在EF或MVC框架的旧版本中,还需要执行IDisposable

有人可能会指出我正确的方向吗?

UPDATE

自动处置上下文可以以分层的应用中可以看出与服务层。假设由两个组件我们回到IQueryable<T>对象,如果我们试图从控制器填充的对象,通过迭代的项目或致电ToList()方法,我们得到一个运行时错误说,环境是不可达(关闭)

+0

_guess此接口公开了方法Dispose()与2个overloads_ - 否,接口定义了1个重载。另一个属于实现模式。 – 2012-03-27 09:15:31

回答

3

常见模式是在每个控制器中都有一个存储库实例,并将Disposal链接到Controller的Dispose()中。

所以我会说模式通常是必需的。

但是在高级程序员所做的许多其他例子中,我没有看到这样的实现。

有几个可能性:

  • 它演示代码,错误和资源处理省略。
  • 图案以非明显的地方实施(基类)

指向一个具体的例子,我们可以找到答案。

+0

谢谢,我的意思是例如这些教程http://www.asp.net/mvc/tutorials。此外,如果我有服务和存储库层和我回IQueryables 从他们两个,如果我尝试填充来自控制器的对象,我会得到一个运行时错误,因为上下文不可达(关闭) – CiccioMiami 2012-03-27 09:25:45

+0

这些教程看似“演示代码“。至于IQueryable,请在问题中写出来。 – 2012-03-27 09:32:51

+0

感谢看到更新 – CiccioMiami 2012-03-27 09:47:33

2

通常在大多数示例中,您可以在interner上找到有关使用EF的Repository模式,Context有Dispose方法。

现在你不严格需要呼吁Context Dispose方法,但它可能是以下原因一个很好的做法:

DataContext的保存状态(例如,一个SqlConnection和指向的对象你已经检索到)。一旦你释放了所有的引用,这些对象最终会被GC清除,但是其中一些对象(例如底层的SqlConnection)可能会占用你一旦完成后通常想要释放的资源,而不是依靠GC来清理。

对于懒惰的人:你甚至可以换一个using语句将调用Dispose内为你的背景下,当物体从的使用本身

更多信息的范围得到了:

http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/2625b105-2cff-45ad-ba29-abdd763f74fe/

在这里你还可以找到关于EF

http://www.codeproject.com/Tips/309753/Repository-Pattern-with-Entity-Framework-4-1-and-C

库图案的例子
+0

_you并不严格需要调用Dispose method_ - 当访问者数量上升这可能意味着麻烦... – 2012-03-27 09:25:18

+0

谢谢,如果我有服务和存储库层和我回IQueryables从他们两个,即使我不使用“使用”,如果我尝试从控制器填充的对象,我会得到一个运行时错误,因为上下文不可达(关闭) – CiccioMiami 2012-03-27 09:27:00

+1

“懒人”?从什么时候将上下文封装为'使用'是懒惰?我认为这是谨慎和勤奋。那么我想我很懒惰。 – Will 2015-04-14 14:42:30

相关问题