【问题标题】:How can I inject dependencies into a System.Web.Http.AuthorizeAttribute subclass?如何将依赖项注入 System.Web.Http.AuthorizeAttribute 子类?
【发布时间】:2016-01-27 04:19:05
【问题描述】:

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

我们希望能够使用 Unity 将依赖项注入此属性。我已经进行了很多搜索,但大多数示例与我的用例不同,因此没有用处。

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

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

【问题讨论】:

  • 不要将行为注入属性:stackoverflow.com/a/7194467/126014
  • 我认为下面的方法不会遇到您上面描述的相同缺陷,因为注入也是由属性驱动的,如果要在使用前直接实例化属性,则可以完全填充。

标签: c# asp.net-web-api dependency-injection unity-container asp.net-web-api2


【解决方案1】:

您必须实现 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));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-06
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 2013-06-28
    相关资源
    最近更新 更多