Bir .Net Core 3 Worker Hizmetinde uygulama ayarları nasıl yapılır


22

Ben .Net Core 3 appsettings.json okuma ile ilgili bir dizi öğretici ve SO soruları ( App Ayarları . Başlangıç ​​yöntemi yoktur. Bunun yerine, ana yöntemle bir Program.cs var:

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

.Net Core 3'teki bir Çalışan Hizmet Projesi'nde appsettings.json dosyasından nasıl okuma yapabilirim?

Net v4.8 ile oluşturduğum özel bir WCF istemcisine ve tüm çözüm arasında paylaşılan tüm Busines Domain Object'e sahip başka bir projeye bir referans ekledim. Benim çözümüm öncelikle .Net v4.8 ve İşçi Hizmetini kullanmak istiyorum. İstemci projesi kodla dahili olarak bir WCF İstemcisi oluşturur, böylece tüm bağlama ve uç noktalar yapılandırılabilir. Bu bir .Net v4.8 projesi olsaydı, app.config dosyasına şunları eklerdim:

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

Şimdi bu ayarların yeni JSON biçiminde olması ve bunları okuması gerekiyor.

Düzenle

Bu yeni bir proje. İşçi hiçbir şey yapmıyor:

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

İşte bu proje türünü nasıl alacağım:

İşçi Servisi

Yanıtlar:


36

Örneğin, işçi sınıfının uygulama ayarlarınızda depolanan bazı verilere erişmesi gerekiyorsa

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

Nerede WorkerOptionsyapılandırma adresinin değerlerini saklar.

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

    //... other properties
}

Hangi appsettings.json dosyasının karşılık gelen anahtarları olduğunu varsayar

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

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

}

Varsayılan Host.CreateDefaultBuilderolarak olağan yapılandırmayı ayarlar (appsettings.json ve ark.).

Kullanım hostContext.Configurationalmak için IConfigurationistenen ayarlara erişmek ve bunun için kesinlikle yazılı bir nesne modeli eklemek için kullanılabilir örneği. Bu nesneyi servis koleksiyonuna ekleyin, böylece gerektiğinde enjekte edilebilir

Örneğin

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

İşçi yaratılırken gerekli bağımlılıkları ile enjekte edilecektir.

ASP.NET Core'da Referans Yapılandırması


Bu cevap çok mükemmel. Uygulama ayarlarından veri okumak için doğru yolu sağlar.
Vighnesh

IConfigurationÖzel bir sınıf oluşturmak yerine kullanabilirsiniz
Shimon Lebovits
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.