. net core 3.1 WorkerService не загружает параметры / настройки конфигурации - PullRequest
1 голос
/ 05 февраля 2020

Используя шаблон готового проекта для WorkerService (. net core 3.1), я не могу заставить IOptions<x> работать.

Вот минимальное воспроизведение:

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

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

mailsettings

public class mailsettings
{
    public string smtpserver { get; set; }
}

Работник

public class Worker : BackgroundService
{
    private readonly mailsettings _mailsettings;

    public Worker(IOptions<mailsettings> mailsettings)
    {
        _mailsettings = mailsettings.Value;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            Console.WriteLine($"MailSettings SmtpServer: \"{(_mailsettings.smtpserver ?? "**null**")}\"");
            Console.WriteLine(Directory.GetCurrentDirectory());
            await Task.Delay(1000, stoppingToken);
        }
    }
}

appsettings. json и appsettings.development. json содержимое следует:

{
  "mailsettings": {
    "smtpserver": "mail.com"
  }
}

Это будет писать:

MailSettings SmtpServer: " null "

на консоли. Должно быть написано

"mail.com".

Я попробовал тонну догадок ... но никуда не деться.

1 Ответ

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

Параметры почты не настроены в коллекции служб, поэтому контейнер DI не может разрешить IOPtions<mailsettings>

Вызов Configure<TOPtions> в коллекции служб

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .UseConsoleLifetime()
        .ConfigureServices((hostContext, services) => {
            services
                .AddOptions()
                .Configure<mailsettings>(hostContext.Configuration.GetSection("mailsettings"))
                .AddHostedService<Worker>();
        });

Ссылка Конфигурация в ASP. NET Core

Ссылка Шаблон параметров в ASP. NET Core

...