我有一个使用Entity Framework的MVC 3应用程序,我在其中设置了自定义角色提供程序。
我的角色提供程序依赖于存储库,该存储库依赖于DbContext。
我在app start方法中将我的上下文和存储库注册为已实现的接口 - 每个http请求的实例。
我最初尝试在自定义角色提供程序中使用Initialize方法,使用服务定位器模式解析存储库依赖项,并将其设置为类的属性:
DependencyResolver.Current.GetService<IMyRepository>();
存储库解决没有问题,但我得到一个例外,说明DbContext
已被处置。
我已经能够通过改变两件事来解决这个问题:
所以这一切现在看起来都很好但是,即使在阅读了关于autofac生命周期范围的各种文章后,我也完全不明白为什么。
*代码示例
我唯一的理论是角色提供程序在创建http请求之前就会启动,因此,当每个http请求使用实例时 - 角色提供程序正在解析之前已被处置的请求的实例?
答案 0 :(得分:0)
Asp.Net角色提供程序的生命周期由运行时管理,并且与应用程序的生命周期相关联,而不是单个请求。
因此,如果您在初始化方法中解决依赖关系,那么只有在导致它挂在已处置的DbContext上时才会发生这种情况。标准做法是根据您的修复方法解决每种方法一次。
关于角色提供者使用的DbContext的生命周期管理,我会将角色提供者设置为每个原子操作使用自己的DbContext(因此工作单元)。如果您的角色提供程序仅执行读取,则可以从其他位置重新使用DbContext。但是,如果它针对您的数据库运行命令,则您可以使用DbContext的根范围的所有者来提交这些更改。
我会想象你为什么perHttpRequest失败的解释是正确的,只是因为上面的原因使用每个依赖。