Asp.net web api 将属性注入Web API的'System.Web.Http.Filters.ActionFilterAttribute'`

Asp.net web api 将属性注入Web API的'System.Web.Http.Filters.ActionFilterAttribute'`,asp.net-web-api,Asp.net Web Api,在ASP.NET web api项目中,建议在哪里将属性注入到操作筛选器属性中?在MVC3Land中,我们可以在从IoC容器解析控制器时为ControllerActionInvoker设置自己的实现,并重写其GetFilters方法以注入从容器解析的组件 在ASP.NET Web API项目中是否有类似的地方可以这样做?我有一个控制器工厂,它使用CreateController方法从容器解析控制器: public IHttpController CreateController(HttpCont

在ASP.NET web api项目中,建议在哪里将属性注入到操作筛选器属性中?在MVC3Land中,我们可以在从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,看看是否有地方可以注射,但我找不到合适的地方。有没有指向正确方向的指针?

您需要实现IHttpControllerSelector,并在HttpConfiguration的服务属性DefaultServices中注册选择器

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

您需要实现自己的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参数并注入属性


注册正如您所了解的,需要根据HttpConfiguration注册筛选器提供程序。或者,要使用您自己的解析器/DI框架,您需要更换解析器。请参见示例。

IHttpControllerSelector在这里没有帮助-问题不在于正确解析控制器这一切都很好,而是在于将服务注入到操作筛选器中。这就是在MVC-中实现的方法,但Web API略有不同。@RussCam是的,被误解了。更新。我得到了与您相同的结果:我的IFilterProvider在容器中注册,但似乎从未被击中;操作筛选器正在运行,这表明框架没有尝试从容器解析IFilterProvider。这有点令人沮丧,因为上的源代码已经过时,程序集来自NuGet!获取源代码并构建它。最终,最终的web api看起来更像是发布的源代码,而不是发布的beta安装程序。好吧,至少我会这么做。这也是APACHE 2.0许可证,应该没问题。最后的评论只是转移视线:我不小心注册了System.Web.Mvc.IFilterProvider,而不是System.Web.Http.Filters.IFilterProvider。现在一切似乎都好了。如果您可以更新您的答案,说IFilterProvider应该在容器中注册,我将标记为已接受: