微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐