Cara mengatur pengaturan aplikasi di .Net Core 3 Worker Service

22

Saya telah melihat sejumlah tutorial dan pertanyaan SO (seperti Pengaturan Aplikasi .Net Core ) tentang membaca appsettings.json di .Net Core 3 dan saya tidak dapat menemukan petunjuk tentang cara-cara ketika berhadapan dengan layanan Pekerja. Tidak ada metode Startup. Sebagai gantinya, saya memiliki Program.cs dengan metode utama:

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

Bagaimana cara saya membaca dari file appsettings.json di Proyek Layanan Pekerja di .Net Core 3?

Saya telah menambahkan referensi ke klien WCF khusus yang saya buat dengan .Net v4.8 dan proyek lain yang hanya memiliki semua Busines Domain Object yang dibagikan di antara seluruh solusi. Solusi saya terutama .Net v4.8 dan saya ingin menggunakan Layanan Pekerja. Proyek Klien membuat Klien WCF secara internal dengan kode sehingga semua ikatan dan titik akhir dapat dikonfigurasi. Jika ini adalah proyek .Net v4.8, saya akan menambahkan yang berikut ke 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>

Sekarang saya perlu pengaturan ini dalam format JSON baru dan membacanya.

Edit

Ini adalah proyek baru. Pekerja tidak melakukan apa-apa:

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

Dan inilah cara saya mendapatkan jenis proyek ini:

Layanan Pekerja

Hassan Gulzar
sumber

Jawaban:

36

Misalnya, jika kelas pekerja membutuhkan akses ke beberapa data yang disimpan dalam pengaturan aplikasi Anda

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

Di mana WorkerOptionsmenyimpan nilai Anda dari konfigurasi.

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

    //... other properties
}

Yang menganggap file appsettings.json memiliki kunci yang sesuai

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

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

}

Secara default Host.CreateDefaultBuilderakan mengatur konfigurasi yang biasa (appsettings.json et al).

Gunakan hostContext.Configurationuntuk mendapatkan IConfigurationinstance yang dapat digunakan untuk mengakses pengaturan yang diinginkan dan menambahkan model objek yang sangat diketik untuk itu. Tambahkan objek itu ke koleksi layanan sehingga dapat disuntikkan di mana diperlukan

Sebagai contoh

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

Ketika pekerja diciptakan, ia akan disuntik dengan dependensi yang diperlukan.

Konfigurasi Referensi di ASP.NET Core

Nkosi
sumber
Jawaban ini sangat sempurna. Ini menyediakan cara yang benar untuk membaca data dari pengaturan aplikasi.
Vighnesh
Anda dapat menggunakan IConfigurationalih-alih membuat kelas khusus
Shimon Lebovits