ConsoleAppFramework v5がめちゃくちゃ良いらしいという噂を聞いたので試してみました。
実行環境
- .NET 8
- Visual Studio 2022 17.10.3
- ConsoleAppFramework 5.2.1
シンプル構成で実行してみる
一番シンプルな構成で実行してみます。
using ConsoleAppFramework; ConsoleApp.Run(args, (string name) => Console.WriteLine($"Hello {name}"));
PS C:\Projects\ConsoleAppFrameworkV5Sample\ConsoleAppFrameworkV5Sample> dotnet run --name Sum Hello Sum
コマンドを複数登録して実行してみる
コマンドを複数登録してみました。
using ConsoleAppFramework; var app = ConsoleApp.Create(); // コマンド名無し app.Add("", (string msg) => Console.WriteLine(msg)); // コマンド名有り app.Add("sum", (int[] numbers) => Console.WriteLine(numbers.Sum())); app.Add("avg", (int[] numbers) => Console.WriteLine(numbers.Average())); app.Run(args);
コレクションをカンマ区切りで渡せるのが地味に良いですね。
PS C:\Projects\ConsoleAppFrameworkV5Sample\ConsoleAppFrameworkV5Sample> dotnet run --msg hello hello PS C:\Projects\ConsoleAppFrameworkV5Sample\ConsoleAppFrameworkV5Sample> dotnet run sum --numbers 1,2,3,4,5 15 PS C:\Projects\ConsoleAppFrameworkV5Sample\ConsoleAppFrameworkV5Sample> dotnet run avg --numbers 1,2,3,4,5 3
DI, appsettings.jsonを使ってみる
appsettings.jsonから設定を取得してDIしてみます。
using ConsoleAppFramework; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; var configuration =new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var services =new ServiceCollection(); services.Configure<SampleSettings>(configuration.GetSection(nameof(SampleSettings))); usingvar serviceProvider = services.BuildServiceProvider(); ConsoleApp.ServiceProvider = serviceProvider; var app = ConsoleApp.Create(); // SampleSettingsを表示するコマンド app.Add("settings", ([FromServices] IOptions<SampleSettings> options) => Console.WriteLine(options.Value)); app.Run(args); public record SampleSettings { publicstring Message { get; init; } =""; public DateOnly Date { get; init; } }
PS C:\Projects\ConsoleAppFrameworkV5Sample\ConsoleAppFrameworkV5Sample> dotnet run settings SampleSettings { Message = Hello ConsoleAppFramework!, Date = 2024/06/30 }
いろいろ試してみましたが全体的にASP.NET CoreのMinimalAPIみたいな書き心地でシンプルにも書けるし従来のクラスベースの書き方もできるという感じで良いなと思いました。