«ConfigureServices, возвращающий System.IServiceProvider, не поддерживается».

Мне нужно использовать это AutoFac в ASP core 3.0

Когда я использую этот код при запуске:

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

Он показывает мне эту ошибку:

«ConfigureServices, возвращающий System.IServiceProvider, не поддерживается».

И меняю program.cs на это:

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

Но это не решено.

Это BuildAutofacServiceProvider() Код:

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

    return new AutofacServiceProvider(container);
}

Как я могу решить эту проблему?


person mr-dortaj    schedule 27.09.2019    source источник


Ответы (2)


Изменился синтаксис запуска для настройки Autofac для ASP.NET Core 3.0+.

В дополнение к использованию следующего на строителе хоста

.UseServiceProviderFactory(new AutofacServiceProviderFactory())

В Startup выполните следующий формат

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

    //...
}

Ссылка на документацию Autofac для ASP.NET Core 3.0+

person Nkosi    schedule 27.09.2019
comment
Важно отметить, что это изменение не относится к Autofac. ASP.NET Core 3.0 перестала поддерживать возврат IServiceProvider, когда они переключились на использование общего хоста приложения. Теперь использование фабрики поставщика услуг - единственный способ интегрировать любой сторонний контейнер DI. - person Travis Illig; 27.09.2019
comment
@TravisIllig Спасибо, что указали на это! Но у меня есть один вопрос: работает ли builder.Populate (services) и нужен ли он? - person Henry Roeland; 09.12.2019
comment
Нет. Было бы хорошо, если бы вы прочитали документацию по ссылке в ответе здесь, в ней есть полное пошаговое руководство с примерами. - person Travis Illig; 09.12.2019

Вместо Host в Program.cs вы можете использовать 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>();
}

В этом случае работает следующий код

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

  builder.Populate(services);
  var container = builder.Build();
  return new AutofacServiceProvider(container);
}
person R.Titov    schedule 02.09.2020