2012-02-29 9 views
2

ASP.NET Web APIのninject、コンストラクタインジェクションで動作するカスタム属性/フィルタを取得するのに苦労しています。ここでASP.NET Web API Ninjectコンストラクタがカスタムフィルタと属性を挿入しました

は文字通り、私はこのフィルタと属性に関するしているすべてのコードだいくつかのコンテキストを与えるために、いくつかのスニペット...

//controller 
[ApiAuthorise] 
public IEnumerable<Thing> Get() 

// Attribute definition with no body 
public class ApiAuthoriseAttribute : FilterAttribute {} 

// Custom Filter definition 
public class ApiAuthoriseFilter : IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { throw new NotImplementedException(); } 
} 

//Ninject module for my API authorisation 
public class ApiAuthoriseModule : NinjectModule 
{ 
    public override void Load() 
    { 

     this.BindFilter<ApiAuthoriseFilter>(FilterScope.Action, 0) 
      .WhenActionMethodHas<ApiAuthoriseAttribute>() 
}} 

//The registerServices(IKernel kernel) method in NinjectMVC3.cs 
kernel.Load(new ApiAuthoriseModule()); 

です。 私が理解しているように、ninjectがそれを処理するときに、フィルタをグローバルフィルタコレクションに明示的に追加する必要はありませんが、それは正しいですか?

私の属性の中にコンストラクタを置き、そこから例外をスローすると、属性が発生していることがわかります。

私の疑惑は、私は物事のNinject側内間違ってやっているものですが、他の人を読んで午後を過ごした後、私は私のと同じように見える例は助けを求める知っている:)

TIA

+0

もう少しプレイした後、主な原因はBindFilter <>()メソッドとSystem.Web.Http.Filters.FilterScopeとSystem.Web.Mvc.FlterScopeの違いのようです。 BindFilter()メソッドはMvc.FilterScopeを必要としますが、他のすべてのWeb APIコードはHttp.Filters.FilterScopeを参照します。 これを確認する方法があるかどうかわからない場合は... –

+0

http://jp.wildermuth.com/2012/2/26/WebAPI_and_Ninjectへのリンクを投げ込むだけで、Googleのジュースと百万マイルも離れていない –

答えて

5

は、Web APIで作業する必要が異なるクラス、通常のコントローラで使用されていることSystem.Web.Mvc.FilterAttribute標準とSystem.Web.Mvc.IAuthorizationFilterないがあります。

public class ApiAuthoriseAttribute : System.Web.Http.Filters.FilterAttribute 
{ 

} 

public class ApiAuthoriseFilter : System.Web.Http.Filters.IAuthorizationFilter 
{ 
    public System.Threading.Tasks.Task<HttpResponseMessage> ExecuteAuthorizationFilterAsync(System.Web.Http.Controllers.HttpActionContext actionContext, System.Threading.CancellationToken cancellationToken, Func<System.Threading.Tasks.Task<HttpResponseMessage>> continuation) 
    { 
     throw new NotImplementedException(); 
    } 

    public bool AllowMultiple 
    { 
     get { return false; } 
    } 
} 

は、その後、あなたが明らかにNinjectを変更する必要がありますこの新しいクラスを登録できるようにフィルターバインディング構文(BindFilter拡張メソッド)を使用します。または、この機能を含むNinject.MVC4を待ちます。

+4

現在、この問題の解決策またはコードサンプルがありますか? –

関連する問題