我確信這段代碼曾經工作過。我在Unity配置中註冊了UnityFilterProvider和UnityGlobalFilterProvider。多重註冊的IFilterProvider仍然在MVC5中工作嗎?
我本來預料它會選擇兩個IFilterProviders,但是如果他們都註冊了,它將只會選擇GlobalFilterProvider。如果註冊的唯一一個是基本的UnityFilterProvider,那麼工作正常。
但我無法讓他們一起工作。
我做錯了什麼?這是否曾經工作,但不是在MVC5?這是否無效,我應該做一些不同的事情?
UnityFilterProvider.cs
namespace Website.Infrastructure
{
public class UnityFilterProvider : FilterAttributeFilterProvider
{
private IUnityContainer container;
public UnityFilterProvider(IUnityContainer container)
{
this.container = container;
}
public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(controllerContext, actionDescriptor);
foreach (var filter in filters)
{
container.BuildUp(filter.Instance.GetType(), filter.Instance);
}
return filters;
}
}
}
UnityGlobalFilterProvider.cs
namespace Website.Infrastructure
{
public class UnityGlobalFilterProvider : IFilterProvider
{
private readonly IUnityContainer container;
private readonly IGlobalFilterRegistrationList filterList;
public UnityGlobalFilterProvider(IUnityContainer container, IGlobalFilterRegistrationList filterList)
{
this.container = container;
this.filterList = filterList;
}
public IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var filters = new List<Filter>();
if (filterList == null || filterList.Count == 0)
return filters;
foreach (GlobalFilterRegistration registration in filterList)
{
var actionFilter = container.Resolve(registration.Type);
var filter = new Filter(actionFilter, FilterScope.Global, registration.Order);
filters.Add(filter);
}
return filters;
}
}
public class GlobalFilterRegistration
{
public GlobalFilterRegistration(Type type, int? order)
{
this.Type = type;
this.Order = order;
}
public Type Type { get; set; }
public int? Order { get; set; }
}
public class GlobalFilterRegistrationList : List<GlobalFilterRegistration>, IGlobalFilterRegistrationList
{
}
public interface IGlobalFilterRegistrationList
{
int Count { get; }
List<GlobalFilterRegistration>.Enumerator GetEnumerator();
void Add(GlobalFilterRegistration item);
}
}
UnityConfig(SNIP)
container.RegisterType<IFilterProvider, UnityFilterProvider>(new ContainerControlledLifetimeManager());
container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>(new ContainerControlledLifetimeManager());
container.RegisterType<IGlobalFilterRegistrationList, GlobalFilterRegistrationList>(
new ContainerControlledLifetimeManager());
任何人有什麼想法?
添加名供應商登記的問題解決了
container.RegisterType<IFilterProvider, UnityFilterProvider>("UnityFilterProvider", new ContainerControlledLifetimeManager());
container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>("UnityGlobalFilterProvider", new ContainerControlledLifetimeManager());
你怎麼註冊的過濾器? – Spock
我剛剛嘗試了您的代碼,並且全局和標準操作篩選器都正常工作。您的問題可能與您註冊操作過濾器的方式有關。 – Spock
我目前沒有註冊動作過濾器。沒想到我需要。你如何註冊? –