Come configurare le impostazioni dell'app in un servizio di lavoro .Net Core 3


22

Ho esaminato una serie di tutorial e domande SO (come Impostazioni app .Net Core ) per quanto riguarda la lettura di appsettings.json in .Net Core 3 e non riesco a trovare alcun suggerimento su come fare quando si tratta del servizio Worker. Non esiste un metodo di avvio. Invece, ho un Program.cs con il metodo principale:

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

Come posso leggere il file appsettings.json in un progetto di servizio di lavoro in .Net Core 3?

Ho aggiunto un riferimento a un client WCF personalizzato creato con .Net v4.8 e un altro progetto che ha condiviso tutti gli oggetti di dominio Busines tra l'intera soluzione. La mia soluzione è principalmente .Net v4.8 e desidero utilizzare il servizio di lavoro. Il progetto Client crea internamente un client WCF tramite codice, in modo che tutti i binding e gli endpoint siano configurabili. Se questo fosse un progetto .Net v4.8, aggiungerei quanto segue a 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>

Ora ho bisogno che queste impostazioni siano nel nuovo formato JSON e le leggano.

modificare

Questo è un nuovo progetto. Il lavoratore non sta facendo nulla:

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

Ed ecco come ottengo questo tipo di progetto:

Servizio al lavoratore

Risposte:


36

Se, ad esempio, la classe operaia avesse bisogno di accedere ad alcuni dati memorizzati nelle impostazioni delle app

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

Dove WorkerOptionsmemorizza i tuoi valori dalla configurazione.

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

    //... other properties
}

Il che presuppone che il file appsettings.json abbia le chiavi corrispondenti

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

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

}

Di default Host.CreateDefaultBuilderimposterà la solita configurazione (appsettings.json et al).

Utilizzare hostContext.Configurationper ottenere l' IConfigurationistanza che può essere utilizzata per accedere alle impostazioni desiderate e aggiungere il modello a oggetti fortemente tipizzato per esso. Aggiungi quell'oggetto alla raccolta servizi in modo che possa essere iniettato dove necessario

Per esempio

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

Quando viene creato, il lavoratore verrà iniettato con le dipendenze richieste.

Configurazione di riferimento in ASP.NET Core


Questa risposta è così perfetta. Fornisce il modo corretto di leggere i dati dalle impostazioni dell'app.
Vighnesh,

Puoi utilizzare IConfigurationinvece di creare una classe personalizzata
Shimon Lebovits il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.