你必須實現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));
不要注入行爲到屬性:http://stackoverflow.com/a/7194467/126014 –
我認爲下面的方法不會遇到與上面描述的相同的缺陷,因爲注入也是由屬性驅動的,並且如果在使用之前直接實例化屬性,則可以全部填充。 – NStuke