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

.NET 8从Startup模式迁移DI时服务构造报错问题咨询

.NET 8迁移时DI无法解析MyData的问题分析与解决

异常原因

旧模式下你通过ActivatorUtilities.CreateInstance手动传入MyData实例创建MyService,相当于绕过了DI容器的自动解析逻辑——容器不需要负责MyData的实例化,完全由你手动控制。

但在.NET 8新方式中,直接注册MyService后,DI容器会在builder.Build()阶段执行服务验证(开发环境默认启用),它会检查MyService的所有构造函数依赖是否已在容器中注册。由于你没有把MyData注册到DI容器,也没有提供MyService的自定义实例化逻辑,容器无法自动解析MyData,因此抛出激活失败的异常。

解决方法

根据你的实际场景,选择以下方案:

方案1:将MyData注册到DI容器

如果MyData的int参数可以从配置、其他服务或固定值获取,直接把MyData注册到容器,让DI自动解析依赖:

// 先注册MyData,根据实际情况获取int参数
builder.Services.AddScoped<MyData>(sp => 
{
    // 示例:从配置读取参数
    int dataParam = builder.Configuration.GetValue<int>("MyConfig:DataParam");
    return new MyData(dataParam);
});

// 再注册MyService,DI会自动注入MyData
builder.Services.AddScoped<MyService>();

方案2:用工厂方式手动创建MyService

如果需要手动控制MyData的实例化(比如参数是动态生成的),沿用ActivatorUtilities的思路,通过工厂委托注册MyService:

builder.Services.AddScoped<MyService>(sp => 
{
    // 手动创建MyData实例,替换成你的实际参数逻辑
    var myData = new MyData(456);
    // 利用ActivatorUtilities让DI注入其他自动解析的依赖,同时传入手动创建的MyData
    return ActivatorUtilities.CreateInstance<MyService>(sp, myData);
});

补充说明

.NET 8的DI容器默认在开发环境启用了服务验证,会提前检查所有注册服务的依赖完整性,这是为了更早发现问题。旧模式下Startup类的方式不会提前做这个验证,只有在实际请求MyService时才会暴露问题,这也是迁移后立刻报错的原因之一。

内容的提问来源于stack exchange,提问作者gsharp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:36:01