Зарегистрируйте размещенные службы на основе конфигурации в. NET Основные рабочие службы - PullRequest
0 голосов
/ 05 апреля 2020

In. NET core 3+ работающая служба, мы можем зарегистрировать несколько рабочих служб, используя ConfigureServices с помощью метода CreateHostBuilder , как показано ниже

Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
   services.AddHostedService<TestWorker1>();
   services.AddHostedService<TestWorker2>();
});

Есть ли способ добавить эти services (TestWorker1, TestWorker2), на основе параметра конфигурации (например, appsettings. json), так что регистрируются только службы, определенные в файле конфигурации.

Любой другой универсальный c подход, отличный от Подход файла конфигурации также приветствуется.

Заранее спасибо.

1 Ответ

2 голосов
/ 05 апреля 2020

Вы можете сделать что-то вроде этого, где вы можете прочитать свою конфигурацию из любого IConfiguration.

Игнорировать config["HostedServices"] = "worker1";, это просто для целей тестирования.

        var config = new ConfigurationBuilder()
                        .AddJsonFile("appsettings.json", optional: true)
                        .AddInMemoryCollection()
                        .Build();

        config["HostedServices"] = "worker1";
        // config["HostedServices"] = "worker1,worker2";

        var hostBuilder = Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                var workersString = config.GetValue<string>("HostedServices");
                var workers = workersString.Split(",");
                if(workers.Contains("worker1"))
                {
                    services.AddHostedService<Worker1>();
                }
                if(workers.Contains("worker2"))
                {
                    services.AddHostedService<Worker2>();
                }

            }).ConfigureLogging(b => {
                b.AddConsole();
                b.SetMinimumLevel(LogLevel.Information);
            });

        using(var host = hostBuilder.Build())
        {
            await host.StartAsync();
            await host.StopAsync();
        }

Полный пример, где вы можете проверить, можно найти в этом netfiddle

...