1

我正在使用Web API 2和Unity的ASP.NET Web應用程序。我們使用內置的System.Web.Http.AuthorizeAttribute的子類來裝飾我們的控制器/控制器方法,以對由Web API公開的各種REST端點應用授權。如何將依賴注入到System.Web.Http.AuthorizeAttribute子類中?

我們希望能夠使用Unity將依賴關係注入到該屬性中。我做了很多搜索,但是大多數例子與我的用例不同,沒有用處。

我該如何去使用Unity注入依賴到我的System.Web.Http.AuthorizeAttribute子類?

我已經嘗試創建一個自定義的FilterProvider,它調用屬性實例上的Unity的BuildUp方法,但我不確定應該擴展哪個基類或應該實現的接口。

+2

不要注入行爲到屬性:http://stackoverflow.com/a/7194467/126014 –

+0

我認爲下面的方法不會遇到與上面描述的相同的缺陷,因爲注入也是由屬性驅動的,並且如果在使用之前直接實例化屬性,則可以全部填充。 – NStuke

回答

3

你必須實現IFilterProvider。如果擴展ActionDescriptorFilterProvider,則可以調用base.GetFilters來獲取在控制器和操作級別指定的過濾器。

public class UnityFilterProvider : ActionDescriptorFilterProvider, IFilterProvider 
{ 
    private readonly IUnityContainer _container; 

    public UnityFilterProvider(IUnityContainer container) 
    { 
     _container = container; 
    } 

    public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) 
    { 
     var attributes = base.GetFilters(configuration, actionDescriptor).ToList(); 

     foreach (var attr in attributes) 
     { 
      _container.BuildUp(attr.Instance.GetType(), attr.Instance); 
     } 
     return attributes; 
    } 
} 

你必須把它註冊到基礎設施,以便將使用默認的一個,而不是:

//Register the filter injector 
var providers = config.Services.GetFilterProviders().ToList(); 
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider); 
config.Services.Remove(typeof(IFilterProvider), defaultprovider); 
config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(UnityConfig.Container)); 
+1

謝謝,這工作! –