在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
,看看是否有地方可以进行注射,但我看不到合适的地方。任何正确方向的指针?
答案 0 :(得分:3)
您需要实现 IHttpControllerSelector
并在Services
的{{1}}属性)DefaultServices
中注册您的选择器。
或者,要使用您自己的解析器/ DI框架,您需要更换解析器。有关示例,请参阅here。
您需要实施自己的HttpConfiguration
。看看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参数并注入属性。
注册如您所知,过滤器提供商需要针对instance
进行注册。或者,要使用您自己的解析器/ DI框架,您需要更换解析器。有关示例,请参阅here。