ASP.NET Core 2.2迁移至8+结合Autofac遇构造函数未找到问题
ASP.NET Core 8中ConfigureServices返回IServiceProvider的可行性及问题解决
核心结论
ASP.NET Core 8仍然支持在ConfigureServices中返回IServiceProvider来自定义DI容器,但你遇到的异常并非源于该特性被移除,而是Autofac与ASP.NET Core路由系统的集成方式错误导致的。
问题原因分析
- ASP.NET Core路由系统的内部类型(如
TreeRouteBuilder、EndpointMetadataComparer)仅由框架原生DI以内部逻辑注册,这些类型的构造函数并非公开可反射的。 - 你手动返回
AutofacServiceProvider的方式会让Autofac接管所有服务的激活流程,它会尝试通过反射创建这些内部类型,而由于构造函数不可访问,最终抛出异常。 - 从ASP.NET Core 2.2到8的版本迭代中,路由系统的内部实现发生了大幅变更,旧的
AddMvc/UseMvc(禁用端点)模式兼容性下降,新的端点路由系统对DI集成的要求更严格。
解决方案
1. 使用Autofac官方集成包(推荐)
放弃手动返回AutofacServiceProvider的方式,改用官方提供的Autofac.Extensions.DependencyInjection包实现集成,让Autofac与原生DI协同工作:
- 安装NuGet包:
Autofac.Extensions.DependencyInjection - 在
Program.cs中配置Autofac:
这种方式下,框架内部服务由原生DI处理,Autofac仅负责自定义服务,避免了激活内部类型的冲突。var builder = WebHost.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureServices(services => { // 注册ASP.NET Core原生服务 services.AddControllersWithViews(); }) .ConfigureContainer<ContainerBuilder>(containerBuilder => { // 在这里注册你的自定义服务到Autofac containerBuilder.RegisterType<YourCustomService>().As<IYourCustomService>(); });
2. 适配ASP.NET Core 8的路由配置
- 替换旧的
AddMvc()为AddControllersWithViews() - 在
Configure方法中按正确顺序配置路由中间件:public void Configure(IApplicationBuilder app) { // 其他中间件(如静态文件、异常处理等) app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
内容的提问来源于stack exchange,提问作者Alby87
相关产品推荐
相关产品推荐

