gpt4 book ai didi

c# - 自定义角色提供者 - DbContext 处置

转载 作者:行者123 更新时间:2023-11-30 18:28:36 27 4
gpt4 key购买 nike

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

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

我在应用程序启动方法中将我的上下文和存储库注册为已实现的接口(interface) - 每个 http 请求的实例。

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

DependencyResolver.Current.GetService<IMyRepository>();

存储库毫无问题地解决了,但是我收到一个异常,说明 DbContext 已被处理。

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

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

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

*代码示例即将到来

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

最佳答案

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

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

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

我认为您对 perHttpRequest 失败原因的解释是正确的,并且只是按照上述原因使用 per dependency。

关于c# - 自定义角色提供者 - DbContext 处置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24794778/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com