.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)

我们有 sample for this here as well.