1

Я пытаюсь разрешить зависимость так:DI с параметрами в замке Виндзор

controller.ActionInvoker = kernel.Resolve<IActionInvoker>(controller.GetType()); 

Ранее зарегистрировано таким образом:

container.Register(
    Component 
     .For<IActionInvoker>() 
     .ImplementedBy<WindsorActionInvoker>() 
     .UsingFactoryMethod(metho) 
     .LifestylePerWebRequest() 
); 


internal IActionInvoker metho(IKernel kernel,ComponentModel model, CreationContext context) 
{ 
    // here just for debugging and watching the variables in the factory method, 
    // I would instance WindsorActionInvoker passing the filters to inject. 
    throw new InvalidOperationException(); 
} 

Но я не могу понять, как для получения параметра I, переданного вызову разрешения в заводском методе.

Мне нужен Type Я передаю как параметр, чтобы передать его одной из зависимостей, введенных в конструктор конкретного типа.

Что я делаю неправильно?


Если вы должны знать, цель этого вводить фильтры действий непосредственно в запустившего действия (и, следовательно, контроллеры), вместо того, чтобы требовать их украсить контроллер или базовый контроллер, кроме того, это позволяет мне динамически вводить параметры, которые я не могу сделать с атрибутами.

public class WindsorActionInvoker : ControllerActionInvoker 
{ 
    private readonly IList<IActionFilter> actionFilters; 
    private readonly IList<IAuthorizationFilter> authorizationFilters; 
    private readonly IList<IExceptionFilter> exceptionFilters; 
    private readonly IList<IResultFilter> resultFilters; 

    public WindsorActionInvoker(IList<IActionFilter> actionFilters, IList<IAuthorizationFilter> authorizationFilters, IList<IExceptionFilter> exceptionFilters, IList<IResultFilter> resultFilters) 
    { 
     if (actionFilters == null) 
     { 
      throw new ArgumentNullException("actionFilters"); 
     } 
     if (authorizationFilters == null) 
     { 
      throw new ArgumentNullException("authorizationFilters"); 
     } 
     if (exceptionFilters == null) 
     { 
      throw new ArgumentNullException("exceptionFilters"); 
     } 
     if (resultFilters == null) 
     { 
      throw new ArgumentNullException("resultFilters"); 
     } 
     this.actionFilters = actionFilters; 
     this.authorizationFilters = authorizationFilters; 
     this.exceptionFilters = exceptionFilters; 
     this.resultFilters = resultFilters; 
    } 

    protected override FilterInfo GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor) 
    { 
     FilterInfo filterInfo = base.GetFilters(controllerContext, actionDescriptor); 
     foreach (IActionFilter filter in actionFilters) 
     { 
      filterInfo.ActionFilters.Add(filter); 
     } 
     foreach (IAuthorizationFilter filter in authorizationFilters) 
     { 
      filterInfo.AuthorizationFilters.Add(filter); 
     } 
     foreach (IExceptionFilter filter in exceptionFilters) 
     { 
      filterInfo.ExceptionFilters.Add(filter); 
     } 
     foreach (IResultFilter filter in resultFilters) 
     { 
      filterInfo.ResultFilters.Add(filter); 
     } 
     return filterInfo; 
    } 
} 

ответ

1

Решенный, мне нужно было передать либо словарь, либо анонимный тип, а не только любой объект.

Замена:

controller.ActionInvoker = kernel.Resolve<IActionInvoker>(controller.GetType());} 

С

controller.ActionInvoker = kernel.Resolve<IActionInvoker>(new { loggerType = controller.GetType() }); 

Fixed его.

:)

Смежные вопросы