我正在努力让自定义属性/过滤器与 ninject、ASP.NET Web API 上的构造函数注入(inject)一起使用。
这里有一些片段可以提供一些背景信息......
//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
最佳答案
您需要在 Web API 中使用不同的类,而不是标准的 System.Web.Mvc.FilterAttribute
和System.Web.Mvc.IAuthorizationFilter
普通 Controller 中使用的:
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 和过滤器绑定(bind)语法( BindFilter
扩展方法)才能注册这个新类。或者等待Ninject.MVC4
其中将包含此功能。
关于asp.net-mvc-3 - ASP.NET Web API Ninject 构造函数注入(inject)自定义过滤器和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500539/