コンソールアプリケーションって超基本だし、.netの超初期から出てくるので検索してもなかなか最新環境の情報にたどり着かなかったので備忘録も含めまとめます。
やりたいゴールとして
・コンソールアプリ
・コマンドでオプションを指定してファイル名などの引数を与えられる
・設定ファイルを.net core最新環境に合わせる
・テストが出来るように
まずは、DI。ここの記事がシンプルで使いやすそう。
英語なので日本語化は後で。
分量も少ないのでコピペで動作を確認するにはよさそう!
こちらはjson設定を読み込む。
古い環境だとapp.settingとかapp.configファイルを読みますが、VisualStudio2022だと画面構成からして設定画面が出てきません。
node環境でもなじみのjsonで設定します。
そんな中で、.netcore5ですがコンパクトな良い記事
ただ、CreateDefaultBuilderを使うのか、ConfigurationBuilderを使うのか、両方を使わないといけないのかと迷いますが、CreateDefaultBuilderだけでOKです。
その辺はここに書いてあります。
あとはコンソールアプリで設定を読むのを確認しておきます。
そして、DIを活用するために
を参考に設定をサービスクラスに渡してみます。
合体させるとこんな感じに
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.DependencyInjection;
class Program
{
// 引数で/sourcefilepathを与えている
static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
IConfiguration config = host.Services.GetRequiredService<IConfiguration>();
host.Services.GetService<IHelloService>()
.WriteMessage();
Console.Read();
}
private static IHostBuilder CreateHostBuilder(string[] args)
{
var hostBuilder = Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder) =>
{
builder.SetBasePath(Directory.GetCurrentDirectory());
builder.AddJsonFile("appsetting.json");
})
.ConfigureServices((context, services) =>
{
//add your service registrations
services.AddSingleton<IHelloService, HelloService>();
});
return hostBuilder;
}
}
public interface IHelloService
{
void WriteMessage();
}
public class HelloService : IHelloService
{
private readonly IConfigration _config;
puclib HelloService(IConfigurration config)
{
this._config = config;
}
public void WriteMessage()
{
Console.WriteLine("Hello World! " this._config.GetSection("TestValues").GetValue<string>("Key1"));
}
}
{
"TestValues": {
"Key1": "Value-100",
"Key2": "Value-200",
"Key3": "Value-300"
}
}
サービスを何個どのように使うかによると思いますが、AddSingletonを使ってもよいし、IHelloServiceをIHostedServiceの継承としてStartAsync等を実装。AddHostedServiceから.Run()で標準実行させるのもありですね。
テストは、IHelloServiceをテストしたりモック化するなりして実行。
設定ファイルは、HelloServiceのコンストラクタで、IConfigrationを読んでおけば自動でDIされます。
この中には、jsonファイルの設定も、コマンドラインのargsも入ります。
コマンドラインはconsoleapp.exe /source C:\souce\file.jpgとした場合は
this._config["source"]
でとれます。
json設定ファイルの方は、this._config.GetSection("TestValues").GetValue("Key1")ですね。