You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 23:47:32