วิธีการตั้งค่าการตั้งค่าแอพใน. Net Core 3 Worker Service


22

ฉันได้ดูบทเรียนจำนวนหนึ่งและคำถาม SO (เช่นการตั้งค่าแอพ. Net Core ) เกี่ยวกับการอ่าน appsettings.json ใน. Net Core 3 และฉันไม่สามารถหาคำแนะนำใด ๆ เกี่ยวกับวิธีใช้เมื่อจัดการกับบริการของผู้ปฏิบัติงาน ไม่มีวิธีการเริ่มต้น แต่ฉันมี Program.cs ด้วยวิธีการหลัก:

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

ฉันจะอ่านเกี่ยวกับไฟล์ appsettings.json ใน Worker Service Project ใน. Net Core 3 ได้อย่างไร

ฉันได้เพิ่มการอ้างอิงไปยังไคลเอนต์ WCF ที่กำหนดเองที่ฉันสร้างด้วย. Net v4.8 และโครงการอื่นที่มีเพียง Busines Domain Object ที่ใช้ร่วมกันระหว่างโซลูชันทั้งหมด วิธีการแก้ปัญหาของฉันคือ. Net v4.8 เป็นหลักและฉันต้องการใช้บริการผู้ปฏิบัติงาน โครงการไคลเอนต์สร้างไคลเอนต์ WCF ภายในด้วยรหัสเพื่อผูกและปลายทางทั้งหมดสามารถกำหนดค่าได้ หากนี่เป็นโครงการ. Net v4.8 ฉันจะเพิ่มสิ่งต่อไปนี้ใน 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>

ตอนนี้ฉันต้องการการตั้งค่าเหล่านี้ให้อยู่ในรูปแบบ JSON ใหม่และอ่าน

แก้ไข

นี่เป็นโครงการใหม่ คนงานไม่ได้ทำอะไรเลย:

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

และนี่คือวิธีที่ฉันได้รับโครงการประเภทนี้:

บริการคนงาน

คำตอบ:


36

หากตัวอย่างเช่นระดับผู้ปฏิบัติงานจำเป็นต้องเข้าถึงข้อมูลบางอย่างที่เก็บไว้ในการตั้งค่าของคุณ

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เก็บค่าของคุณจากการกำหนดค่า

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

    //... other properties
}

ซึ่งถือว่าไฟล์appsettings.jsonมีคีย์ที่เกี่ยวข้อง

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

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

}

โดยค่าเริ่มต้นHost.CreateDefaultBuilderจะตั้งค่าการกำหนดค่าปกติ (appsettings.json และคณะ)

ใช้hostContext.Configurationเพื่อรับIConfigurationอินสแตนซ์ที่สามารถใช้เพื่อเข้าถึงการตั้งค่าที่ต้องการและเพิ่มรูปแบบวัตถุที่พิมพ์อย่างยิ่งสำหรับมัน เพิ่มออบเจ็กต์นั้นในคอลเลกชันบริการเพื่อให้สามารถถูกฉีดเมื่อจำเป็น

ตัวอย่างเช่น

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

เมื่อคนงานถูกสร้างขึ้นมันจะถูกฉีดด้วยการพึ่งพาที่จำเป็น

การกำหนดค่าอ้างอิงใน ASP.NET Core


คำตอบนี้สมบูรณ์แบบมาก มันมีวิธีที่ถูกต้องในการอ่านข้อมูลจากการตั้งค่าแอพ
Vighnesh

คุณสามารถใช้IConfigurationแทนการสร้างคลาสที่กำหนดเอง
Shimon Lebovits
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.