自定义角色提供程序 - 已处置DbContext

时间:2014-07-17 04:14:00

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

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

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

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

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

DependencyResolver.Current.GetService<IMyRepository>();

存储库解决没有问题,但我得到一个例外,说明DbContext已被处置。

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

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

所以这一切现在看起来都很好但是,即使在阅读了关于autofac生命周期范围的各种文章后,我也完全不明白为什么。

*代码示例

我唯一的理论是角色提供程序在创建http请求之前就会启动,因此,当每个http请求使用实例时 - 角色提供程序正在解析之前已被处置的请求的实例?

1 个答案:

答案 0 :(得分:0)

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

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

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

我会想象你为什么perHttpRequest失败的解释是正确的,只是因为上面的原因使用每个依赖。