MicroBatchFrameworkを試す 2 - アプリケーション設定
前回の記事では MicroBatchFramework を使用したバッチアプリの作成と実行、発行を試してみました。この記事は MicroBatchFramework を使用するバッチアプリで設定ファイルを読み込んでみます。
試用環境
- Windows 10 x64 (1809)
- Visual Studio 2019
- .NET Core SDK 2.2.202
設定ファイルの作成と読み込み
MicroBatchFrameworkを使用すると HostBuilder
を拡張してバッチアプリを作ることができます。この HostBuilder
は ASP.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.json
と appsettings.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.json
と appsettings.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 でデバッグ実行する時はあらかじめプロジェクト設定のデバッグタブで環境変数の設定を行います。
おわりに
この記事では MicroBatchFramework を使用する際のアプリケーション設定と実行環境の設定について書いてみました。 MicroBatchFramework というより Microsoft Extensions の使い方みたいな記事になっているのは気のせいです。次は MicroBatchFramework のバッチアプリ終了をハンドルする方法についてです。