无法使用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

查看:90
本文介绍了无法使用Unity Bootstrapper for ASP.NET Web API nuget包在System.Web.Http.Filters.ActionFilterAttribute上注入的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆