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