【问题标题】:Custom Role Provider - DbContext disposed自定义角色提供程序 - 已处置 DbContext
【发布时间】:2014-07-17 17:34:58
【问题描述】:

我有一个使用 Entity Framework 的 MVC 3 应用程序,我在其中设置了自定义角色提供程序。

我的角色提供者依赖于存储库,而该存储库依赖于 DbContext。

我在 app start 方法中将我的上下文和存储库注册为已实现的接口 - 每个 http 请求的实例。

我最初尝试在我的自定义角色提供程序中使用 Initialize 方法来使用服务定位器模式解决存储库依赖关系并将其设置为类的属性:

DependencyResolver.Current.GetService<IMyRepository>();

存储库可以毫无问题地解决,但是我收到一个异常,指出 DbContext 已被释放。

我已经能够通过改变两件事来解决这个问题:

  • 将存储库和上下文都注册为每个依赖项而不是每个 http 请求的实例。
  • 在每次调用角色提供者的方法时,通过对属性使用 getter 而不是在 initialize 方法中调用一次来解决存储库依赖关系。

所以现在这一切似乎都可以正常工作,但是,即使在阅读了有关 autofac 生命周期范围的各种文章之后,我也不完全理解为什么。

*即将推出的代码示例

我唯一的理论是角色提供者在发出 http 请求之前启动,因此,当使用每个 http 请求的实例时 - 角色提供者正在解析先前请求的实例,而这些实例已经被释放?

【问题讨论】:

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


    【解决方案1】:

    Asp.Net 角色提供程序的生命周期由运行时管理,并且与应用程序的生命周期相关联,而不是与单个请求相关联。

    因此,如果您在初始化方法中解决依赖关系,那么这只会发生一次,导致它挂在已处理的 DbContext 上。标准做法是根据您的修复方法为每个方法解决一次。

    关于角色提供者使用的 DbContext 的生命周期管理,我会将角色提供者设置为在每个原子操作中使用它自己的 DbContext(以及因此的工作单元)。如果您的角色提供者仅进行读取,则从其他地方重新使用 DbContext 可能没问题。但是,如果它对您的数据库运行命令,您将受 DbContext 根范围的所有者的摆布来提交这些更改。

    我想你对 perHttpRequest 失败原因的解释是正确的,只是出于上述原因使用每个依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-04
      相关资源
      最近更新 更多