Как настроить параметры приложения в .Net Core 3 Worker Service


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 Service. Клиентский проект создает клиента 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.