Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将依赖项注入System.Web.Http.AuthorizeAttribute子类?_C#_Asp.net Web Api_Dependency Injection_Unity Container_Asp.net Web Api2 - Fatal编程技术网

C# 如何将依赖项注入System.Web.Http.AuthorizeAttribute子类?

C# 如何将依赖项注入System.Web.Http.AuthorizeAttribute子类?,c#,asp.net-web-api,dependency-injection,unity-container,asp.net-web-api2,C#,Asp.net Web Api,Dependency Injection,Unity Container,Asp.net Web Api2,我正在开发一个使用web API 2和Unity的ASP.NET web应用程序。我们已经用内置的子类修饰了控制器/控制器方法,以便为Web API公开的各种REST端点应用授权 我们希望能够使用Unity将依赖项注入到该属性中。我已经做了相当多的搜索,但大多数示例与我的用例相差太大,没有什么用处 如何使用Unity将依赖项注入System.Web.Http.AuthorizeAttribute子类? 我已经尝试创建一个自定义FilterProvider,在属性实例上调用Unity的build方

我正在开发一个使用web API 2和Unity的ASP.NET web应用程序。我们已经用内置的子类修饰了控制器/控制器方法,以便为Web API公开的各种REST端点应用授权

我们希望能够使用Unity将依赖项注入到该属性中。我已经做了相当多的搜索,但大多数示例与我的用例相差太大,没有什么用处

如何使用Unity将依赖项注入System.Web.Http.AuthorizeAttribute子类?


我已经尝试创建一个自定义FilterProvider,在属性实例上调用Unity的
build
方法,但是我不确定应该扩展哪个基类或者应该实现哪个接口。

您必须实现IFilterProvider。如果扩展ActionDescriptorFilterProvider,则可以调用base.GetFilters以获取在控制器和操作级别指定的筛选器

public class UnityFilterProvider : ActionDescriptorFilterProvider, IFilterProvider
{
    private readonly IUnityContainer _container;

    public UnityFilterProvider(IUnityContainer container)
    {
        _container = container;
    }

    public new IEnumerable<FilterInfo> GetFilters(HttpConfiguration configuration, HttpActionDescriptor actionDescriptor)
    {
        var attributes = base.GetFilters(configuration, actionDescriptor).ToList();

        foreach (var attr in attributes)
        {
            _container.BuildUp(attr.Instance.GetType(), attr.Instance);
        }
        return attributes;
    }
}

不要向属性中注入行为:我认为下面的方法不会遇到与您上面描述的相同的陷阱,因为注入也是由属性驱动的,如果要在使用之前直接实例化属性,则可以完全填充。
//Register the filter injector
var providers = config.Services.GetFilterProviders().ToList();
var defaultprovider = providers.Single(i => i is ActionDescriptorFilterProvider);
config.Services.Remove(typeof(IFilterProvider), defaultprovider);
config.Services.Add(typeof(IFilterProvider), new UnityFilterProvider(UnityConfig.Container));