仕事でちょっとしたコンソールアプリを作るときにDIやConfigurationの仕組みが欲しかったので試しに使ってみました。 github.com
まずコンソールアプリケーションのプロジェクトを作成して、nugetパッケージの管理からConsoleAppFrameworkをインストールします。 公式ドキュメントにあるConfigurationのソースコードを参考に、appsettings.jsonからデータを読み込んでコンソールに表示してみます。
class Program { static async Task Main(string[] args) { await Host.CreateDefaultBuilder() // appsetting.jsonからSampleSettingsプロパティを取得 .ConfigureServices((hostContext, services) => { services.Configure<SampleSettings>(hostContext.Configuration.GetSection(nameof(SampleSettings))); }) .RunConsoleAppFrameworkAsync(args); } } public class ConfigurationProvider : ConsoleAppBase { SampleSettings sampleSettings; public ConfigurationProvider(IOptions<SampleSettings> options) { sampleSettings = options.Value; } public void ShowMessage() { Console.WriteLine(sampleSettings.Message); } public void ShowName() { Console.WriteLine(sampleSettings.Name); } }
ConsoleAppBaseを継承したクラスConfigurationProviderを作成し、appsettings.jsonの中身を表示するメソッドを作成しました。ConfigureServicesで登録したSampleSettingsはコンストラクタに注入されてIOptions<SampleSettings>として受け取れます。 appsettings.jsonの中身はこんな感じ。
{ "SampleSettings": { "Message": "Hello ConsoleAppFramework!", "Name": "Endo" } }
とりあえず引数に何も指定せず実行すると、
$ dotnet run Usage: ConsoleAppFrameworkSamlple <Command> Commands: ConfigurationProvider.ShowMessage ConfigurationProvider.ShowName
Commandsという引数を指定して実行してくださいよというUsageが表示されます。丁寧にCommandsの書き方も表示されています。 今度は実行時の引数にConfigurationProvider.ShowMessageを指定して実行します。
$ dotnet run ConfigurationProvider.ShowMessage Hello ConsoleAppFramework!
ちゃんとappsettings.jsonのMessageが表示されました。 引数の名前はデフォルトでクラス名.メソッド名になるみたいですが、任意の名前に変えられるようにメソッドに属性が付けられるみたいです。 感想としてはASP.NET Coreと同じような感覚でDIできるようになっていてとても使いやすかったです。 使い勝手が良すぎてこれから作るコンソールアプリは全部これでいいじゃん…という気持ちになりました。