0

我一直在試驗Unity和一個客戶Filter/FilterProvider。我擔心的是,這些課程從不處理。下面是一個代碼示例我開始:具有依賴注入的過濾器和FilterProvider;管理每個請求?

//FilterProvider 
public class CustomFilterProvider: IFilterProvider 
    { 


     public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) 
     { 

      if (actionDescriptor.GetCustomAttributes<CustomAuthorizeAttribute>().Any()) 
      { 
       var filter = UnityinstanceLocator.GetConfiguredContainer().Resolve<CustomAuthorize>(); 
       yield return new FilterInfo(filter, FilterScope.Global); 
      } 
     } 
    } 

//Filter 
public class CustomAuthorizeFilter: IAuthorizationFilter 
    { 
     private readonly IFakeService _fakeService; 

     public CustomAuthorizeFilter(IFakeService fakeService) 
     { 
      _fakeService = fakeService; 
     } 


     public bool AllowMultiple { get; } 

     public Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(HttpActionContext actionContext, CancellationToken cancellationToken, 
      Func<Task<HttpResponseMessage>> continuation) 
     { 
      ...Do Some stuff 
     }  
    } 

//Attribute 
public class CustomAuthorizeAttribute : Attribute 
    { 

    } 

IFakeService工具IDisposable。我將其設置爲測試。我的IFakeService統一註冊使用HierarchicalLifetimeManager。當它在過濾器內部時,我從不會看到它被丟棄。按照預期將IFakeService注入控制器。

用於過濾器提供商啓動看起來像這樣(我使用OWIN):

var config = new HttpConfiguration {DependencyResolver = new UnityDependencyResolver(UnityinstanceLocator.GetConfiguredContainer())}; 
config.Services.Add(typeof(IFilterProvider), new ComceptFilterProvider()); 

我想我可以去老同學和總結我一次性類的using聲明ExecuteAuthorizationFilterAsync方法裏面,以免產生依賴性一起注射。如果我和Unity保持距離,是否有更好的解決方案?

+2

如何注入一個FakeServiceFactory並使用它來創建一個FakeService - 您可以在實際使用它的使用塊中使用它。 – oerkelens

回答

1

在WebApi框架過濾器被緩存。所以他們是singletons並在請求中重複使用。您的CustomAuthorizeFilter的實例永遠不會在應用程序的整個生命週期中處置,並保持參考IFakeService

+0

直到我準備轉移到.Net Core並使用[ServiceFilterAttribute](https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.aspnetcore.mvc.servicefilterattribute)我將擁有以解決一個更簡單的解決方案,並直接使用我的基礎上下文沒有DI。 – DDiVita