c# - 如何将应用程序服务注入 AuthenticationHandler
问题描述
我有一个AuthenticationHandler<>
依赖于应用程序服务的自定义实现。有没有办法解决AuthenticationHandler
Simple Injector 的依赖关系?或者可能是跨线注册,以便可以解决应用程序服务IServiceCollection
?
为简单起见,示例实现如下所示:
public class AuthHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
private readonly ITokenDecryptor tokenDecryptor;
public SecurityTokenAuthHandler(ITokenDecryptor tokenDecryptor,
IOptionsMonitor<AuthenticationSchemeOptions> options,
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) :
base(options, logger, encoder, clock) =>
this.tokenDecryptor = tokenDecryptor;
protected override async Task<AuthenticateResult> HandleAuthenticateAsync() =>
return tokenDecryptor.Decrypt(this);
}
...
services.AddAuthentication("Scheme")
.AddScheme<AuthenticationSchemeOptions, AuthHandler>("Scheme", options => { });
目前的解决方案是手动跨线应用服务,不太方便:
services.AddTransient(provider => container.GetInstance<ITokenDecryptor>());
解决方案
陶的回答是对的。实现这一点的最简单方法是将连接到AuthHandler
Simple Injector。
这可以按如下方式完成:
// Your original configuration:
services.AddAuthentication("Scheme")
.AddScheme<AuthenticationSchemeOptions, AuthHandler>("Scheme", options => { });
// Cross wire AuthHandler; let Simple Injector create AuthHandler.
// Note: this must be done after the call to AddScheme. Otherwise it will
// be overridden by ASP.NET.
services.AddTransient(c => container.GetInstance<AuthHandler>());
// Register the handler with its dependencies (in your case ITokenDecryptor) with
// Simple Injector
container.Register<AuthHandler>();
container.Register<ITokenDecryptor, MyAwesomeTokenDecryptor>(Lifestyle.Singleton);
推荐阅读
- javascript - 在下拉菜单上使用锚标记进行页面导航
- javascript - 有没有办法创建一个可以读取它所在目录的模块?(打字稿/JavaScript)
- java - 在静态成员类中展平 JUnit 测试
- ios - 如何在 SwiftUI 中迭代/foreach 数组
- python - 使用 mypy 的子类型
- c - 为什么我的代码会导致分段错误,但没有使用不同的起始参数?
- javascript - 如何使第二个导航栏菜单粘性正确工作?
- c# - 获取 EF Core 3.1 中的角色列表
- javascript - Express JavaScript Supertest 期望特定的 json 字段
- django - 在 Model.Meta 中使用 CheckConstraint 和 Django GenericForeignKey 时出错 - 此查询中不允许连接字段引用