gpt4 book ai didi

c# - 在 IServiceCollection 扩展中获取服务

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

我有这个扩展

public static class ServiceCollectionExtensions
{
public static IServiceCollection MyExtension(this IServiceCollection serviceCollection)
{
...
}
}

我需要从这样的服务中获取信息:

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
{
var myService = <<HERE>>();
options.TokenValidationParameters = this.GetTokenValidationParameters(myService);
});

我该怎么做?

我试图在 var serviceProvider = services.BuildServiceProvider(); 之后获取 ServiceProvider,然后发送 serviceProvider,但这并没有没用..

最佳答案

此时您正在调用 services.AddSomething() ,服务 provider 尚未从服务集合中构建。所以你不能在那个时候实例化一个服务。幸运的是,有一种方法可以在使用依赖注入(inject)的同时配置服务。

当你做 services.AddSomething(options => …)通常发生的是一定数量的服务将注册到服务集合中。然后传递的配置action也将以一种特殊的方式注册,这样当稍后实例化服务时,它就能够执行该配置操作以应用配置。

为此,您需要实现 IConfigureOptions<TOptions> (或者实际上是 IConfigureNamedOptions<TOptions> 用于身份验证选项)并将其注册为单例。为了您的目的,这可能看起来像这样:

public class ConfigureJwtBearerOptions : IConfigureNamedOptions<JwtBearerOptions>
{
private readonly IMyService _myService;

public ConfigureJwtBearerOptions(IMyService myService)
{
// ConfigureJwtBearerOptionsis constructed from DI, so we can inject anything here
_myService = myService;
}

public void Configure(string name, JwtBearerOptions options)
{
// check that we are currently configuring the options for the correct scheme
if (name == JwtBearerDefaults.AuthenticationScheme)
{
options.TokenValidationParameters = myService.GetTokenValidationParameters();
}
}

public void Configure(JwtBearerOptions options)
{
// default case: no scheme name was specified
Configure(string.Empty, options);
}
}

然后您在 Startup 中注册该类型:

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
// add JwtBearer but no need to pass options here
.AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, configureOptions: null);

// instead we are registering our configuration type to configure it later
services.AddSingleton<IConfigureOptions<JwtBearerOptions>, ConfigureJwtBearerOptions>();

这实际上与您执行 services.AddJwtBearer(scheme, options => { … }) 时发生的事情完全相同, 只是被抽象掉了,所以你不需要关心它。但是通过手动执行,您现在拥有更多的权力和访问完整的依赖项注入(inject)服务提供商的权限。

关于c# - 在 IServiceCollection 扩展中获取服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46962770/

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