Skip to main content

DependencyInjection

Microsoft.Extensions.DependencyInjection は、.NET における 公式の依存性注入(DI)コンテナの基盤ライブラリです。ASP.NET Core をはじめ、.NET の多くのアプリケーションで使われており、サービスの登録・解決・ライフサイクル管理を行うための仕組みを提供します。


✅ 目的と役割

機能説明
依存性の注入クラスが必要とする依存(サービス、リポジトリなど)を外部から提供する
ライフサイクル管理Singleton / Scoped / Transient のスコープを制御できる
疎結合化実装と使用側を分離し、テストや保守性を向上させる
構成の一元化Program.csStartup.cs でサービス構成を集中管理できる

🧪 基本的な使い方

1. サービスの登録

services.AddTransient<IUserService, UserService>();     // 毎回新しいインスタンス
services.AddScoped<IOrderService, OrderService>(); // リクエストごとに1インスタンス
services.AddSingleton<ILogger, ConsoleLogger>(); // アプリケーション全体で1インスタンス

2. コンストラクタインジェクション

public class HomeController
{
private readonly IUserService _userService;

public HomeController(IUserService userService)
{
_userService = userService;
}
}

3. サービスの解決(手動)

var serviceProvider = services.BuildServiceProvider();
var userService = serviceProvider.GetRequiredService<IUserService>();

✅ よく使われる拡張ライブラリ

ライブラリ用途
Microsoft.Extensions.Loggingログ機能のDI統合
Microsoft.Extensions.Configuration設定ファイルの読み込みと注入
Microsoft.Extensions.Optionsオプションパターンによる設定の型安全な注入
Microsoft.Extensions.HttpHttpClientFactory のDI統合と回復性(Pollyとの連携)

✅ 有効な使用箇所(代表例)

1. アプリケーション層のサービス

  • ビジネスロジックを担う IUserService, IOrderService など
  • UIやAPI層から注入されることで、責務の分離とテスト容易性が向上

2. リポジトリ層(データアクセス)

  • IUserRepository, IProductRepository など
  • 実装を切り替えやすく、モック化も容易

3. ロギング・監査・認可などの横断的関心事

  • ILogger, IAuditLogger, IAuthorizationService など
  • SerilogやPollyなどと連携し、制度的責任を注入可能

4. 設定情報(Optionsパターン)

  • IOptions<AppSettings> などで、構成ファイルの値を型安全に注入
  • 環境ごとの切り替えが容易

5. MediatRのハンドラー

  • IRequestHandler<TRequest, TResponse> をDIで注入
  • CQRS構成で、処理のルーティングと責務分離を実現

6. HttpClientFactoryによる外部通信

  • IHttpClientFactory を使って、再試行やタイムアウトを構成可能
  • Pollyとの統合で、回復性のある設計が可能

7. ViewModel(MVVM構成)

  • WPFやBlazorなどで、MainViewModelIService を注入
  • Viewとの分離が促進され、テスト可能なUI設計が実現

✅ DIの設計で意識すべきこと

  • インターフェースと実装の分離
  • ライフサイクルの適切な選択
  • サービスの粒度と責務の明快さ
  • テスト可能性(モック化しやすい構造)

✅ 実例と参考資料


Microsoft.Extensions.DependencyInjection は、単なる技術ではなく、制度設計の基盤としての構造的役割を持つライブラリです。
次は、DIコンテナの拡張(条件付き登録、タグ付き解決)、または MediatR や Serilog との統合設計に進めても面白いですよ。どうしましょう。