“不支持返回System.IServiceProvider的ConfigureServices。”

mr-*_*taj 7 c# dependency-injection autofac asp.net-core asp.net-core-3.0

我需要AutoFac在ASP core 3.0中使用它

当我在启动时使用此代码时:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    return services.BuildAutofacServiceProvider();
}
Run Code Online (Sandbox Code Playgroud)

它向我显示此错误:

'不支持返回System.IServiceProvider的ConfigureServices。

然后我通过以下方式更改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>();
            });
}
Run Code Online (Sandbox Code Playgroud)

但这并没有解决。

这是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);
}
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

Nko*_*osi 8

启动语法已更改,可为ASP.NET Core 3.0+配置Autofac

除了在主机生成器上使用以下内容

.UseServiceProviderFactory(new AutofacServiceProviderFactory())
Run Code Online (Sandbox Code Playgroud)

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) {
    //configure auto fac here
    builder.AddService();

    //...
}
Run Code Online (Sandbox Code Playgroud)

参考ASP.NET Core 3.0+的Autofac文档

  • 一定要注意,这不是Autofac的特定更改。当ASP.NET Core 3.0切换为使用通用应用程序主机时,停止支持返回“ IServiceProvider”。现在,使用服务提供商工厂是集成任何第三方DI容器的唯一方法。 (3认同)

R.T*_*tov 5

Host您可以使用而不是Program.csWebHost

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

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

在这种情况下,以下代码有效

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

  builder.Populate(services);
  var container = builder.Build();
  return new AutofacServiceProvider(container);
}
Run Code Online (Sandbox Code Playgroud)