ASP.NET Web API В конструктор Ninject добавлены пользовательский фильтр и атрибуты - PullRequest
2 голосов
/ 29 февраля 2012

Я изо всех сил пытаюсь получить собственный атрибут / фильтр, работающий с инжектором ninject, с помощью конструктора в ASP.NET Web API.

Вот несколько фрагментов, чтобы дать некоторый контекст ...

//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, но, потратив день на чтение других примеров, которые кажутся идентичными моим, я знаю, что прошу помощи:)

1012 * ТИА *

1 Ответ

5 голосов
/ 29 февраля 2012

Существуют различные классы, с которыми необходимо работать в веб-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, который будет включать эту функцию.

...