.NET 5含字符串构造函数的类注册为单例失败问题排查
.NET 5 单例注册报错解决方案
问题根源
报错Unable to resolve service for type 'System.String' while attempting to activate SingletonService的核心原因是:DI容器中存在触发自动构造函数注入的SingletonService注册项,或者有服务依赖SingletonService具体类型而非接口ISingletonService,导致DI尝试通过构造函数创建实例,但容器未注册所需的字符串参数。
解决步骤
1. 清理冲突的服务注册
检查Startup.cs及所有扩展方法,确保没有同时存在services.AddSingleton<SingletonService>()这类未指定实例/工厂的注册写法。即使你手动注册了实例,只要有一条让DI自动构造的注册,就会触发报错。
2. 统一实例注册方式
如果需要同时支持接口和具体类型注入,用同一个实例注册:
// 先初始化实例 var configValue1 = Configuration["AppConfig:Value1"]; var configValue2 = Configuration["AppConfig:Value2"]; var singletonInstance = new SingletonService(configValue1, configValue2); // 注册接口映射 services.AddSingleton<ISingletonService>(singletonInstance); // 如果必须注入具体类型,添加这条 services.AddSingleton(singletonInstance);
3. 工厂注册的正确写法
使用工厂模式时,要直接在工厂内创建实例,避免DI解析构造函数:
services.AddSingleton<ISingletonService>(sp => { var registrySpec = sp.GetRequiredService<RegistrySpec>(); return new SingletonService(registrySpec.Value1, registrySpec.Value2); }); // 如需注册具体类型: services.AddSingleton(sp => { var registrySpec = sp.GetRequiredService<RegistrySpec>(); return new SingletonService(registrySpec.Value1, registrySpec.Value2); });
4. 替换所有具体类型依赖
检查所有注入SingletonService的类,将依赖替换为ISingletonService。仅在绝对必要时保留具体类型的注入,并确保其注册方式为实例/工厂模式。
5. 排查第三方组件自动注册
检查项目引用的NuGet包,确认是否有第三方库通过反射自动注册了SingletonService。如有,调整组件配置或手动覆盖注册。
6. 验证注册唯一性
在ConfigureServices末尾添加调试代码,确认注册项:
foreach (var service in services.Where(s => s.ServiceType == typeof(SingletonService) || s.ServiceType == typeof(ISingletonService))) { Console.WriteLine($"服务类型: {service.ServiceType}, 生命周期: {service.Lifetime}, 实例存在: {service.ImplementationInstance != null}"); }
若输出中出现多个SingletonService注册项,且其中某项ImplementationInstance为null,删除该注册即可。
内容的提问来源于stack exchange,提问作者garrett
相关产品推荐
相关产品推荐

