1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

.net core 6.0の最新環境で、コンソールアプリケーションをDIする(紹介)

Last updated at Posted at 2022-05-01

コンソールアプリケーションって超基本だし、.netの超初期から出てくるので検索してもなかなか最新環境の情報にたどり着かなかったので備忘録も含めまとめます。

やりたいゴールとして
・コンソールアプリ
・コマンドでオプションを指定してファイル名などの引数を与えられる
・設定ファイルを.net core最新環境に合わせる
・テストが出来るように

まずは、DI。ここの記事がシンプルで使いやすそう。
英語なので日本語化は後で。

分量も少ないのでコピペで動作を確認するにはよさそう!

こちらはjson設定を読み込む。
古い環境だとapp.settingとかapp.configファイルを読みますが、VisualStudio2022だと画面構成からして設定画面が出てきません。
node環境でもなじみのjsonで設定します。
そんな中で、.netcore5ですがコンパクトな良い記事

ただ、CreateDefaultBuilderを使うのか、ConfigurationBuilderを使うのか、両方を使わないといけないのかと迷いますが、CreateDefaultBuilderだけでOKです。
その辺はここに書いてあります。

あとはコンソールアプリで設定を読むのを確認しておきます。

そして、DIを活用するために

を参考に設定をサービスクラスに渡してみます。

合体させるとこんな感じに

C# Program.cs
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"));
    }
}
appsetting.json
{
  "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")ですね。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?