依存関係のライフサイクル管理とは、アプリケーションのコンポーネントを相互に独立させて簡単にテストできるように作成、初期化、更新、破棄する方法です。これには通常、IoCコンテナ(制御の反転)と依存性注入(DI)パターンが使われます。
IoCコンテナは次のことを可能にします:
Microsoft.Extensions.DependencyInjectionを使用したC#の例:
public interface IMessageSender { void Send(string msg); } public class EmailSender : IMessageSender { public void Send(string msg) { /* emailを送信 */ } } // 依存関係の登録 var services = new ServiceCollection(); services.AddScoped<IMessageSender, EmailSender>(); // インスタンスの取得 var provider = services.BuildServiceProvider(); var sender = provider.GetService<IMessageSender>(); sender.Send("こんにちは!");
主な特徴:
依存性注入(DI)とサービスロケーターパターンの違いは何ですか?なぜサービスロケーターはアンチパターンと見なされるのですか?
サービスロケーターは明示的な依存関係の受け渡しを破り、コードを不透明にします。コンストラクタやメソッドを介してDIを使用する方が望ましく、コンパイラが依存関係の正確性を制御します。
// 悪い: サービスロケーター var sender = ServiceLocator.Get<IMessageSender>(); // 良い: DIを介して public class MyService { public MyService(IMessageSender sender) { ... } }
シングルトンパターンとDIコンテナにおけるシングルインスタンスのライフタイムの違いは何ですか?
シングルトンパターンは手動で実装され、コンテナに依存しません。一方、シングルインスタンスはコンテナからインスタンスを提供し、ユニットテストや拡張において安全です。
すべてのクラス、特に単純なユーティリティでも依存関係を注入する必要がありますか?
いいえ。依存関係がないユーティリティや弱く結合されたヘルパークラス(たとえば、数学定数クラス)にはDIを注入する意味はなく、コードが複雑になり利点をもたらしません。