Luc*_*gon 6 c# dependency-injection asp.net-core
我刚刚将 .net 核心应用程序从版本 2.2 升级到 3。在 startup.cs 的 ConfigureServices 方法中,我需要解析身份验证服务使用的服务。我正在使用“services.BuildServiceProvider()”“构建”所有服务,但 .net core 3 抱怨创建额外服务副本的方法,并建议我将依赖注入服务作为“配置”的参数。我不知道这个建议是什么意思,我想了解它。
public virtual void ConfigureServices(IServiceCollection services)
{
// Need to resolve this.
services.AddSingleton<IManageJwtAuthentication, JwtAuthenticationManager>();
var sp = services.BuildServiceProvider(); // COMPLAINING HERE!!
var jwtAuthManager = sp.GetRequiredService<IManageJwtAuthentication>();
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(c =>
{
c.TokenValidationParameters = new TokenValidationParameters
{
AudienceValidator = jwtAuthManager.AudienceValidator,
// More code here...
};
}
}
Run Code Online (Sandbox Code Playgroud)
itm*_*nus 10
但是 .net core 3 抱怨创建额外服务副本的方法,并建议我将依赖注入服务作为“配置”的参数。
实际上,ServiceCollection.BuildServiceProvider()
应该由主机自动调用。您的代码services.BuildServiceProvider();
将创建一个与默认服务提供者不同的重复服务提供者,这可能会导致服务状态不一致。在此处查看由多个服务提供者引起的错误。
要解决此问题,请使用依赖项注入配置选项,而不是创建服务提供者然后定位服务。
对于您的代码,将它们重写如下:
services.AddSingleton<IManageJwtAuthentication, JwtAuthenticationManager>();
services.AddOptions<JwtBearerOptions>(JwtBearerDefaults.AuthenticationScheme)
.Configure<IManageJwtAuthentication>((opts,jwtAuthManager)=>{
opts.TokenValidationParameters = new TokenValidationParameters
{
AudienceValidator = jwtAuthManager.AudienceValidator,
// More code here...
};
});
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4124 次 |
最近记录: |