我正在尝试将我们的框架项目迁移到.NET Core 3.1。作为迁移的一部分,我尝试通过GenericHost提供的ConfigureContainer方法注册模块。这就是我所拥有的:
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(builder => builder.RegisterModule(new
WorkerServiceDependencyResolver.WorkerServiceDependencyResolver()))
我的WorkerServiceDependencyResolver有以下内容:
builder.RegisterModule(new FirstModule());
builder.RegisterModule(new SecondModule());
但当我这样做时,我的应用程序不会运行,它启动时没有任何错误,但什么都不做。
但如果我这样写(这就是我们在.NET框架中的做法(:
var builder = new ContainerBuilder();
builder.RegisterModule(new FirstModule());
builder.RegisterModule(new SecondModule());
_container = builder.Build();
当我显式地构建容器时,一切都如预期的那样工作,但我的理解是,我们在.NET Core中不需要它?
我们非常感谢您的任何投入。
干杯!
通过向IHostBuilder
指定服务提供商工厂是AutofacServiceProviderFactory
,它允许您在Startup
类中创建一个方法,称为ConfigureContainer
,该方法将ContainerBuilder
作为参数。
这就是实例化IHostBuilder
的方式。没有什么特别的,只需遵循ASP.NET核心指南。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后,在Startup
类中,添加该方法。
public class Startup
{
public Startup(IConfiguration configuration) => Configuration = configuration;
public IConfiguration Configuration { get; }
// ...
public void ConfigureContainer(ContainerBuilder builder)
{
// Here you register your dependencies
builder.RegisterModule<FirstModule>();
}
// ...
}
然后,您的IContainer
将成为ASPNET核心应用程序范围的IOC容器
请注意,建设者在任何时候都没有被建造。这将由IHostBuilder
在某个时刻完成(使用Autofac扩展(。
希望能有所帮助。