Comment configurer les paramètres de l'application dans un service de travail .Net Core 3

22

J'ai examiné un certain nombre de didacticiels et de questions SO (tels que Paramètres d'application .Net Core ) concernant la lecture de appsettings.json dans .Net Core 3 et je ne trouve aucun pointeur sur la façon de traiter avec le service Worker. Il n'y a pas de méthode de démarrage. Au lieu de cela, j'ai un Program.cs avec la méthode 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>();
            });
}

Comment puis-je lire le fichier appsettings.json dans un projet de service de travail dans .Net Core 3?

J'ai ajouté une référence à un client WCF personnalisé que j'ai créé avec .Net v4.8 et un autre projet qui a juste tout l'objet de domaine Busines partagé entre la solution entière. Ma solution est principalement .Net v4.8 et je souhaite utiliser le Worker Service. Le projet Client crée un client WCF en interne par code afin que toutes les liaisons et tous les points de terminaison soient configurables. S'il s'agissait d'un projet .Net v4.8, j'ajouterais ce qui suit à 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>

Maintenant, j'ai besoin que ces paramètres soient au nouveau format JSON et les lisent.

Éditer

Ceci est un nouveau projet. Le travailleur ne fait rien:

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

Et voici comment j'obtiens ce type de projet:

Service des travailleurs

Hassan Gulzar
la source

Réponses:

36

Si, par exemple, la classe de travail avait besoin d'accéder à certaines données stockées dans vos paramètres d'application

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

WorkerOptionsstocke vos valeurs de configuration.

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

    //... other properties
}

Ce qui suppose que le fichier appsettings.json possède les clés correspondantes

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

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

}

Par défaut Host.CreateDefaultBuilder, définira la configuration habituelle (appsettings.json et al).

Utilisez hostContext.Configurationpour obtenir l' IConfigurationinstance qui peut être utilisée pour accéder aux paramètres souhaités et lui ajouter le modèle d'objet fortement typé. Ajoutez cet objet à la collection de services afin qu'il puisse être injecté si nécessaire

Par exemple

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

Lorsque le travailleur est créé, il sera injecté avec ses dépendances requises.

Configuration de référence dans ASP.NET Core

Nkosi
la source
Cette réponse est tellement parfaite. Il fournit la bonne façon de lire les données des paramètres de l'application.
Vighnesh
Vous pouvez utiliser IConfigurationau lieu de créer une classe personnalisée
Shimon Lebovits