2009-04-10 17 views
4

我想獲得依賴注入工作在屬性注入我的動作過濾器。我無法弄清楚如何自動設置過濾器的依賴關係。這是我迄今爲止的代碼。如何在動作過濾器上使用Unity和asp.net mvc執行屬性注入?

public class UnityActionInvoker : ControllerActionInvoker 
{ 
    IUnityContainer container; 

    public UnityActionInvoker(IUnityContainer container) { 
     this.container = container; 
    } 

    protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters) { 
     foreach (var filter in filters) { 
      // HELP: dependency injection on all marked filter properties 
     } 

     return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters); 
    } 
} 

public class UnityControllerFactory : DefaultControllerFactory 
{ 
    IUnityContainer container; 

    public UnityControllerFactory(IUnityContainer container) { 
     this.container = container; 
    } 

    protected override IController GetControllerInstance(Type controllerType) { 
     Controller controller = null; 

     if (controllerType != null) { 
      if (!typeof(IController).IsAssignableFrom(controllerType)) { 
       throw new ArgumentException(string.Format("Type requested is not a controller: {0}", controllerType.Name), "controllerType"); 
      } 

      controller = container.Resolve(controllerType) as Controller; 
      controller.ActionInvoker = new UnityActionInvoker(container); 
     } 

     return controller; 
    } 
} 

public class AccessFilterAttribute : FilterAttribute, IActionFilter 
{ 
    [Dependency] 
    public IUserRepository UserRepository { get; set; } 

    public void OnActionExecuting(ActionExecutingContext filterContext) { 
     throw new NotImplementedException(); 
    } 

    public void OnActionExecuted(ActionExecutedContext filterContext) { 
     throw new NotImplementedException(); 
    } 
} 

回答

5

答案是:

public class UnityActionInvoker : ControllerActionInvoker 
{ 
    IUnityContainer container; 

    public UnityActionInvoker(IUnityContainer container) { 
     this.container = container; 
    } 

    protected override ActionExecutedContext InvokeActionMethodWithFilters(ControllerContext controllerContext, IList<IActionFilter> filters, ActionDescriptor actionDescriptor, IDictionary<string, object> parameters) { 
     foreach (var filter in filters) { 
      container.BuildUp(filter.GetType(), filter); 
     } 

     return base.InvokeActionMethodWithFilters(controllerContext, filters, actionDescriptor, parameters); 
    } 
} 
+0

很好的解決方案。但我認爲更好的方法是在`ControllerActionInvoker.GetFilters`方法中注入過濾器。 – 2014-07-26 14:10:38

相關問題