2012-04-10 10 views
4

在ASP.NET web api項目中,哪裏推薦將屬性注入操作過濾器屬性的位置?在MVC 3的土地上,我們可以在從我們的Io​​C容器解析我們的控制器的時候爲ControllerActionInvoker設置我們自己的實現,並覆蓋它的注入從容器解析的組件的方法GetFilters()將屬性注入Web API的`System.Web.Http.Filters.ActionFilterAttribute`

在ASP.NET Web API項目中有沒有類似的地方可以做到這一點?我有一個控制器工廠,從容器解析控制器,與CreateController方法像這樣:

public IHttpController CreateController(HttpControllerContext controllerContext, string controllerName) 
{ 
    var controller = _kernel.Resolve<IHttpController>(controllerName); 

    controllerContext.Controller = controller; 
    controllerContext.ControllerDescriptor = new HttpControllerDescriptor(_configuration, controllerName, controller.GetType()); 

    return controllerContext.Controller; 
} 

我看了一下HttpControllerDescriptor,看看是否有什麼地方做的注射,但我不能看到一個合適的地方。任何指針在正確的方向?

回答

3

您需要實現IHttpControllerSelector,並在(Services屬性)註冊您選擇的HttpConfiguration的。

或者,要使用您自己的解析器/ DI框架,您需要更換解析器。例如,請參閱here


你需要實現自己的IFilterProvider。看看ActionDescriptorFilterProvider的來源。這是你可以注入屬性的地方。

這裏是ActionDescriptorFilterProvider實現:

public IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor) 
    { 
     if (configuration == null) 
     { 
      throw Error.ArgumentNull("configuration"); 
     } 

     if (actionDescriptor == null) 
     { 
      throw Error.ArgumentNull("actionDescriptor"); 
     } 

     IEnumerable<FilterInfo> controllerFilters = actionDescriptor.ControllerDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Controller)); 
     IEnumerable<FilterInfo> actionFilters = actionDescriptor.GetFilters().Select(instance => new FilterInfo(instance, FilterScope.Action)); 

     return controllerFilters.Concat(actionFilters); 
    } 

所有您需要做的是使用instance拉姆達參數和性能的注入。

註冊正如你已經發現,過濾器提供商需要註冊對HttpConfiguration。或者,要使用您自己的解析器/ DI框架,您需要更換解析器。例如,請參閱here

+0

'IHttpControllerSelector'在這裏沒有幫助 - 問題不在於正確解析控制器(這一切都正常),但它是關於將服務注入Action Filters。這是MVC中的一種方式 - http://www.jeremyskinner.co.uk/2008/11/08/dependency-injection-with-aspnet-mvc-action-filters/,但Web API略有不同。 – 2012-04-10 13:56:59

+0

@RussCam是的,誤解了。更新。 – Aliostad 2012-04-10 14:15:54

+0

我的結果和你一樣:)然而,我在容器中註冊的'IFilterProvider'卻似乎沒有被擊中; Action Filters正在運行,這表明框架沒有試圖從容器中解析出'IFilterProvider'。這有點令人沮喪,因爲http://aspnetwebstack.codeplex.com/上的源代碼與來自NuGet的程序集過時了! – 2012-04-10 14:41:07

相關問題