Як налаштувати параметри додатків у службі .Net Core 3 Worker


22

Я переглянув декілька навчальних посібників та запитань щодо SO (наприклад, Налаштування додатків. Net Core ) щодо читання appsettings.json в .Net Core 3, і не можу знайти жодних вказівників щодо того, як користуватися службою Worker. Не існує методу запуску. Натомість у мене є Program.cs з основним методом:

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
            });
}

Як я можу прочитати з файлу appsettings.json у проекті Worker Service в .Net Core 3?

Я додав посилання на користувальницький клієнт WCF, який я створив за допомогою .Net v4.8, та інший проект, у якому всі об’єкти домену Busines поділяються між усім рішенням. Моє рішення - це насамперед .Net v4.8, і я хочу скористатися службою Worker. Клієнтський проект створює Клієнт WCF внутрішньо за кодом, щоб усі прив'язки та кінцеві точки були налаштовані. Якби це проект .Net v4.8, я б додав у app.config таке:

<appSettings>
    ...
    <add key="AminServiceUri" value="http://localhost:45108/ServiceHost/v1/AminService.svc" />
    <add key="BillServiceUri" value="http://localhost:45108/ServiceHost/v1/BillService.svc" />
    <add key="CustomerServiceUri" value="http://localhost:45108/ServiceHost/v1/CustomerService.svc" />
    <add key="EpayServiceUri" value="http://localhost:45108/ServiceHost/v1/EpayService.svc" />
    <add key="FinanceServiceUri" value="http://localhost:45108/ServiceHost/v1/FinanceService.svc" />
    <add key="GrpServiceUri" value="http://localhost:45108/ServiceHost/v1/GrpService.svc" />
    <add key="MetaServiceUri" value="http://localhost:45108/ServiceHost/v1/MetaService.svc" />
    <add key="ReportServiceUri" value="http://localhost:45108/ServiceHost/v1/ReportService.svc" />
    <add key="ServiceInfoServiceUri" value="http://localhost:45108/ServiceHost/v1/ServiceInfoService.svc" />
    <add key="UsersServiceUri" value="http://localhost:45108/ServiceHost/v1/UsersService.svc" />
    ...
    <add key="ExcessiveLogging" value="false" />
    ...
</appSettings>

Тепер мені потрібно, щоб ці налаштування були у новому форматі JSON і читали їх у.

Редагувати

Це свіжий проект. Працівник нічого не робить:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> logger;

    public Worker(ILogger<Worker> logger)
    {
        this.logger = logger;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(5000, stoppingToken);
        }
    }
}

Ось як я отримую цей тип проекту:

Служба працівників

Відповіді:


36

Якщо, наприклад, робітничий клас потребував доступу до деяких даних, що зберігаються у ваших програмах

public class Worker : BackgroundService {
    private readonly ILogger<Worker> logger;
    private readonly WorkerOptions options;

    public Worker(ILogger<Worker> logger, WorkerOptions options) {
        this.logger = logger;
        this.options = options;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
        while (!stoppingToken.IsCancellationRequested) {
            //do something that uses options

            logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            await Task.Delay(5000, stoppingToken);
        }
    }
}

Де WorkerOptionsзберігаються ваші значення з конфігурації.

public class WorkerOptions {
    public string AminServiceUri { get; set; }
    public string BillServiceUri { get; set; }

    //... other properties
}

Що передбачає, що файл appsettings.json має відповідні клавіші

{
  "WCF": {
    "AminServiceUri":"http://localhost:45108/ServiceHost/v1/AminService.svc",
    "BillServiceUri":"http://localhost:45108/ServiceHost/v1/BillService.svc",

    //...other key-value pairs
  },
  "Logging": {
    "ExcessiveLogging": false
  }

}

За замовчуванням Host.CreateDefaultBuilderбуде встановлено звичайну конфігурацію (appsettings.json et al).

Використовуйте, hostContext.Configurationщоб отримати IConfigurationекземпляр, за допомогою якого можна отримати доступ до потрібних налаштувань, і додати для нього сильно набрану модель об'єкта. Додайте цей об’єкт до колекції служб, щоб його можна було ввести там, де потрібно

Наприклад

public class Program {
    public static void Main(string[] args) {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) => {
                IConfiguration configuration = hostContext.Configuration;

                WorkerOptions options = configuration.GetSection("WCF").Get<WorkerOptions>();

                services.AddSingleton(options);

                services.AddHostedService<Worker>();
            });
}

Коли робочий створюється, йому вводять необхідні залежності.

Конфігурація довідника в ASP.NET Core


Ця відповідь така досконала. Він забезпечує правильний спосіб зчитування даних із налаштувань програми.
Вігнеш

Можна використовувати IConfiguration замість створення спеціального класу
Шимон Лебовиць
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.