无法在 System.Web.Http.Filters.ActionFilterAttribute 上使用 Unity

本文关键字:ActionFilterAttribute Unity Filters Http System Web | 更新日期: 2023-09-27 18:33:43

我无法使用用于 Web API nuget 包的 Unity 引导程序 ASP.NET 自定义 ActionFilterAttribute 类进行依赖注入。

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

public static void RegisterTypes(IUnityContainer container)
{
    container.RegisterType<ISettingService, SettingService>();
    ...
}

代码被成功调用,但实例化的对象 (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");
    }
    ...
}

我需要做什么才能使其正常工作? 我已经搜索了很长时间,只能找到 MVC 或具有不同依赖项注入器的 Web API 的示例。

无法在 System.Web.Http.Filters.ActionFilterAttribute 上使用 Unity

首先创建一个将执行 BuildUp 并注入依赖项的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;
    }
}

然后注册 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类中调用它。

相关文章:
  • 没有找到相关文章