1

私は次のような依存関係を解決しようとしています:

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();
}

しかし、ファクトリメソッドでresolve呼び出しに渡したパラメータを取得する方法がわかりません。

Type具象型のコンストラクターに注入された依存関係の1つに渡すために、パラメーターとして渡す必要があります。

私は何が間違っているのですか?


知っておく必要がある場合、これの目的は、アクションフィルターをアクション呼び出し元(したがってコントローラー)に直接挿入することであり、コントローラーまたはベースコントローラーを装飾する必要はありません。さらに、これにより、パラメーターを動的に挿入できます。属性ではできません。

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;
    }
}
4

1 に答える 1

1

解決したので、オブジェクトだけでなく、辞書または匿名タイプのいずれかを渡す必要がありました。

交換:

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

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

修正しました。

:)

于 2012-05-02T02:08:26.023 に答える