我确信这段代码曾经可以工作。我在我的 Unity 配置中注册了一个 UnityFilterProvider 和一个 UnityGlobalFilterProvider。
我原以为它会同时获取两个 IFilterProvider,但如果它们都已注册,它只会获取 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(截图)
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());