So richten Sie App-Einstellungen in einem .Net Core 3 Worker-Dienst ein

22

Ich habe mir eine Reihe von Tutorials und SO-Fragen (z. B. App-Einstellungen .Net Core ) zum Lesen von appsettings.json in .Net Core 3 angesehen und kann beim Umgang mit dem Worker-Dienst keine Hinweise zur Vorgehensweise finden. Es gibt keine Startmethode. Stattdessen habe ich eine Program.cs mit der Hauptmethode:

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

Wie lese ich aus der Datei appsettings.json in einem Worker Service-Projekt in .Net Core 3?

Ich habe einen Verweis auf einen benutzerdefinierten WCF-Client hinzugefügt, den ich mit .Net v4.8 erstellt habe, und auf ein anderes Projekt, bei dem nur das gesamte Busines-Domänenobjekt für die gesamte Lösung freigegeben ist. Meine Lösung ist in erster Linie .Net v4.8 und ich möchte den Worker Service verwenden. Das Client-Projekt erstellt einen WCF-Client intern per Code, sodass alle Bindungs- und Endpunkte konfigurierbar sind. Wenn dies ein .NET v4.8-Projekt wäre, würde ich der app.config Folgendes hinzufügen:

<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>

Jetzt müssen diese Einstellungen im neuen JSON-Format vorliegen und eingelesen werden.

Bearbeiten

Dies ist ein neues Projekt. Der Arbeiter tut nichts:

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

Und so bekomme ich diesen Projekttyp:

Arbeiterservice

Hassan Gulzar
quelle

Antworten:

36

Wenn die Worker-Klasse beispielsweise Zugriff auf einige Daten benötigt, die in Ihren Appsettings gespeichert sind

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

Wo WorkerOptionsspeichert Ihre Werte aus der Konfiguration.

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

    //... other properties
}

Dies setzt voraus, dass die Datei appsettings.json die entsprechenden Schlüssel hat

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

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

}

Standardmäßig Host.CreateDefaultBuilderwird die übliche Konfiguration eingerichtet (appsettings.json et al.).

Verwenden Sie hostContext.Configurationdiese Option , um die IConfigurationInstanz abzurufen, mit der auf die gewünschten Einstellungen zugegriffen werden kann, und fügen Sie das stark typisierte Objektmodell hinzu. Fügen Sie dieses Objekt der Service-Sammlung hinzu, damit es bei Bedarf injiziert werden kann

Zum Beispiel

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

Wenn der Worker erstellt wird, werden ihm die erforderlichen Abhängigkeiten hinzugefügt.

Referenzkonfiguration in ASP.NET Core

Nkosi
quelle
Diese Antwort ist so perfekt. Es bietet die richtige Möglichkeit, Daten aus App-Einstellungen zu lesen.
Vighnesh
Sie können verwenden, IConfigurationanstatt eine benutzerdefinierte Klasse zu erstellen
Shimon Lebovits