2012-02-29 68 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.FilterScope之间的区别。 BindFilter()方法需要Mvc.FilterScope,但所有其他Web API代码都引用Http.Filters.FilterScope。 不知道是否有一种方法来确认这... – 2012-02-29 14:38:29

+0

只是在http://wildermuth.com/2012/2/26/WebAPI_and_Ninject链接,因为它值得谷歌果汁,不远离这个东西一百万英里 – 2012-02-29 14:56:37

回答

5

有你需要的Web API,与工作不同类别不标准,在正常使用的控制器和System.Web.Mvc.FilterAttributeSystem.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

目前是否有针对此问题的工作解决方案或代码示例? – 2012-03-23 01:06:04

相关问题