[英].net core Startup.cs CreateScope or BuildServiceProvider
我只是在创建一个新的 API,我从几个项目中注意到我尝试以不同的方式在 Startup.cs 中获取配置文件。 第一种方式是这样的:
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 容器添加服务。 常见的方法是在Startup
的ConfigureServices
中执行此操作(在 Program.cs 中也可以)
如果您需要ConfigureServices
方法中的IIdentityServerConfig
实例,则无需调用services.BuildServiceProvider()
,因为您应该已经拥有它。
如果您在Configure
方法中需要IIdentityServerConfig
的实例,则只需将其作为参数传递,例如:
public void Configure(IApplicationBuilder app, IIdentityServerConfig config)
{
}
或使用app
:
app.ApplicationServices.GetService<IIdentityServerConfig>();
所以,正确的方法是不在启动文件中建立服务提供者
但如果你真的需要这个,如果你不需要新的 scope,我更愿意使用这个(我认为你不需要)
var serviceProvider = services.BuildServiceProvider();
var config = serviceProvider.GetRequiredService<IIdentityServerConfig>();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.