2012-02-29 74 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