4

ASP.NET Web APIプロジェクトのアクションフィルター属性にプロパティインジェクションを実行するための推奨される場所はどこですか?MVC 3ランドではControllerActionInvoker、IoCコンテナーからコントローラーを解決する時点で独自の実装を設定し、そのGetFilters()メソッドをオーバーライドして、コンテナーから解決されたコンポーネントを注入することができます。

ASP.NET Web APIプロジェクトでこれを行うための同様の場所はありますか?コンテナからコントローラーを解決するコントローラーファクトリがあります。そのCreateController方法は次のとおりです。

public IHttpController CreateController(HttpControllerContext controllerContext, string controllerName)
{
    var controller = _kernel.Resolve<IHttpController>(controllerName);

    controllerContext.Controller = controller;
    controllerContext.ControllerDescriptor = new HttpControllerDescriptor(_configuration, controllerName, controller.GetType());

    return controllerContext.Controller;
}

注射をする場所があるかどうか調べてみましたがHttpControllerDescriptor、適切な場所がわかりません。正しい方向へのポインタはありますか?

4

1 に答える 1

3

IHttpControllerSelectorセレクターを実装して、の(Servicesプロパティ)DefaultServicesに登録 する必要がありますHttpConfiguration

または、独自のリゾルバー/ DIフレームワークを使用するには、リゾルバーを置き換える必要があります。例については、こちらをご覧ください。


独自に実装する必要がありますIFilterProvider。のソースを見てくださいActionDescriptorFilterProvider。ここでプロパティを挿入できます。

ActionDescriptorFilterProvider実装は次のとおりです。

    public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        if (configuration == null)
        {
            throw Error.ArgumentNull("configuration");
        }

        if (actionDescriptor == null)
        {
            throw Error.ArgumentNull("actionDescriptor");
        }

        IEnumerable<FilterInfo> controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller));
        IEnumerable<FilterInfo> actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action));

        return controllerFilters.Concat(actionFilters);
    }

あなたがしなければならないのは、instanceラムダパラメータを使用してプロパティを注入することだけです。

登録あなたが理解したように、フィルタープロバイダーはに対して登録する必要がありますHttpConfiguration。または、独自のリゾルバー/ DIフレームワークを使用するには、リゾルバーを置き換える必要があります。例については、こちらをご覧ください。

于 2012-04-10T13:48:50.637 に答える