- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚创建了一个新的 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 容器添加服务。常见的方法是在 Startup
的 ConfigureServices
中执行此操作(也可以在 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/
我刚刚从另一个项目的最后粘贴了 4 行,它可以工作,但我收到警告..我显然不太了解 DI ......它想让我改变什么? public void ConfigureServices(IServic
有时,在服务注册期间,我需要从 DI 容器解析其他(已经注册的)服务。对于像 Autofac 或 DryIoc 这样的容器,这没什么大不了的,因为您可以在一行上注册服务,在下一行上您可以立即解决它。
有什么好办法可以拿到ServiceProvider在 AddOpenIdConnect , 或 稍后在我们完全设置 DI 容器的地方配置 ClientSecret? (例如在 Configure(IA
我有一个 dotnet core 3.1 C# XUnit 项目。 它有一个包含以下 Initialise 方法的 Startup 类: public static IServiceProvider
我刚刚创建了一个新的 API,我从几个项目中注意到我尝试以不同的方式在 Startup.cs 中获取 Config 文件。第一种方式是这样的: var serviceProvider = servic
我有一个使用 Redis 分布式缓存和 cookie 身份验证的 .NET Core 3 项目(最近从 2.2 升级)。 它目前看起来像这样: public void ConfigureService
在我的 .net Core 应用程序的 Main 方法中,我收到此错误,我不知道应该在哪里寻找解决方案。 这是我的主要方法: public static void Main(string[] arg
我有模块化的 ASP.NET Core 应用程序。回到 .NET Core 1.1 时代,我在 public void ConfigureServices(IServiceCollection ser
我是一名优秀的程序员,十分优秀!