【问题标题】:Is it necessary to implement IDisposable when using the Entity Framework in MVC?在MVC中使用实体框架时是否需要实现IDisposable?
【发布时间】:2012-03-27 09:00:48
【问题描述】:

我在很多例子中看到了 MVCRepository 模式、Unit of WorkEF,例如here,接口和类都实现了IDisposable 接口。我猜这个接口只暴露了 Dispose() 方法,有 2 个重载。

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

或者即使不是这样,我想通过使用诸如 Ninject 之类的依赖注入框架,我们将所有这些处置任务委托给该框架。

在旧版本的 EF 或 MVC 框架中也可能需要实现 IDisposable

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

更新

可以在具有 ServiceRepository 层的分层应用程序中看到上下文的自动处置。假设我们从两个组件返回 IQueryable<T> 对象,如果我们尝试从控制器填充对象,通过迭代其项目或调用 ToList() 方法,我们会收到一个运行时错误,指出上下文不可达(关闭)

【问题讨论】:

  • 猜想这个接口只公开了带有 2 个重载的 Dispose() 方法 - 不,该接口定义了 1 个重载。另一个属于实现模式。

标签: c# asp.net-mvc entity-framework idisposable


【解决方案1】:

常见的模式是在每个 Controller 中都有一个 Repository 的实例,并将 Disposal 链接到 Controller 的 Dispose() 中。

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

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

有几种可能:

  • 是Demo代码,省略了错误和资源处理。
  • 模式在不明显的地方实现(基类)

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

【讨论】:

  • 谢谢,例如这些教程asp.net/mvc/tutorials。此外,如果我有服务和存储库层并且我从它们两个返回 IQueryables,如果我尝试从控制器填充对象,我将收到运行时错误,因为上下文无法访问(关闭)
  • 那些教程似乎是“演示代码”。至于IQueryable,在问题里写出来。
【解决方案2】:

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

现在您不需要在 Context 上调用 Dispose 方法,但这可能是一个好习惯,原因如下:

DataContext 保持状态(例如,SqlConnection 和指向您已检索的对象的指针)。一旦你释放所有引用,这些最终会被 GC 清理,但其中一些对象(例如,底层 SqlConnection)可能持有你通常希望在完成后立即释放的资源,而不是依赖于GC 进行清理。

对于懒惰的人:您甚至可以将上下文包装在 using 语句中,当对象脱离 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

【讨论】:

  • 您并不一定需要调用 Dispose 方法 - 这可能意味着访问者数量增加时会出现麻烦...
  • 谢谢,如果我有服务和存储库层并且我从它们两个返回 IQueryables,即使我尝试从控制器填充对象时不使用“使用”,我将出现运行时错误,因为上下文无法访问(关闭)
  • “对于懒惰的人:”?从什么时候开始将上下文包装在“使用”中变得懒惰?我认为这是谨慎和勤奋。我想我那时很懒。
【解决方案3】:

关于连接状态,EF 应该非常擅长仅在需要时才保持连接打开 (http://msdn.microsoft.com/en-us/library/bb896325.aspx)。该链接还显示了如何更好地控制连接状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-20
    • 2019-07-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多