'ConfigureServices returning a System.IServiceProvider isn't supported.'
Asked Answered
H

4

27

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?

Holdover answered 27/9, 2019 at 11:18 Comment(0)
B
36

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+

Bouchard answered 27/9, 2019 at 11:24 Comment(3)
It's somewhat important to note that this isn't an Autofac-specific change. ASP.NET Core 3.0 stopped supporting returning an IServiceProvider when they switched to use the generic application host. Using a service provider factory is now the only way to integrate any third-party DI container.Deadbeat
@TravisIllig Thanks for pointing this out! But I've got one question: is builder.Populate(services) still workable and needed?Photocomposition
No. It'd be good if you read the documentation linked in the answer here, it has a total walkthrough with examples.Deadbeat
H
8

Instead of Host in Program.cs you can use WebHost

public class Program
{
  public static void Main(string[] args)
  {
    CreateWebHostBuilder(args).Build().Run();
  }

  public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
      .UseStartup<Startup>();
}

In this case following code works

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  ...
  var builder = new ContainerBuilder();

  builder.Populate(services);
  var container = builder.Build();
  return new AutofacServiceProvider(container);
}
Harday answered 2/9, 2020 at 8:21 Comment(0)
R
0

you must change program.c

public static void Main(string[] args)
{
    CreateWebHostBuilder(args).Build().Run();
}

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
   WebHost.CreateDefaultBuilder(args)
       .ConfigureLogging(options => options.ClearProviders())
       .UseStartup<Startup>();
Recitative answered 5/4, 2022 at 5:24 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Clavus
P
-1

Instead of Host use WebHost in Program.cs

It work for me ...

Palaeontography answered 12/2, 2022 at 9:30 Comment(3)
This looks more like a comment to this answer rather than a new answer.Phyte
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Clavus
This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From ReviewReinwald

© 2022 - 2024 — McMap. All rights reserved.