2009-04-10 11 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'メソッドにフィルターを注入することです。 –

+0

いいえ、私の以前のソリューションでさえ最高ではありません。最善の方法は、 'FilterProviders.Providers'の元のプロバイダを削除し、フィルタが構築されているところに独自の' UnityFilterProviders'を追加することです。 –

関連する問題