我有一个使用Entity Framework的MVC 3应用程序,在其中设置了自定义角色提供程序。
我的角色提供程序依赖于存储库,并且该存储库对DbContext具有依赖性。
我在应用程序启动方法中将上下文和存储库都注册为已实现的接口-每个http请求的实例。
最初,我尝试在自定义角色提供程序中使用Initialize方法来使用服务定位器模式解析存储库依赖关系并将其设置为该类的属性:
DependencyResolver.Current.GetService<IMyRepository>();
该存储库可以毫无问题地解决,但是,我得到一个异常,指出
DbContext
已被处置。通过更改以下两项,我已经能够解决此问题:
根据依赖性而不是根据http请求将存储库和上下文都注册为实例。
每次通过在属性上使用getter而不是在initialize方法中调用一次来调用角色提供程序的方法时,都会解析存储库依赖项。
因此,这一切似乎都可以正常工作,但是,即使阅读了有关autofac生命周期范围的各种文章,我仍然不完全理解为什么。
*代码样本即将到来
我唯一的理论是,因此,在使用每个http请求的实例时,角色提供者会在发出http请求之前启动-角色提供者正在为之前已处理的请求解析实例?
最佳答案
Asp.Net角色提供程序的生存期由运行时管理,并且与应用程序的生存期相关,而不是与单个请求相关。
因此,如果您在初始化方法中解析依赖项,则只有在导致其挂接到已处置的DbContext上时才会发生这种情况。标准做法是根据您的修复方法为每种方法解决一次。
关于角色提供者使用的DbContext的生命周期管理,我将设置角色提供者以使其在每个原子操作中始终使用其自己的DbContext(并因此使用工作单元)。如果您的角色提供程序仅在读取数据,则可以从其他地方重用DbContext。但是,如果它对您的数据库运行命令,则您将受DbContext根范围的所有者的约束来提交那些更改。
我可以想象您对为什么perHttpRequest失败的解释是正确的,并且仅出于上述原因使用per依赖项。
关于c# - 自定义角色提供程序-处置DbContext,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24794778/