ASP.NET Core 6中Autofac注册IHostedService依赖注入失败求助
问题原因分析
- 调用
builder.Services.AddHostedService<MyService>()时,ASP.NET Core内置DI会直接注册MyService为托管服务,实例创建走默认DI流程,完全忽略Autofac中配置的ResolvedParameter,导致构造函数的subscriber参数无法解析。 - 仅在Autofac中注册
MyService并添加.As<IHostedService>()但未注册自身类型时,控制器依赖MyService时,Autofac找不到对应注册项,导致实例化失败。
解决办法
步骤1:修正Autofac模块注册
移除builder.Services.AddHostedService<MyService>(),完全通过Autofac注册MyService,同时暴露IHostedService和自身类型,确保托管服务能启动、控制器能依赖。
修正后的MyAutofacModule代码:
public class MyAutofacModule : Module { protected override void Load(ContainerBuilder builder) { // 注册带键的IMessageSubscriber实例,注意接口要和MyService构造函数一致 builder.RegisterType<QueueSubscriber>() .Keyed<IMessageSubscriber>("MyServiceQueue") .WithParameter(new TypedParameter(typeof(QueueConnectionInfo), "some connection info")) .SingleInstance(); // 注册MyService,同时支持IHostedService和自身类型依赖 builder.RegisterType<MyService>() .WithParameter(new ResolvedParameter( // 精准匹配构造函数的subscriber参数 (pi, cc) => pi.Name == "subscriber" && pi.ParameterType == typeof(IMessageSubscriber), (pi, cc) => cc.ResolveKeyed<IMessageSubscriber>("MyServiceQueue") )) .As<IHostedService>() // 让ASP.NET Core识别为托管服务 .AsSelf() // 允许控制器直接依赖MyService类型 .SingleInstance(); } }
步骤2:修正Program.cs配置
确保移除builder.Services.AddHostedService<MyService>(),同时保留控制器注册(如果之前没加的话):
var builder = WebApplication.CreateBuilder(args); // 注册控制器服务 builder.Services.AddControllers(); // 配置Autofac作为服务提供工厂 builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureContainer<ContainerBuilder>(containerBuilder => { containerBuilder.RegisterModule<MyAutofacModule>(); }); var app = builder.Build(); // 配置中间件路由 app.UseRouting(); app.UseAuthorization(); app.MapControllers(); app.Run();
关键细节说明
.As<IHostedService>():必须添加,否则ASP.NET Core的托管服务系统无法发现MyService,导致服务无法启动。.AsSelf():核心配置,让Autofac将MyService自身类型也加入注册,控制器依赖MyService时能正常解析。- 参数匹配修正:ResolvedParameter中增加参数类型检查,避免同名不同类型的参数被错误匹配。
- 接口一致性:QueueSubscriber注册的键服务接口要和MyService构造函数的参数接口完全一致(原代码中
Keyed<ISubscriber>和IMessageSubscriber不匹配,需修正)。
内容的提问来源于stack exchange,提问作者csharpguy
相关产品推荐
相关产品推荐

