C# Can';使用Unity bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入

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,

我无法使用Unity bootstrapper for ASP.NET Web API nuget包使用自定义ActionFilterAttribute类进行依赖项注入

我已经在UnityConfig中注册了该类型,并且正在其他地方使用它(尽管在那里使用构造函数注入),它工作得很好

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);
}