.NET Core 3.1启动前注入依赖 无法解析DbConnectionStringManager服务报错
问题解决方法
错误原因
.NET Core 3.1 中Startup类构造函数仅能注入主机默认提供的核心服务(如IConfiguration、IWebHostEnvironment),你当前在webBuilder.ConfigureServices中注册的自定义服务,在Startup实例化时还未被加载到DI容器中,因此无法解析DbConnectionStringManager实例触发报错。
解决方案
方案1:将自定义服务注册移到Host层级
把服务注册逻辑从webBuilder.ConfigureServices挪到Host层级的ConfigureServices中,这部分服务会在Startup实例化前完成注册,可直接注入到Startup构造函数:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) // 新增Host层级的服务注册,Startup构造函数可注入这里注册的服务 .ConfigureServices(serviceCollection => { serviceCollection.AddSingleton<AwsSecretProvider>(); serviceCollection.AddSingleton<ConnectionStringProviderFactory>(); serviceCollection.AddSingleton<DbConnectionStringManager>(); }) .ConfigureWebHostDefaults(webBuilder => { webBuilder .ConfigureLogging((hostingContext, config) => { config.ClearProviders(); }) .UseKestrel(options => { options.AllowSynchronousIO = true; options.Limits.MinRequestBodyDataRate = null; }) .UseIISIntegration() // 移除原webBuilder内的自定义服务注册 .UseIIS() .UseStartup<Startup>(); });
方案2:调整Startup的注入位置
如果不需要在Startup构造函数中使用DbConnectionStringManager,可以直接将其注入到Startup的ConfigureServices或Configure方法参数中,这两个方法执行时所有服务已完成注册,可正常解析:
// Startup类示例 public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } // 直接在ConfigureServices参数中注入需要的服务 public void ConfigureServices(IServiceCollection services, DbConnectionStringManager dbConnectionStringManager) { // 后续可直接使用dbConnectionStringManager实例 services.AddControllers(); // 其他服务注册逻辑 } public void Configure(IApplicationBuilder app, IWebHostEnvironment env, DbConnectionStringManager dbConnectionStringManager) { // 也可以在Configure方法中注入使用 // 中间件配置逻辑 } }
额外校验项
确认Startup构造函数中注入的DbConnectionStringManager的命名空间,和你定义的类的命名空间完全一致,避免因类型不匹配导致解析失败。
内容的提问来源于stack exchange,提问作者Koray Durudogan
相关产品推荐
相关产品推荐

