.NET Core 3.0-6预览版集成Autofac报错:不支持返回IServiceProvider
解决.NET Core 3.0+中Autofac的System.NotSupportedException问题
你遇到的这个错误是因为从.NET Core 3.0开始,当你使用AutofacServiceProviderFactory的时候,**不能再让ConfigureServices方法返回IServiceProvider**了——框架已经通过工厂来接管服务提供器的创建流程,原来2.1及更早版本的写法会和这个新机制直接冲突,导致抛出异常。
正确的调整方案:
- 把
ConfigureServices的返回类型从IServiceProvider改成void,只在这个方法里完成原生ASP.NET Core DI的服务注册 - 添加一个专门的
ConfigureContainer方法,用来处理Autofac容器的模块加载和自定义注册逻辑
修改后的完整代码示例:
Program类(无需改动)
public class Program { public static void Main(string[] args) => CreateHostBuilder(args).Build().Run(); public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .UseServiceProviderFactory(new AutofacServiceProviderFactory()) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); }
修改后的Startup类
public class Startup { public Startup(IConfiguration configuration) { Configuration = configuration; } public IConfiguration Configuration { get; } public IContainer ApplicationContainer { get; private set; } // 改为void返回值,仅处理原生DI服务注册 public void ConfigureServices(IServiceCollection services) { // 保留你的原生服务注册,比如控制器服务 services.AddControllers(); // 其他原生服务注册逻辑可以继续放在这里 } // 新增这个方法,专门处理Autofac的容器配置 public void ConfigureContainer(ContainerBuilder builder) { // 加载你的Autofac模块 builder.RegisterModule(new ContainerModule(Configuration)); // 这里可以添加其他Autofac专属的注册逻辑 } // Configure方法仅需微调容器释放部分,其余逻辑保持不变 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApplicationLifetime appLifetime) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseHsts(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); var jwtSettings = app.ApplicationServices.GetService<JwtSettings>(); var generalSettings = app.ApplicationServices.GetService<GeneralSettings>(); if (generalSettings.SeedData) { var dataInitializer = app.ApplicationServices.GetService<IDataInitializer>(); dataInitializer.SeedAsync(); } // 从应用服务中获取框架管理的Autofac容器实例 this.ApplicationContainer = app.ApplicationServices.GetAutofacRoot(); appLifetime.ApplicationStopped.Register(() => ApplicationContainer.Dispose()); } }
为什么原来的写法会失效?
在.NET Core 3.0引入的通用主机模型中,当你指定UseServiceProviderFactory时,框架期望完全通过这个工厂来创建和管理服务提供器的生命周期。如果你的ConfigureServices返回IServiceProvider,就会绕过工厂的处理流程,打破框架的统一管理逻辑,这也是为什么会抛出NotSupportedException——这是框架刻意设计的限制,确保服务容器的创建流程一致可控。
内容的提问来源于stack exchange,提问作者Karol Pisarzewski
相关产品推荐
相关产品推荐

