在 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 获得任何信息。你可以从IServiceProviderwhich 那里得到东西,你会在注册完成并调用BuildServiceProvider 之后得到。所以在此之前您无法访问集合中的项目。

【讨论】:

以上是关于在 BuildServiceProvider 之前访问服务的主要内容,如果未能解决你的问题,请参考以下文章

在不使用 .BuildServiceProvider 的情况下调用服务并在该方法中返回后续服务所依赖的值?

控制台使用依赖注入

.Net C#控制台依赖注入

.net core 3 依赖注入服务作为“配置”的参数

#yyds干货盘点#分析一个错误使用MemoryCache导致的BUG

从.Net core 2.2迁移到.Net Core 3.0