gpt4 book ai didi

asp.net - DbContext 在 ActionFilterAttribute 中处置,不会在后续请求中重新加载

转载 作者:行者123 更新时间:2023-12-02 21:08:18 27 4
gpt4 key购买 nike

我正在尝试将 UOW 容器注入(inject) WebApi 2 actionfilter 属性

 public class VerifyApiToken : ActionFilterAttribute
{
[Inject]
public IUOW Uow { get; set; }

public override void OnActionExecuting(HttpActionContext actionContext)
{
//get and save data to any repository in the uow container
base.OnActionExecuting(actionContext);
}

UOW 容器按照预期进行注入(inject),并且在第一个请求时一切正常。在后续请求中,EF 抛出异常,表明 DbContext 已被释放。

所有依赖项都绑定(bind)在请求范围内,因此底层 dbcontext 被释放是正常的。在 WebApi Controller 中使用构造函数注入(inject)时,一切正常,在每个请求上都会重新创建资源,为什么在尝试在 ActionFilterAttributes 中使用属性注入(inject)时不重新创建资源,如何解决此问题?

我正在使用的 IFilterProvider:

 public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
{
IEnumerable<FilterInfo> controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller));
IEnumerable<FilterInfo> actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action));
IEnumerable<FilterInfo> filters = controllerFilters.Concat(actionFilters);

foreach (FilterInfo filter in filters)
{
_kernel.Inject(filter.Instance);
}
return filters;
}

“Inject”方法描述为“注入(inject)指定的实例,而不管理其生命周期”。因此,我认为我的VerifyApiToken属性在每个应用程序生命周期(基本上是Application_Start)注入(inject)一次,因此在以下请求中使用相同的实例(当然带有已处置的DbContext)。是否可以将 Ninject 配置为对 ActionFilterAttributes 中的每个请求使用新的 IUOW 容器?

最佳答案

过滤器由 WebApi 框架缓存和重用。因此,您不应该在请求范围内注入(inject)任何依赖项;使用工厂代替。

有关更多信息,请参阅documentation

关于asp.net - DbContext 在 ActionFilterAttribute 中处置,不会在后续请求中重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23855789/

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