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

.NET Core 3.0-6预览版集成Autofac报错:不支持返回IServiceProvider

解决.NET Core 3.0+中Autofac的System.NotSupportedException问题

你遇到的这个错误是因为从.NET Core 3.0开始,当你使用AutofacServiceProviderFactory的时候,**不能再让ConfigureServices方法返回IServiceProvider**了——框架已经通过工厂来接管服务提供器的创建流程,原来2.1及更早版本的写法会和这个新机制直接冲突,导致抛出异常。

正确的调整方案:

  1. 把ConfigureServices的返回类型从IServiceProvider改成void,只在这个方法里完成原生ASP.NET Core DI的服务注册
  2. 添加一个专门的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:37:53