gpt4 book ai didi

c# - .net core Startup.cs CreateScope 或 BuildServiceProvider

转载 作者:行者123 更新时间:2023-12-05 05:01:55 28 4
gpt4 key购买 nike

我刚刚创建了一个新的 API,我从几个项目中注意到我尝试以不同的方式在 Startup.cs 中获取 Config 文件。第一种方式是这样的:

var serviceProvider = services.BuildServiceProvider();
var config = serviceProvider.GetRequiredService<IIdentityServerConfig>();

第二种方式是这样的:

var scope = services.BuildServiceProvider().CreateScope();
var config = scope.ServiceProvider.GetRequiredService<Auth0Config>();

我的问题是,哪一个是正确的?还是无所谓?


这是一个例子:

public void ConfigureServices(IServiceCollection services)
{
services.AddCors(m => m.AddPolicy(CorsName, o => o.AllowAnyOrigin().AllowAnyHeader().AllowAnyMethod()));
services.AddLogging(Configuration, nameof(DataConfig));

AddConfigs(services);
AddSingletons(services);
AddTransients(services);

ConfigureStripe(services);

AddDatabaseContexts(services);
AddAuthentication(services);
AddServices(services);

services.AddMvc().AddFluentValidation(m => m.RegisterValidatorsFromAssemblyContaining<QuestionValidator>());
}

AddConfigs 方法如下所示:

private void AddConfigs(IServiceCollection services)
{
services.Configure<Auth0Config>(Configuration.GetSection(nameof(Auth0Config)));
services.Configure<DataConfig>(Configuration.GetSection(nameof(DataConfig)));
services.Configure<EvaluatorConfig>(Configuration.GetSection(nameof(EvaluatorConfig)));
services.Configure<StripeConfig>(Configuration.GetSection(nameof(StripeConfig)));
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});

services.AddSingleton(m => m.GetRequiredService<IOptions<Auth0Config>>().Value);
services.AddSingleton(m => m.GetRequiredService<IOptions<DataConfig>>().Value);
services.AddSingleton(m => m.GetRequiredService<IOptions<EvaluatorConfig>>().Value);
services.AddSingleton(m => m.GetRequiredService<IOptions<StripeConfig>>().Value);
}

然后您可以看到我如何获取其他服务的配置(例如 AddAuthentication 方法:

private static void AddAuthentication(IServiceCollection services)
{
var scope = services.BuildServiceProvider().CreateScope();
var config = scope.ServiceProvider.GetRequiredService<Auth0Config>();

services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer("Bearer", options =>
{
options.Authority = config.Authority;
options.Audience = config.ApiAudience;
});
}

最佳答案

首先,您需要向 DI 容器添加服务。常见的方法是在 StartupConfigureServices 中执行此操作(也可以在 Program.cs 中执行)

如果您需要 ConfigureServices 方法中的 IIdentityServerConfig 实例,则无需调用 services.BuildServiceProvider(),因为您应该已经有它。

如果您需要 Configure 方法中的 IIdentityServerConfig 实例,则只需将其作为参数传递,例如:

public void Configure(IApplicationBuilder app, IIdentityServerConfig config)
{
}

或者使用app:

app.ApplicationServices.GetService<IIdentityServerConfig>();

所以,正确的方法不是在启动文件中构建服务提供者

但是如果你真的需要这个,如果你不需要一个新的范围(我认为你不需要)我宁愿使用这个

var serviceProvider = services.BuildServiceProvider();
var config = serviceProvider.GetRequiredService<IIdentityServerConfig>();

关于c# - .net core Startup.cs CreateScope 或 BuildServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62448348/

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