Jak skonfigurować ustawienia aplikacji w usłudze .Net Core 3 Worker

22

Patrzyłem na wiele samouczków i pytań SO (takich jak Ustawienia aplikacji .Net Core ) dotyczących czytania appsettings.json w .Net Core 3 i nie mogę znaleźć żadnych wskazówek na temat tego, jak radzić sobie z usługą Worker. Nie ma metody uruchamiania. Zamiast tego mam Program.cs z główną metodą:

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>();
            });
}

Jak przejść do czytania z pliku appsettings.json w projekcie usługi pracownika w .Net Core 3?

Dodałem odniesienie do niestandardowego klienta WCF, który utworzyłem przy pomocy .Net v4.8 i do innego projektu, w którym wszystkie obiekty Busines Domain są współużytkowane przez całe rozwiązanie. Moje rozwiązanie to przede wszystkim .Net v4.8 i chcę korzystać z usługi Worker Service. Projekt klienta tworzy klienta WCF wewnętrznie za pomocą kodu, dzięki czemu wszystkie powiązania i punkty końcowe można konfigurować. Gdyby to był projekt .Net v4.8, dodałbym do 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>

Teraz potrzebuję tych ustawień, aby były w nowym formacie JSON i czytałem je.

Edytować

To jest świeży projekt. Pracownik nic nie robi:

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);
        }
    }
}

A oto, w jaki sposób otrzymuję ten typ projektu:

Obsługa pracowników

Hassan Gulzar
źródło

Odpowiedzi:

36

Jeśli na przykład klasa robotnicza potrzebuje dostępu do niektórych danych przechowywanych w twoich ustawieniach

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);
        }
    }
}

Gdzie WorkerOptionsprzechowuje twoje wartości z konfiguracji.

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

    //... other properties
}

Który zakłada, że plik appsettings.json ma odpowiednie klucze

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

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

}

Domyślnie Host.CreateDefaultBuilderskonfiguruje zwykłą konfigurację (appsettings.json i in.).

Użyj, hostContext.Configurationaby uzyskać IConfigurationinstancję, której można użyć, aby uzyskać dostęp do żądanych ustawień i dodać do niej silnie typowany model obiektu. Dodaj ten obiekt do kolekcji usług, aby można go było wstrzykiwać w razie potrzeby

Na przykład

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>();
            });
}

Podczas tworzenia pracownika zostanie wstrzyknięty jego wymagane zależności.

Odwołanie do konfiguracji w ASP.NET Core

Nkosi
źródło
Ta odpowiedź jest taka idealna. Zapewnia prawidłowy sposób odczytu danych z ustawień aplikacji.
Vighnesh,
Możesz użyć IConfigurationzamiast tworzyć niestandardową klasę
Shimon Lebovits