gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 19:03:48 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com