asp.net-web-api – 将属性注入Web API的`System.Web.Http.Filters.ActionFilterAttribute`

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

解决方法

您需要实现IHttpControllerSelector并在HttpConfiguration的(Services属性)DefaultServices中注册您的选择器.

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

您所要做的就是使用实例lambda参数和注入属性.

注册正如您所知,过滤器提供程序需要针对HttpConfiguration进行注册.或者,请参见here.

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....