c# - 实现 IAuthenticationFilter、工作单元和依赖注入(inject)

标签 c# entity-framework unity-container asp.net-web-api2 unit-of-work

我有一个 Web API 2 项目,它正在实现如下所示的自定义 IAuthenticationFilter。

我的问题是 UnitOfWork 不是由 Unity 在 BasicAuthenticator 类中注入(inject)的。正如预期的那样,Unity 在 Controller 中成功注入(inject)了 UnitOfWork。

public class BasicAuthenticator : Attribute, IAuthenticationFilter
{
    [Dependency]
    public UnitOfWork UoW { get; set; }

    public bool AllowMultiple { get { return false; } }     

    public Task AuthenticateAsync(HttpAuthenticationContext context,
                                  CancellationToken cancellationToken)
    {
        // ignore missing implementation
        context.Principal = new ClaimsPrincipal(new[] { id });     
        return Task.FromResult(0);
    }

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context,
                            CancellationToken cancellationToken) {}
}

最佳答案

您需要创建一个自定义 IFilterProvider,它将在适用的过滤器上执行 BuildUp()。 BuildUp 操作会将所有依赖项注入(inject)过滤器。

这是一个 UnityFilterProvider 可以做到这一点:

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

    public UnityFilterProvider(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;
    }
}

接下来在应用程序启动时,您需要将默认过滤器提供程序替换为上面的自定义提供程序:

GlobalConfiguration.Configuration.Services.Add(
    typeof(System.Web.Http.Filters.IFilterProvider),
    new UnityFilterProvider(container));

var providers = GlobalConfiguration.Configuration.Services.GetFilterProviders()
               .ToList();
var defaultprovider = providers.First(p => p is ActionDescriptorFilterProvider);

GlobalConfiguration.Configuration.Services.Remove(
    typeof(System.Web.Http.Filters.IFilterProvider), 
    defaultprovider);

我通常使用 Unity bootstrapper for ASP.NET Web API所以我把上面的代码放在RegisterTypes()之后的UnityConfig.cs中。

关于c# - 实现 IAuthenticationFilter、工作单元和依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31826461/

相关文章:

c# - 使用 Reflection.Emit 以编程方式为现有类属性添加新属性

c# - 基于 XAML 的关卡编辑器

c# - 关闭 WPF MVVM 中的窗口

entity-framework - Entity Framework 'Update Model from Database'在基类和子类之间重新创建关联

c# - 依赖注入(inject)的 DbContext 始终为 null

c# - 附加属性的统一

c# - 为什么 InterfaceInterceptor 不比 TransparentProxyInterceptor 快?

c# - 如果另一个窗体正在其 MDI 父窗体中运行,如何从子窗体检查?

wcf - 如何防止 .NET 实体中的私有(private)属性通过服务公开为公共(public)属性?

asp.net-mvc - Unity 依赖注入(inject) - 如何在 .config 中注册实例?