C# IFilterProvider的多个注册在MVC5中仍然有效吗?

C# IFilterProvider的多个注册在MVC5中仍然有效吗?,c#,dependency-injection,asp.net-mvc-5,unity-container,asp.net-mvc-filters,C#,Dependency Injection,Asp.net Mvc 5,Unity Container,Asp.net Mvc Filters,我确信这段代码过去是有效的。我的Unity配置中注册了UnityFilterProvider和UnityGlobalFilterProvider 我本以为它会同时接收两个iFilterProvider,但如果它们都已注册,它只会接收GlobalFilterProvider。如果唯一注册的是基本UnityFilterProvider,那么它就可以正常工作 但我不能让他们两个一起工作 我做错什么了吗?这曾经有用,但在MVC5中不行吗?这从来都不管用,我应该做些不同的事情吗 UnityFilterPr

我确信这段代码过去是有效的。我的Unity配置中注册了UnityFilterProvider和UnityGlobalFilterProvider

我本以为它会同时接收两个iFilterProvider,但如果它们都已注册,它只会接收GlobalFilterProvider。如果唯一注册的是基本UnityFilterProvider,那么它就可以正常工作

但我不能让他们两个一起工作

我做错什么了吗?这曾经有用,但在MVC5中不行吗?这从来都不管用,我应该做些不同的事情吗

UnityFilterProvider.cs

名称空间网站.基础架构
{
公共类UnityFilterProvider:FilterAttributeFilterProvider
{
专用IUnityContainer容器;
公共单元过滤器提供程序(IUnityContainer容器)
{
this.container=容器;
}
公共覆盖IEnumerable GetFilters(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)
{
var filters=base.GetFilters(controllerContext,actionDescriptor);
foreach(过滤器中的var过滤器)
{
container.building(filter.Instance.GetType(),filter.Instance);
}
回流过滤器;
}
}
}
UnityGlobalFilterProvider.cs

名称空间网站.基础架构
{
公共类UnityGlobalFilterProvider:IFilterProvider
{ 
专用只读IUnityContainer容器;
私有只读IGlobalFilterRegistrationList筛选器列表;
public UnityGlobalFilterProvider(IUnityContainer容器、IGlobalFilterRegistrationList过滤器列表)
{
this.container=容器;
this.filterList=过滤器列表;
}
公共IEnumerable GetFilters(ControllerContext ControllerContext,ActionDescriptor ActionDescriptor)
{
var filters=新列表();
if(filterList==null | | filterList.Count==0)
回流过滤器;
foreach(过滤器列表中的全局过滤器注册)
{
var actionFilter=container.Resolve(registration.Type);
var filter=新过滤器(actionFilter、FilterScope.Global、registration.Order);
过滤器。添加(过滤器);
}
回流过滤器;
}
}
公共类全球过滤注册
{
公共全局过滤器注册(类型,整数顺序)
{
this.Type=Type;
这个。顺序=顺序;
}
公共类型类型{get;set;}
公共整数?顺序{get;set;}
}
公共类GlobalFilterRegistrationList:列表,IGlobalFilterRegistrationList
{
}
公共接口IGlobalFilterRegistrationList
{
整数计数{get;}
枚举器GetEnumerator();
无效添加(全局过滤注册项);
}
}
单位配置(snip)

container.RegisterType(新ContainerControlledLifetimeManager());
RegisterType(新的ContainerControlledLifetimeManager());
container.RegisterType(
新的ContainerControlled LifetimeManager());
有人有什么想法吗

向提供者注册添加名称解决了此问题

container.RegisterType<IFilterProvider, UnityFilterProvider>("UnityFilterProvider", new ContainerControlledLifetimeManager());
container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>("UnityGlobalFilterProvider", new ContainerControlledLifetimeManager());
container.RegisterType(“UnityFilterProvider”,新的ContainerControlledLifetimeManager());
RegisterType(“UnityGlobalFilterProvider”,新的ContainerControlled LifetimeManager());

这可能是由于过滤器的注册方式。这对我有用

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        var container = new UnityContainer();
        container.RegisterType<IFilterProvider, UnityFilterProvider>(new ContainerControlledLifetimeManager());
        container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>(new ContainerControlledLifetimeManager());
        container.RegisterType<IGlobalFilterRegistrationList, GlobalFilterRegistrationList>(
            new ContainerControlledLifetimeManager());

        container.RegisterType<I, C>();
        container.RegisterType<IActionFilter, SomeActionFilterAttribute>();

        AreaRegistration.RegisterAllAreas();

        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

        GlobalFilters.Filters.Add(new SomeGlobalFilterAttribute());

        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);

    }
}

public interface I
{ }

public class C : I
{ }


public class SomeGlobalFilterAttribute : ActionFilterAttribute
{
    [Dependency]
    public I C { get; set; }
    public SomeGlobalFilterAttribute()
    {

    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var c = C;
        base.OnActionExecuting(filterContext);
    }
}

public class SomeActionFilterAttribute : ActionFilterAttribute
{
    [Dependency]
    public I C { get; set; }
    public SomeActionFilterAttribute()
    {

    }
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var c = C;
        base.OnActionExecuting(filterContext);
    }
}
公共类MVCAPApplication:System.Web.HttpApplication
{
受保护的无效应用程序\u Start()
{
var container=new UnityContainer();
RegisterType(新的ContainerControlledLifetimeManager());
RegisterType(新的ContainerControlledLifetimeManager());
container.RegisterType(
新的ContainerControlled LifetimeManager());
container.RegisterType();
container.RegisterType();
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
添加(新的SomeGlobalFilterAttribute());
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
公共接口I
{ }
公共C类:I类
{ }
公共类SomeGlobalFilterAttribute:ActionFilterAttribute
{
[依赖性]
公共I C{get;set;}
公共SomeGlobalFilterAttribute()
{
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var c=c;
base.OnActionExecuting(filterContext);
}
}
公共类SomeActionFilterAttribute:ActionFilterAttribute
{
[依赖性]
公共I C{get;set;}
public SomeActionFilterAttribute()
{
}
公共覆盖无效OnActionExecuting(ActionExecutingContext filterContext)
{
var c=c;
base.OnActionExecuting(filterContext);
}
}

向过滤器注册添加名称解决了问题

    container.RegisterType<IFilterProvider, UnityFilterProvider>("UnityFilterProvider", new ContainerControlledLifetimeManager());
    container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>("UnityGlobalFilterProvider", new ContainerControlledLifetimeManager());
container.RegisterType(“UnityFilterProvider”,新的ContainerControlledLifetimeManager());
RegisterType(“UnityGlobalFilterProvider”,新的ContainerControlled LifetimeManager());

干杯,迈克

你是如何注册过滤器的?我刚刚试过你的代码,全局和标准动作过滤器都可以正常工作。您的问题可能与您注册操作筛选器的方式有关。我目前没有注册操作筛选器。我不认为我需要这么做。你是如何注册的?更新了下面的答案。下面的答案解决了你的问题吗?注册ActionFilters对我没有任何帮助。然而,我们所做的工作是在注册中为每个FilterPRoviders提供一个名称。我似乎记得,如果您想要针对统一的多个对象注册相同的接口,那么必须为每个对象指定一个唯一的名称。
    container.RegisterType<IFilterProvider, UnityFilterProvider>("UnityFilterProvider", new ContainerControlledLifetimeManager());
    container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>("UnityGlobalFilterProvider", new ContainerControlledLifetimeManager());