C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でインターフェースベースのインジェクションを使って依存性注入(DI)を実装する方法


結合された(依存関係のある)オブジェクトを、疎結合な(独立した)オブジェクトへと注入(変換)する仕組みを「依存性注入(Dependency Injection:DI)」と呼びます。

依存性注入の種類

DIには主に以下の4つの種類があります。

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

  • セッターインジェクション

  • インターフェースベースのインジェクション

  • サービスロケータインジェクション

インターフェースインジェクションとは

インターフェースインジェクションは、ゲッター・セッターを使うDIと考え方が似ています。ただし、通常のゲッター・セッターDIが既定のアクセサを利用するのに対し、インターフェースインジェクションでは「サポート用インターフェース」と呼ばれる、明示的なゲッター・セッターのような役割を持つインターフェースを定義し、そのメソッドを通じて依存オブジェクト(サービス)を設定します。

この方式では、依存性を注入するための専用インターフェースを実装クラスに持たせるため、注入の契約が明確になり、テスト時のモック差し替えや実装の入れ替えが容易になるというメリットがあります。

実装例

public interface IService{
   string ServiceMethod();
}
public class ClaimService : IService{
   public string ServiceMethod(){
      return "ClaimService is running";
   }
}
public class AdjudicationService : IService{
   public string ServiceMethod(){
      return "AdjudicationService is running";
   }
}
interface ISetService{
   void setServiceRunService(IService client);
}
public class BusinessLogicImplementationInterfaceDI : ISetService{
   IService _client1;
   public void setServiceRunService(IService client){
      _client1 = client;
      Console.WriteLine("Interface Injection ==>
      Current Service : {0}", _client1.ServiceMethod());
   }
}

利用方法

まず、注入したいサービスのインスタンスを作成します。次に、ISetServiceインターフェースを実装したクラスのインスタンスを生成し、そのメソッド経由でサービスを渡します。

// 注入するサービスの生成
IService serviceObj = new ClaimService();

// インターフェースインジェクションを受け入れるクラスの生成
BusinessLogicImplementationInterfaceDI objInterfaceDI =
new BusinessLogicImplementationInterfaceDI();

// インターフェースのメソッドを通じてサービスを注入
objInterfaceDI.setServiceRunService(serviceObj);

このように、具象クラス(ClaimServiceやAdjudicationService)を直接参照せず、IServiceインターフェースを介してやり取りすることで、ビジネスロジック側は具体的な実装に依存しない疎結合な設計になります。サービスを差し替えたい場合も、AdjudicationServiceなど別の実装クラスのインスタンスを渡すだけで対応できます。


  1. Java 9でJavaFXを使ってJShellをプログラムから実装する方法

    JShellは、サンプル式を対話的に実行できるツールです。通常はコマンドラインから利用しますが、JavaFXアプリケーションの中でプログラム的にJShellを実装することも可能です。その場合、Javaプログラムに以下のパッケージをインポートする必要があります。import jdk.jshell.JShell; import jdk.jshell.SnippetEvent; import jdk.jshell.VarSnippet;これらのクラスの役割は次のとおりです。JShell:評価エンジンの本体。式や文を評価(eval)するためのAPIを提供します。SnippetEvent:評価結果として

  2. Dagger 2 を使用してアプリに依存性注入を実装する方法

    Kriptofolio アプリ シリーズ - パート 4 依存性注入により、コードが大幅に改善されます。これにより、コードがよりモジュール化され、柔軟になり、テストしやすくなります。実際、その名前は背後にある考え方よりも複雑に聞こえます。 シリーズのこのパートでは、依存性注入について学びます。その後、「Kriptofolio」(以前の「My Crypto Coins」)アプリに実装します。 Dagger 2 を使用します。Dagger 2 は、Android 向けの最も人気のあるオープンソースの依存性注入フレームワークです。これは、学習曲線が十分に難しいとはいえ、最新のアプリを作成するため