3

我試圖注入UOW容器成的WebAPI 2 actionfilter屬性的DbContext被設置在ActionFilterAttribute,不重新加載在後續請求

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被容器注入像它應該與在第一次請求一切正常。在隨後的請求中,EF會拋出一個異常,表示已經處理了DbContext。

所有依賴關係都綁定在請求範圍內,所以正常情況下,基礎dbcontext得到處置。當在WebApi控制器中使用構造函數注入一切正常時,每個請求都會重新創建資源,爲什麼在嘗試在ActionFilterAttributes中使用Property注入時不會重新創建資源,以及如何解決這個問題?

的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; 
    } 

的「注入」方法的描述說:「注入一個指定的實例,而無需管理其生命週期。」所以我認爲我的VerifyApiToken屬性是在每個App生命週期(基本上是Application_Start)中注入一次,因此在下面的請求中使用了同一個實例(當然還有一個處理過的DbContext)。 甚至可以配置Ninject爲ActionFilterAttributes中的每個請求使用新的IUOW容器?

+2

注入Func鍵 qujck

回答

1

我能夠遵循qujck的提示,而不是向actionfilter注入一個Func。

,要求下面的結合:

kernel.Bind<Func<IUOW>>().ToMethod(m =>() => m.Kernel.Get<IUOW>()); 
+0

這是一個快速簡便的方法來創建你的工廠 – Arijoon

4

過濾器是由框架的WebAPI緩存和重用。因此,您不應該在請求範圍內注入任何依賴項;改用工廠。

欲瞭解更多信息,請參閱documentation

相關問題