首页 > 解决方案 > ASP.NET Core 3.0:禁用 ASP0000 不要在“ConfigureServices”中调用“IServiceCollection.BuildServiceProvider”

问题描述

我有一个 ASP.NET Core 3.0 应用程序。在 Startup 类中,在方法中

public void ConfigureServices(IServiceCollection services)

我想配置身份验证,以便 JWT 由我的 ISecurityTokenValidator 实现处理:CustomJwtSecurityTokenHandler。为此,我需要获取我的实现类 CustomJwtSecurityTokenHandler 的实例,它的构造函数需要注入一些服务。因此,我需要致电:

var serviceProvider = services.BuildServiceProvider();

为了创建一个“临时” serviceProvider 来获取我的带有注入参数的 CustomJwtSecurityTokenHandler 实例。

我最终得到了这段代码(效果很好!):

services.AddAuthentication(authenticationOptions =>
{
    authenticationOptions.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    authenticationOptions.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(jwtBearerOptions =>
{
    jwtBearerOptions.SecurityTokenValidators.Clear();

    CustomJwtSecurityTokenHandler customJwtSecurityTokenHandler;
    {
        // create a temporary serviceProvider, in order to retrieve a CustomJwtSecurityTokenHandler (supposed to be registered as addin!).
        var serviceProvider = services.BuildServiceProvider();
        customJwtSecurityTokenHandler = serviceProvider.GetService<CustomJwtSecurityTokenHandler>();
    }

    //below line adds the custom validator class
    jwtBearerOptions.SecurityTokenValidators.Add(customJwtSecurityTokenHandler);
});

只是,从方法 ConfigureServices 中调用 services.BuildServiceProvider() 有一些问题(例如单例),我收到以下警告:

ASP0000 从应用程序代码调用“BuildServiceProvider”会导致创建单例服务的额外副本。考虑替代方案,例如依赖注入服务作为“配置”的参数。

那么.. 配置需要注入其他一些注册服务的服务的好方法是什么?

标签: c#asp.net-core

解决方案


推荐阅读