【问题标题】:.NET Core Windows Service with Autofac.NET Core Windows 服务与 Autofac
【发布时间】: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


    【解决方案1】:

    您需要将ConfigureContainer 函数传递给调用.UseServiceProviderFactory(new AutofacServiceProviderFactory(ConfigureContainer)),或者您可以添加额外的调用.ConfigureContainer&lt;ContainerBuilder&gt;(ConfigureContainer)

    我们有一个sample for this here as well

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-15
      • 2019-12-20
      • 2020-04-24
      • 1970-01-01
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 2019-11-12
      相关资源
      最近更新 更多