.NET Core Windows Autofac 服务
.NET Core Windows Service with Autofac
我创建了 ASP.NET 核心网络应用程序,我在其中使用了 AutoFac,方法是将 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
放在 Host.CreateDefaultBuilder(...)``` 调用以及以下是启动 class:
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule<ExampleRestApiModule>();
}
我还在控制台应用程序上完成了此操作,方法是手动创建 ContainerBuilder,然后获取应用程序实例 class 并调用 运行()。我现在正在 .NET Core 5 中编写一个 Windows 服务,并且使用内置的 DI,模板项目注册了一个从 Microsoft.Extensions.Hosting.BackgroundService
派生的 Worker class。在我的项目中没有直接调用 ExecuteAsync 方法,因此它不像标准控制台应用程序那样我手动获取要调用的实例。这是我的程序 class:
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 核心应用程序,则 Host.CreateDefaultBuilder 调用将使用:
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后知道调用 AutoFac ConfigureContainer 方法的东西,是否有一个等效的 Use 语句我应该放入以便平台知道调用它?或者有其他方法吗?
我想在 AutoFac 中使用一些更高级的 IoC 功能,但不确定如何在 AutoFac 和 MS DI 之间集成 IServiceCollection。
您需要将 ConfigureContainer
函数传递到调用 .UseServiceProviderFactory(new AutofacServiceProviderFactory(ConfigureContainer))
中,或者您可以添加一个额外的调用 .ConfigureContainer<ContainerBuilder>(ConfigureContainer)
我创建了 ASP.NET 核心网络应用程序,我在其中使用了 AutoFac,方法是将 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
放在 Host.CreateDefaultBuilder(...)``` 调用以及以下是启动 class:
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterModule<ExampleRestApiModule>();
}
我还在控制台应用程序上完成了此操作,方法是手动创建 ContainerBuilder,然后获取应用程序实例 class 并调用 运行()。我现在正在 .NET Core 5 中编写一个 Windows 服务,并且使用内置的 DI,模板项目注册了一个从 Microsoft.Extensions.Hosting.BackgroundService
派生的 Worker class。在我的项目中没有直接调用 ExecuteAsync 方法,因此它不像标准控制台应用程序那样我手动获取要调用的实例。这是我的程序 class:
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 核心应用程序,则 Host.CreateDefaultBuilder 调用将使用:
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
然后知道调用 AutoFac ConfigureContainer 方法的东西,是否有一个等效的 Use 语句我应该放入以便平台知道调用它?或者有其他方法吗?
我想在 AutoFac 中使用一些更高级的 IoC 功能,但不确定如何在 AutoFac 和 MS DI 之间集成 IServiceCollection。
您需要将 ConfigureContainer
函数传递到调用 .UseServiceProviderFactory(new AutofacServiceProviderFactory(ConfigureContainer))
中,或者您可以添加一个额外的调用 .ConfigureContainer<ContainerBuilder>(ConfigureContainer)