.Net Core 3ワーカーサービスでアプリ設定をセットアップする方法


22

.Net Core 3でappsettings.jsonを読むことに関するチュートリアルとSOの質問(App Settings .Net Coreなど)をいくつか見てきましたが、Workerサービスを処理するときのハウツーに関するポインターが見つかりません。スタートアップメソッドはありません。代わりに、mainメソッドを含む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のワーカーサービスプロジェクトのappsettings.jsonファイルから読み取るにはどうすればよいですか?

.Net v4.8で作成したカスタムWCFクライアントへの参照と、すべてのビジネスドメインオブジェクトのみをソリューション全体で共有する別のプロジェクトへの参照を追加しました。私のソリューションは主に.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

たとえば、ワーカークラスが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など)がセットアップされます。

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.