C# Can';使用Unity bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入
我无法使用Unity bootstrapper for ASP.NET Web API nuget包使用自定义ActionFilterAttribute类进行依赖项注入 我已经在UnityConfig中注册了该类型,并且正在其他地方使用它(尽管在那里使用构造函数注入),它工作得很好C# Can';使用Unity bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入,c#,asp.net,dependency-injection,asp.net-web-api,unity-container,C#,Asp.net,Dependency Injection,Asp.net Web Api,Unity Container,我无法使用Unity bootstrapper for ASP.NET Web API nuget包使用自定义ActionFilterAttribute类进行依赖项注入 我已经在UnityConfig中注册了该类型,并且正在其他地方使用它(尽管在那里使用构造函数注入),它工作得很好 public static void RegisterTypes(IUnityContainer container) { container.RegisterType<ISettingService,
public static void RegisterTypes(IUnityContainer container)
{
container.RegisterType<ISettingService, SettingService>();
...
}
我需要做什么才能让它工作?我已经搜索了很长时间,只能找到MVC或具有不同依赖项注入程序的Web API的示例。首先创建一个
IFilterProvider
,它将执行构建并注入依赖项:
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;
}
}
我把这个方法放在
UnityWebPiActivator
类中调用了它。谢谢heaps Tuzo。我创建了一个新类,将RegisterFilterProviders方法添加到UnityWebPiActivator类中,并为新类添加了名称空间。“System.Collections.Generic.IEnumerable”不包含“ToList”的定义,并且找不到接受“System.Collections.Generic.IEnumerable”类型的第一个参数的扩展方法“ToList”(是否缺少using指令或程序集引用?)还有其他名称空间需要添加吗?@MichaelS:ToList()
是System.Linq
中的扩展方法。使用System.Linq添加代码>到文件顶部以解决编译错误。谢谢,这很好。由于某种原因,当我右键单击它时,没有“解决”选项。非常有用@图佐,你从哪里弄来的?我想自己读一读。谢谢大家!@RandyLevy我尝试过你的解决方案,但对我来说,ISettingService总是空的,你能帮我吗?
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;
}
}
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);
}