在 BuildServiceProvider 之前访问服务
Posted
技术标签:
【中文标题】在 BuildServiceProvider 之前访问服务【英文标题】:Accessing a service before BuildServiceProvider 【发布时间】:2021-11-05 08:28:38 【问题描述】:我无法构建以下服务,因为需要将 configStoreService 注入到 AddInMemoryConfiguration、ConfigurationBuilder。那么,有没有办法在构建服务提供者之前检索 configStoreService 并使用它。
var services = new ServiceCollection();
var configStoreService = services.AddSingleton<ConfigurationStore>();
var configuration = new ConfigurationBuilder()
.AddInMemoryConfiguration(configStoreService)
.Build();
services.AddOptions();
services.Configure<Temp>(configuration.GetSection(typeof(Temp).Name));
services.RegisterOptionsType<Temp>(configuration);
_serviceProvider = services.BuildServiceProvider();
【问题讨论】:
【参考方案1】:前言:
这似乎是一个有问题的请求。你需要配置来配置服务,但是你需要配置服务来获取配置。鸡和蛋的问题。
做什么:
创建一个配置实例,使用它来配置您的服务并将其添加到您的服务集合中
var configStoreService = new ConfigurationStore(location, sku);
services.AddSingleton(configStoreService);
var configuration = new ConfigurationBuilder()
.AddInMemoryConfiguration(configStoreService)
.Build();
services.AddOptions();
services.Configure<Temp>(configuration.GetSection(typeof(Temp).Name));
services.RegisterOptionsType<Temp>(configuration);
_serviceProvider = services.BuildServiceProvider();
仅供参考:
我还必须补充一点,您无法从IServiceCollection
获得任何信息。你可以从IServiceProvider
which 那里得到东西,你会在注册完成并调用BuildServiceProvider
之后得到。所以在此之前您无法访问集合中的项目。
【讨论】:
以上是关于在 BuildServiceProvider 之前访问服务的主要内容,如果未能解决你的问题,请参考以下文章
在不使用 .BuildServiceProvider 的情况下调用服务并在该方法中返回后续服务所依赖的值?