[c#] .Net Core 3 Worker Service에서 앱 설정을 설정하는 방법

.Net Core 3에서 appsettings.json을 읽는 것과 관련된 많은 자습서와 SO 질문 (예 : App Settings .Net Core )을 살펴 보았으며 Worker 서비스를 처리 할 때 방법에 대한 포인터를 찾을 수 없습니다. 시작 방법이 없습니다. 대신 주요 방법으로 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>();
            });
}

.Net Core 3의 Worker Service Project에서 appsettings.json 파일을 어떻게 읽습니까?

.Net v4.8로 작성한 사용자 정의 WCF 클라이언트와 전체 솔루션간에 공유 된 모든 비즈니스 도메인 오브젝트가있는 다른 프로젝트에 대한 참조를 추가했습니다. 내 솔루션은 주로 .Net v4.8이며 Worker Service를 사용하고 싶습니다. 클라이언트 프로젝트는 코드에 의해 내부적으로 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);
        }
    }
}

이 프로젝트 유형을 얻는 방법은 다음과 같습니다.

근로자 서비스



답변

예를 들어 작업자 클래스가 appsettings에 저장된 일부 데이터에 액세스해야하는 경우

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 et al).

사용 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의 참조 구성


답변