1

我确信这段代码曾经可以工作。我在我的 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());
4

2 回答 2

1

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

    container.RegisterType<IFilterProvider, UnityFilterProvider>("UnityFilterProvider", new ContainerControlledLifetimeManager());
    container.RegisterType<IFilterProvider, UnityGlobalFilterProvider>("UnityGlobalFilterProvider", new ContainerControlledLifetimeManager());

干杯迈克

于 2013-12-19T15:08:51.570 回答
0

这可能是由于过滤器的注册方式。适合我的作品。

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);
    }
}
于 2013-12-19T11:26:24.707 回答