[英]Can't inject on System.Web.Http.Filters.ActionFilterAttribute using Unity bootstrapper for ASP.NET Web API nuget package
I can't get dependency injection working with a custom ActionFilterAttribute class using the Unity bootstrapper for ASP.NET Web API nuget package. 我无法使用Unity Web API API nuget包的Unity引导程序使用自定义ActionFilterAttribute类进行依赖注入。
I've registered the type in UnityConfig and I'm using it elsewhere (using constructor injection there though) and it works fine. 我在UnityConfig中注册了这个类型,我在其他地方使用它(尽管使用构造函数注入),它工作正常。
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<ISettingService, SettingService>();
...
}
The code is being called successfully, however the instantiated object (settingService) is null. 代码被成功调用,但实例化对象(settingService)为null。
public class APIKeyValidationAttribute : ActionFilterAttribute
{
[Dependency]
public ISettingService settingService { get; set; }
public override void OnActionExecuting(HttpActionContext actionContext)
{
...
if (settingService == null)
{
throw new Exception("settingService is null");
}
...
}
What do I need to do to get this working? 为了让这个工作,我需要做什么? I've been searching for a long time and can only find examples for MVC or for Web API with different dependency injectors.
我已经搜索了很长时间,只能找到MVC或具有不同依赖注入器的Web API的示例。
First create an IFilterProvider
that will perform a BuildUp and inject the dependencies: 首先创建一个
IFilterProvider
,它将执行BuildUp并注入依赖项:
public class UnityActionFilterProvider
: ActionDescriptorFilterProvider, IFilterProvider
{
private readonly IUnityContainer container;
public UnityActionFilterProvider(IUnityContainer container)
{
this.container = container;
}
public new IEnumerable<FilterInfo> GetFilters(
HttpConfiguration configuration,
HttpActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(configuration, actionDescriptor);
foreach (var filter in filters)
{
container.BuildUp(filter.Instance.GetType(), filter.Instance);
}
return filters;
}
}
Then register the IFilterProvider: 然后注册IFilterProvider:
private static void RegisterFilterProviders()
{
var providers =
GlobalConfiguration.Configuration.Services.GetFilterProviders().ToList();
GlobalConfiguration.Configuration.Services.Add(
typeof(System.Web.Http.Filters.IFilterProvider),
new UnityActionFilterProvider(UnityConfig.GetConfiguredContainer()));
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);
GlobalConfiguration.Configuration.Services.Remove(
typeof(System.Web.Http.Filters.IFilterProvider),
defaultprovider);
}
I put this method and invoked it in the UnityWebApiActivator
class. 我把这个方法放在
UnityWebApiActivator
类中调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.