我正在努力在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 :(得分: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
。