在ASP.NET Core 3.0中配置Autofac的推荐方法是什么?

6
在ASP.NET Core 2.0中,我使用 Startup 类上的 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);
}

由于ASP.NET Core 3.0中ConfigureService方法是void类型,不再支持返回参数IServiceProvider,那么我该如何连接Autofac?

1个回答

13

ASP.NET Core 3.0 IHostBuilder有扩展方法UseServiceProviderFactory,可用于注册AutofacServiceProviderFactory

ASP.NET Core 3.0 IHostBuilder有一个扩展方法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)方法:

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

关于此问题,更多信息可以在Github issue中找到。


点赞答案和清晰的解释。个人而言,我不喜欢“分离”的调用。一个调用用于“非自动注册”,另一个调用用于“自动注册特定”。 - granadaCoder
1
未来的读者提示:PackageReference Include="Autofac.Extensions.DependencyInjection" Version="?.?.?" - granadaCoder
另请参阅:https://autofac.readthedocs.io/en/latest/integration/aspnetcore.html#asp-net-core-3-0-and-generic-hosting - granadaCoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接