noxi雑記

.NET、Angularまわりの小ネタブログ

MicroBatchFrameworkを試す 2 - アプリケーション設定

前回の記事では MicroBatchFramework を使用したバッチアプリの作成と実行、発行を試してみました。この記事は MicroBatchFramework を使用するバッチアプリで設定ファイルを読み込んでみます。


試用環境

設定ファイルの作成と読み込み

MicroBatchFrameworkを使用すると HostBuilder を拡張してバッチアプリを作ることができます。この HostBuilderASP.NET Core をホストしている WebHost を Web アプリ以外でも汎用的に使えるようにしたもので、実行に関する設定方法で両者に大きな違いはありません(私が無いと思っているだけですが)。

設定ファイルを作成する

BatchApp プロジェクトの直下に次の appsettings.json ファイルを作成します。

src\BatchApp\appsettings.json

{
  "AppName": "BatchApp",
  "AppVersion": 5
}

この JSON ファイルは作成しただけだとビルド時に出力フォルダにコピーされないため、ビルド時に常にコピーされるようにプロジェクトファイルを修正します。

src\BatchApp\BatchApp.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <!--<TargetFramework>netcoreapp2.2</TargetFramework>-->
    <TargetFrameworks>netcoreapp2.2;net461</TargetFrameworks>
    <LangVersion>latest</LangVersion>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="appsettings*.json" />
    <Content Include="appsettings.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </Content>
    <Content Include="appsettings.*.json">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
      <DependentUpon>appsettings.json</DependentUpon>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="MicroBatchFramework" Version="1.0.0" />
    <PackageReference Include="Microsoft.Extensions.Options.ConfigurationExtensions" Version="2.2.0" />
  </ItemGroup>

</Project>

設定ファイルを読み込む

.NET Core ではアプリケーションの設定を IConfigurationBuilder を使用して定義し、 IConfiguration から読み取ります。 HostBuilder を直接使用する場合は JSON ファイルを読み込むように設定する必要がありますが、 BatchHost を使用するとその辺りは全て設定済の HostBuilder が得られるため、設定ファイルとのマッピングだけを追加します。まずはマッピング用のクラスを作成します。

src\BatchApp\Program.cs

using System;
using System.Threading.Tasks;
using MicroBatchFramework;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace BatchApp
{
    ...

    class SampleConfig
    {
        public string AppName { get; set; }
        public int AppVersion { get; set; }
    }
}

マッピング用のクラスを作成したら、読み込んだ設定からクラスにマッピングするためのライブラリ Microsoft.Extensions.Options.ConfigurationExtensions を追加します。コマンドプロンプトから追加するには次のコマンドを実行します。

dotnet add src\BatchApp\BatchApp.csproj package Microsoft.Extensions.Options.ConfigurationExtensions -v 2.2.0

次にこの SampleConfig を設定ファイルにマッピングされるように、 ConfigureServices に追加します。

src\BatchApp\Program.cs

using System;
using System.Threading.Tasks;
using MicroBatchFramework;
using Microsoft.Extensions.DependencyInjection;

namespace BatchApp
{
    class Program
    {
        static async Task Main(string[] args)
        {
            await BatchHost.CreateDefaultBuilder()
                .ConfigureServices((hostContext, services) =>
                {
                    services.Configure<SampleConfig>(hostContext.Configuration);
                })
                .RunBatchEngineAsync<HelloWorldBatch>(args);
        }
    }

    ...
}

読み込んだ設定を使用する

設定ファイルに対してマッピングした SampleConfig をバッチのコードから使用するには IOptions<SampleConfig> をコンストラクタの引数で取得します。設定からマッピングされた SampleConfigインスタンスIOptions.Value プロパティから取得します。

src\BatchApp\Program.cs

using System;
using System.Threading.Tasks;
using MicroBatchFramework;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;

namespace BatchApp
{
    ...

    class HelloWorldBatch : BatchBase
    {
        private readonly IOptions<SampleConfig> _sampleConfig;

        public HelloWorldBatch(IOptions<SampleConfig> sampleConfig)
        {
            this._sampleConfig = sampleConfig;
        }

        public Task RunAsync(
            [Option(shortName: "m", description: "表示する文言")] string message)
        {
            var configValue = this._sampleConfig.Value;
            Console.WriteLine("アプリ名:{0}、アプリバージョン:{1}",
                configValue.AppName, configValue.AppVersion);

            Console.WriteLine(message);
            return Task.CompletedTask;
        }
    }
}

これを実行すると appsettings.json に設定した値が表示されます。

dotnet run -p src\BatchApp\BatchApp.csproj -c release -f netcoreapp2.2 -m hoge
アプリ名:BatchApp、アプリバージョン:5
hoge

環境別で異なる設定ファイルを使用する

バッチアプリと言えど、開発環境や検証環境など、アプリを動かす環境は複数箇所が想定されます。 .NET Core ではこれらの実行環境毎に上書き用の設定ファイルを作成し、実行時の設定を切り替えることができます。

環境別の設定ファイルを作成する

まずは環境別の設定ファイル( appsettings.*.json )を作成します。 .NET Core 標準の実行環境名は Development Staging Production の3つですが、この名前以外でも問題はありません。今回は appsettings.Development.jsonappsettings.Production.json を作成します。

src\BatchApp\appsettings.Development.json

{
  "AppName": "BatchApp (Development)"
}

----------
src\BatchApp\appsettings.Production.json

{
  "AppName": "BatchApp (Production)"
}

バッチの実行環境を変更する

BatchHost で生成される HostBuilder は実行環境が Production に設定されています。環境別の設定ファイルを作成した状態でバッチアプリを実行すると次の様に表示されます。

dotnet run -p src\BatchApp\BatchApp.csproj -c release -f netcoreapp2.2 -m hoge
アプリ名:BatchApp (Production)、アプリバージョン:5
hoge

実行環境が Production に設定されているため、 appsettings.jsonappsettings.Production.json がマージされた状態で設定が取得されていることが分かります。

常に Production 向けで動作されても困るので、実行環境を Development に変更します。実行環境を変更するには環境変数NETCORE_ENVIRONMENT を設定します。

set NETCORE_ENVIRONMENT=Development

dotnet run -p src\BatchApp\BatchApp.csproj -c release -f netcoreapp2.2 -m hoge
アプリ名:BatchApp (Development)、アプリバージョン:5
hoge

Visual Studioデバッグ実行する時はあらかじめプロジェクト設定のデバッグタブで環境変数の設定を行います。

f:id:noxi515:20190408025938p:plain

おわりに

この記事では MicroBatchFramework を使用する際のアプリケーション設定と実行環境の設定について書いてみました。 MicroBatchFramework というより Microsoft Extensions の使い方みたいな記事になっているのは気のせいです。次は MicroBatchFramework のバッチアプリ終了をハンドルする方法についてです。