【发布时间】:2021-11-17 14:03:00
【问题描述】:
我通过将.UseServiceProviderFactory(new AutofacServiceProviderFactory()) 放在 Host.CreateDefaultBuilder(...)``` 调用以及 Startup 类上的以下内容,创建了使用 AutoFac 的 ASP.NET Core Web 应用程序:
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule<ExampleRestApiModule>();
}
我还在控制台应用程序上通过手动创建 ContainerBuilder 然后获取 App 类的实例并调用 Run() 来完成此操作。我现在正在.NET Core 5 中编写一个 Windows 服务,并且使用内置的 DI,模板项目注册了一个派生自 Microsoft.Extensions.Hosting.BackgroundService 的 Worker 类。在我的项目中没有直接调用 ExecuteAsync 方法,因此它不像标准控制台应用程序那样我手动获取要调用的实例。这是我的程序课:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args)
{
IConfiguration configuration = new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
//.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables()
.AddCommandLine(args)
.Build();
return Host.CreateDefaultBuilder(args)
.UseWindowsService(options => { options.ServiceName = "MariaDB Backup Service"; })
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureServices((hostContext, services) =>
{
var backupServiceConfig = new List<BackupServiceConfig>();
configuration.Bind("Tasks:BackupService", backupServiceConfig);
services.AddSingleton(backupServiceConfig);
services.AddTransient<IBackupCommandFactory, BackupCommandFactory>();
services.AddTransient<MariaDbBackupService>();
services.AddHostedService<BackgroundWorker>();
})
;
}
}
我已经尝试将public void ConfigureContainer(ContainerBuilder builder) 放在后台工作人员上,但它永远不会被调用。如果这是一个 ASP.NET Core 应用程序,则 Host.CreateDefaultBuilder 调用将使用:
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后知道调用 AutoFac ConfigureContainer 方法,是否有一个等效的 Use 语句我应该放入以便平台知道调用它?或者有其他方法吗?
我想在 AutoFac 中使用一些更高级的 IoC 功能,但不确定如何在 AutoFac 和 MS DI 之间集成 IServiceCollection。
【问题讨论】:
标签: c# .net-core dependency-injection autofac