web-dev-qa-db-fra.com

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

J'ai regardé un certain nombre de tutoriels et SO questions (telles que App Settings .Net Core ) concernant la lecture de appsettings.json dans .Net Core 3 et je ne peux pas trouver des pointeurs 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.

Modifier

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:

Worker Service

19
Hassan Gulzar

Si, par exemple, la classe des travailleurs avait besoin d'accéder à certaines données stockées dans vos paramètres d'applications

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

WorkerOptions stocke 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 mettra en place la configuration habituelle (appsettings.json et al).

Utilisation hostContext.Configuration pour obtenir l'instance IConfiguration 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.

Référence Configuration dans ASP.NET Core

29
Nkosi