2

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

4

1 に答える 1

5

System.Web.Mvc.FilterAttribute標準ではなく、Web APIで操作する必要があり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または、この機能が含まれるのを待ちます。

于 2012-02-29T14:46:00.177 に答える