属性注入Web API的`System.Web.Http.Filters.ActionFilterAttribute`

时间:2012-04-10 13:32:26

标签: asp.net-web-api

在ASP.NET Web api项目中,将属性注入执行过滤器属性的推荐位置在哪里?在MVC 3版本中,我们可以在从IoC容器中解析控制器时为ControllerActionInvoker设置我们自己的实现,并覆盖其GetFilters()方法以注入从容器中解析的组件。

在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,看看是否有地方可以进行注射,但我看不到合适的地方。任何正确方向的指针?

1 个答案:

答案 0 :(得分:3)

您需要实现IHttpControllerSelector并在Services的{​​{1}}属性)DefaultServices中注册您的选择器。

或者,要使用您自己的解析器/ DI框架,您需要更换解析器。有关示例,请参阅here


您需要实施自己的HttpConfiguration。看看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); } lambda参数并注入属性。

注册如您所知,过滤器提供商需要针对instance进行注册。或者,要使用您自己的解析器/ DI框架,您需要更换解析器。有关示例,请参阅here