简体   繁体   English

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

[英]Recommended way to configure Autofac in ASP.NET Core 3.0

In ASP.NET Core 2.0, I used ConfigureServices method on Startup class to wire-up Autofac, wrap existing services registrations and add additional once.在 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);
}

Since ConfigureService method is void in ASP.NET Core 3.0 and no longer supports return parameter IServiceProvider , how do I wire up Autofac?由于ConfigureService方法在 ASP.NET Core 3.0 中void并且不再支持返回参数IServiceProvider ,我该如何连接 Autofac?

ASP.NET Core 3.0 IHostBuilder has extension method UseServiceProviderFactory , which can be used to register 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());
}

Registered provider will automatically wrap all standard services registered in void ConfigureServices(IServiceCollection services) method.注册的提供者将自动包装所有在void ConfigureServices(IServiceCollection services)方法中注册的标准服务。

There is no need for lines:不需要行:

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

To add additional Autofac-specific registrations , ConfigureContainer(ContainerBuilder builder) method on startup class can be used:添加额外的Autofac 特定注册,可以使用启动类上的ConfigureContainer(ContainerBuilder builder)方法:

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

Additional info can be found in this Github issue .可以在此Github 问题中找到其他信息。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM