ひでぼ~blog

C#ときどきゲーム

ConsoleAppFrameworkを試した

仕事でちょっとしたコンソールアプリを作るときに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できるようになっていてとても使いやすかったです。 使い勝手が良すぎてこれから作るコンソールアプリは全部これでいいじゃん…という気持ちになりました。