4

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

4

1 回答 1

3

您 需要IHttpControllerSelector在. Services_DefaultServicesHttpConfiguration

或者,要使用您自己的解析器/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);
    }

您所要做的就是使用instancelambda 参数和注入属性。

注册如您所见,过滤器提供程序需要针对HttpConfiguration. 或者,要使用您自己的解析器/DI 框架,您需要更换解析器。有关示例,请参见此处。

于 2012-04-10T13:48:50.637 回答