无法使用Unity Bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入 [英] Can't inject on System.Web.Http.Filters.ActionFilterAttribute using Unity bootstrapper for ASP.NET Web API nuget package
问题描述
我无法使用ASP.NET Web API nuget软件包的Unity引导程序来与自定义ActionFilterAttribute类一起使用依赖项注入。
I can't get dependency injection working with a custom ActionFilterAttribute class using the Unity bootstrapper for ASP.NET Web API nuget package.
我已经注册了类型在UnityConfig中,我在其他地方使用了它(虽然在那里使用了构造函数注入),但效果很好。
I've registered the type in UnityConfig and I'm using it elsewhere (using constructor injection there though) and it works fine.
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<ISettingService, SettingService>();
...
}
代码已成功调用,但是实例化的对象(settingService)为null。
The code is being called successfully, however the instantiated object (settingService) is 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");
}
...
}
我需要什么做这项工作?我已经搜索了很长时间,只能找到带有不同依赖项注入器的MVC或Web API的示例。
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.
推荐答案
首先创建一个 IFilterProvider
,它将执行构建并注入依赖项:
First create an IFilterProvider
that will perform a BuildUp and inject the dependencies:
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;
}
}
然后注册IFilterProvider:
Then register the 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);
}
我放置了此方法并在 UnityWebApiActivator中调用了该方法
类。
I put this method and invoked it in the UnityWebApiActivator
class.
这篇关于无法使用Unity Bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!