本文へスキップ
BecomeCoder

C#実践コース · 第11章 モダンC#実務 · レッスン64

DI・Configuration・Options(Microsoft.Extensions)

ローカル実施

導入

デザインパターンコースで学んだ依存性注入(DI)は、実務ではDIコンテナが自動でやってくれます。Microsoft.Extensions.DependencyInjection を核に、設定ファイルを読む Configuration、設定を型で受け取る Options が、ASP.NET Coreアプリの背骨になっています。ホストが必要なため、ここではコード例で読みます。

説明

flowchart LR
    F["appsettings.json"] --> CFG["Configuration"]
    CFG --> OPT["IOptions&lt;T&gt;<br/>設定を型で受け取る"]
    SVC["サービス登録<br/>AddSingleton / AddScoped"] --> DI["DIコンテナ"]
    DI -->|コンストラクタで注入| USE["各クラス"]
    style DI fill:#e1f5fe

サンプル

// DIコンテナにサービスを登録し、必要な場所へ自動注入する
var services = new ServiceCollection();
services.AddSingleton<IClock, SystemClock>();   // 1つを共有
services.AddScoped<OrderService>();             // リクエストごと
var provider = services.BuildServiceProvider();

var order = provider.GetRequiredService<OrderService>();  // 依存は自動で解決される
// appsettings.json の値を型で受け取る(Options パターン)
public class SmtpOptions { public string Host { get; set; } = ""; public int Port { get; set; } }

builder.Services.Configure<SmtpOptions>(builder.Configuration.GetSection("Smtp"));

public class Mailer
{
    private readonly SmtpOptions _opt;
    public Mailer(IOptions<SmtpOptions> opt) => _opt = opt.Value;   // 設定が注入される
}
  • AddSingleton(アプリで1つ)/ AddScoped(リクエスト単位)/ AddTransient(都度生成)で寿命を選ぶ
  • コンストラクタに書いた依存は、コンテナが自動で解決して渡す
  • Configurationappsettings.json環境変数を読み、IOptions<T> で型安全に受け取る
  • 秘密情報(接続文字列・APIキー)はコードに直書きせず、設定・環境変数・シークレット管理から読む

演習

手元の ASP.NET Core / コンソール(Generic Host)プロジェクトで、自作サービスを AddSingleton で登録し、別のクラスのコンストラクタで受け取ってみましょう。new を書かずに依存がつながる感覚を掴めます。

まとめ

  • DIコンテナが依存を自動解決する(寿命は Singleton/Scoped/Transient)
  • Configuration が設定を読み、IOptions<T> で型安全に受け取る
  • 秘密情報は直書きせず設定・環境変数から読む

次回: 数行でWeb APIを公開する Minimal API です(読み物)。