【问题标题】:'ConfigureServices returning a System.IServiceProvider isn't supported.'“不支持返回 System.IServiceProvider 的配置服务。”
【发布时间】:2020-01-27 17:14:54
【问题描述】:

我需要在 ASP core 3.0 中使用这个AutoFac

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

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

它告诉我这个错误:

'不支持返回 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);
}

我该如何解决这个问题?

【问题讨论】:

    标签: c# asp.net-core dependency-injection autofac asp.net-core-3.0


    【解决方案1】:

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

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

    .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 documentation ASP.NET Core 3.0+

    【讨论】:

    • 需要注意的是,这不是 Autofac 特定的更改。当他们切换到使用通用应用程序主机时,ASP.NET Core 3.0 停止支持返回 IServiceProvider。使用服务提供商工厂现在是集成任何第三方 DI 容器的唯一方法。
    • @TravisIllig 感谢您指出这一点!但我有一个问题:builder.Populate(services) 是否仍然可行和需要?
    • 没有。如果您阅读此处答案中链接的文档会很好,它包含示例的完整演练。
    【解决方案2】:

    您可以使用 WebHost 代替 Program.cs 中的 Host

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

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2020-06-23
      • 2017-11-08
      • 1970-01-01
      • 2022-10-19
      • 2016-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-30
      相关资源
      最近更新 更多