1

我確信這段代碼曾經工作過。我在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()); 
+0

你怎麼註冊的過濾器? – Spock

+0

我剛剛嘗試了您的代碼,並且全局和標準操作篩選器都正常工作。您的問題可能與您註冊操作過濾器的方式有關。 – Spock

+0

我目前沒有註冊動作過濾器。沒想到我需要。你如何註冊? –

回答

1

將名稱添加到過濾器註冊解決了問題。

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

乾杯邁克

+0

我通常使用'typeof(TypeToRegister).Name'。 – abatishchev

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); 
    } 
} 
+0

註冊ActionFilters對我沒有任何幫助。然而,工作是在註冊過程中爲每個FilterPRoviders提供一個名稱。我似乎記得,如果你想在Unity中註冊與多個對象相同的接口,那麼你必須給每個對象一個唯一的名稱。是否這一切都有效,無需在Unity中註冊過濾器。 –

+0

啊我也記得。我錯過了。你是對的。 – Spock

相關問題