Search code examples
c#asp.net-coredependency-injectionautofacasp.net-core-3.0

'ConfigureServices returning a System.IServiceProvider isn't supported.'


I need ti use this AutoFac in ASP core 3.0

When I use this code in startu up:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    return services.BuildAutofacServiceProvider();
}

It show me this error:

'ConfigureServices returning an System.IServiceProvider isn't supported.'

And I change the program.cs by this:

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>();
            });
}

But it not solved.

This is BuildAutofacServiceProvider() Code:

public static IServiceProvider BuildAutofacServiceProvider(this IServiceCollection services)
{
    var ContainerBuilder = new ContainerBuilder();
    ContainerBuilder.Populate(services);
    ContainerBuilder.AddService();
    var container = ContainerBuilder.Build();

    return new AutofacServiceProvider(container);
}

How can I solve this problem?


Solution

  • Startup syntax has changed for configuring Autofac for ASP.NET Core 3.0+

    In addition to using the following on the host builder

    .UseServiceProviderFactory(new AutofacServiceProviderFactory())
    

    In Startup do the following format

    public void ConfigureServices(IServiceCollection services) {
        //... normal registration here
    
        // Add services to the collection. Don't build or return
        // any IServiceProvider or the ConfigureContainer method
        // won't get called.
    
        services.AddControllers();
    }
    
    // ConfigureContainer is where you can register things directly
    // with Autofac. This runs after ConfigureServices so the things
    // here will override registrations made in ConfigureServices.
    // Don't build the container; that gets done for you. If you
    // need a reference to the container, you need to use the
    // "Without ConfigureContainer" mechanism shown later.
    public void ConfigureContainer(ContainerBuilder builder) {
        // Register your own things directly with Autofac
        builder.AddMyCustomService();
    
        //...
    }
    

    Reference Autofac documentation for ASP.NET Core 3.0+