在 ASP.NET Core 3.0 中配置 Autofac 的推荐方法

Recommended way to configure Autofac in ASP.NET Core 3.0

在 ASP.NET Core 2.0 中,我在 Startup class 上使用了 ConfigureServices 方法来连接 Autofac,包装现有的 services 注册并添加额外的一个。

public IServiceProvider ConfigureServices(IServiceCollection services)
{
    // Standard service registrations (ex: services.AddMvc())
    // ...
    
    // Autofac
    var builder = new ContainerBuilder();
    builder.Populate(services); // wrap service registrations
    builder.RegisterModule<MyModule>(); // add extra registrations

    this.ApplicationContainer = builder.Build();
    return new AutofacServiceProvider(this.ApplicationContainer);
}

由于 ConfigureService 方法在 ASP.NET Core 3.0 中是 void 并且不再支持 return 参数 IServiceProvider,我该如何连接 Autofac?

ASP.NETCore 3.0IHostBuilder有扩展方法UseServiceProviderFactory,可以用来注册AutofacServiceProviderFactory:

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

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder => {
                webBuilder.UseStartup<Startup>();
            })
            .UseServiceProviderFactory(new AutofacServiceProviderFactory());
}

注册提供者将自动包装在void ConfigureServices(IServiceCollection services)方法中注册的所有标准服务。

不需要行:

public void ConfigureContainer(ContainerBuilder builder)
{
    // ...
    builder.Populate(services); // Not needed!
    // ...
    return new AutofacServiceProvider(this.ApplicationContainer); // Not needed!
}

添加额外的 Autofac 特定注册ConfigureContainer(ContainerBuilder builder) 启动方法class 可以使用:

public partial class Startup
{
    public void ConfigureContainer(Autofac.ContainerBuilder builder)
    {
        builder.RegisterModule<MyModule>();
    }
}

可以在 Github issue 中找到更多信息。