Autofac注册单例BackgroundService后StartAsync未触发问题咨询
问题结论
这个问题属于注册配置错误,既不是框架Bug,也不是对核心机制的理解误区,是注册时遗漏了接口暴露配置导致的。
根本原因
ASP.NET Core 主机启动时,会从依赖注入容器中解析所有注册为IHostedService接口的实例,依次调用其StartAsync方法完成后台服务启动。
你当前的注册逻辑存在接口暴露遗漏:
在Except<BackgroundSendMailService>的配置块中,你仅将该服务注册为IBackgroundSendMailService接口的实现,Autofac不会自动将其继承链上的IHostedService接口一并注册,因此容器中IHostedService的服务集合里不存在你的后台服务实例,自然不会触发StartAsync。
你移除SingleInstance配置的同时,也相当于移除了针对该服务的特殊注册逻辑,外层的AsImplementedInterfaces()规则生效,会自动将该类实现的所有接口(包括IHostedService)全部注册,所以主机可以正常检测到该服务并调用启动方法。
修复方案
修改特殊注册块,同时暴露两个接口即可:
builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()) .AsImplementedInterfaces() .Except<BackgroundSendMailService>(ct => ct .As<IBackgroundSendMailService>() .As<IHostedService>() .SingleInstance()) .PublicOnly();
配置后服务既会按你自定义的IBackgroundSendMailService单例注册供业务代码调用,也会被主机识别为后台服务触发启动逻辑。
内容的提问来源于stack exchange,提问作者ToPa
相关产品推荐
相关产品推荐

