Cách thiết lập cài đặt ứng dụng trong Dịch vụ công nhân .Net Core 3


22

Tôi đã xem xét một số hướng dẫn và câu hỏi SO (chẳng hạn như Cài đặt ứng dụng .Net Core ) liên quan đến việc đọc appsinstall.json trong .Net Core 3 và tôi không thể tìm thấy bất kỳ gợi ý nào về cách thực hiện khi giao dịch với dịch vụ Công nhân. Không có phương pháp Khởi động. Thay vào đó, tôi có một Program.cs với phương thức chính:

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

Làm cách nào để đọc về tệp appsinstall.json trong Dự án Dịch vụ Công nhân trong .Net Core 3?

Tôi đã thêm một tham chiếu đến ứng dụng khách WCF tùy chỉnh mà tôi đã tạo bằng .Net v4.8 và một dự án khác có tất cả Đối tượng miền Busines được chia sẻ giữa toàn bộ giải pháp. Giải pháp của tôi chủ yếu là .Net v4.8 và tôi muốn sử dụng Dịch vụ Công nhân. Dự án Client tạo một WCF Client bên trong bằng mã để tất cả các ràng buộc và điểm cuối đều có thể cấu hình được. Nếu đây là một dự án .Net v4.8, tôi sẽ thêm phần sau vào 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>

Bây giờ tôi cần các cài đặt này ở định dạng JSON mới và đọc chúng trong.

Biên tập

Đây là một dự án mới. Công nhân không làm gì cả:

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

Và đây là cách tôi có được loại dự án này:

Dịch vụ công nhân

Câu trả lời:


36

Ví dụ, nếu lớp worker cần truy cập vào một số dữ liệu được lưu trong cài đặt ứng dụng của bạn

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

Nơi WorkerOptionslưu trữ giá trị của bạn từ cấu hình.

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

    //... other properties
}

Giả sử tệp appsinstall.json có các khóa tương ứng

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

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

}

Theo mặc định Host.CreateDefaultBuildersẽ thiết lập cấu hình thông thường (appsinstall.json et al).

Sử dụng hostContext.Configurationđể lấy IConfigurationví dụ có thể được sử dụng để truy cập các cài đặt mong muốn và thêm mô hình đối tượng được gõ mạnh cho nó. Thêm đối tượng đó vào bộ sưu tập dịch vụ để có thể đưa nó vào nơi cần thiết

Ví dụ

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

Khi công nhân đang được tạo, nó sẽ được thêm vào các phụ thuộc cần thiết.

Cấu hình tham chiếu trong ASP.NET Core


Câu trả lời này quá hoàn hảo. Nó cung cấp cách chính xác để đọc dữ liệu từ cài đặt ứng dụng.
Vighnesh

Bạn có thể sử dụng IConfigurationthay vì tạo một lớp tùy chỉnh
Shimon Lebovits
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.