2012-04-10 11 views
4

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

これは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を見て持っていたが、私がすることはできません適切な場所を参照してください。正しい方向のポインタ? HttpConfiguration

あなたは IHttpControllerSelectorを実装し、( Servicesプロパティ)で、あなたのセレクタを登録する必要があり

答えて

3

または、独自のリゾルバ/ DIフレームワークを使用するには、リゾルバを交換する必要があります。例については、hereを参照してください。


自分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フレームワークを使用するには、リゾルバを交換する必要があります。例については、hereを参照してください。

+0

'IHttpControllerSelector'はここでは役に立たない - コントローラーを正しく解決することは問題ではありませんが、これはすべて正常に動作しますが、アクションフィルタにサービスを注入することです。これは、MVC - http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/でこれを行う方法ですが、Web APIは少し異なります。 –

+0

@RussCamはい、誤解されています。更新しました。 – Aliostad

+0

私はあなたと同じ結果に来ました:)私のIFilterProviderはコンテナに登録されていますが、決してヒットしないようです。アクションフィルタが実行されており、フレームワークがコンテナからIFilterProviderを解決しようとしていないことを示しています。 http://aspnetwebstack.codeplex.com/のソースコードがNuGetのアセンブリと古くなっているので、少しイライラします! –

関連する問題