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

C#でプロパティを使った依存性注入(DI)の実装方法を解説

密結合(依存関係のある)オブジェクトを、疎結合(独立した)オブジェクトへと変換しながら外部から注入する仕組みは、「依存性注入(Dependency Injection:DI)」と呼ばれます。DIを活用することで、クラス間の依存関係が弱まり、保守性やテスト容易性が大きく向上します。

依存性注入の主な4つの手法

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

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

  • インターフェースベースの注入

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

セッター・インジェクションとは

セッター・インジェクション(ゲッター/セッター・インジェクション)は、C#の標準的なパブリックプロパティ構文である get { }set { } を利用して依存オブジェクトを注入する手法です。コンストラクタ経由ではなくプロパティ経由で依存関係を渡すため、オブジェクト生成後に依存オブジェクトを差し替えられる点が特徴です。

実装例

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";
    }
}
public class BusinessLogicImplementation{
    private IService _client;
    public IService Client{
        get { return _client; }
        set { _client = value; }
    }
    public void SetterInj(){
        Console.WriteLine("Getter and Setter Injection ==>
        Current Service : {0}", Client.ServiceMethod());
    }
}

この例では、ビジネスロジッククラス BusinessLogicImplementation が具象クラスではなくインターフェース IService に依存しています。Client プロパティのセッターを通じて、任意の実装クラスを外部から注入できる構造になっています。

利用方法(呼び出し側のコード)

BusinessLogicImplementation ConInjBusinessLogic = new BusinessLogicImplementation();
ConInjBusinessLogic.Client = new ClaimService();
ConInjBusinessLogic.SetterInj();

呼び出し側では、Client プロパティに具体的なサービス実装(ここでは ClaimService)を代入するだけで依存関係が完成します。実装を AdjudicationService に変更したい場合も、代入するオブジェクトを変えるだけで済みます。

セッター・インジェクションのメリット

  • 必須の依存関係をコンストラクタに集中させず、任意の依存関係を柔軟に設定できる

  • 実行時に依存オブジェクトを差し替えやすく、単体テストではモックの注入が簡単

  • 循環参照が発生しやすい設計でも、コンストラクタ・インジェクションより扱いやすい場合がある

一方で、依存関係の設定忘れによって null 参照例外が発生する可能性があるため、必要に応じてnullチェックやデフォルト実装の用意を検討すると安全です。

  1. JavaFXでQuadCurve(2次ベジェ曲線)を作成・描画する方法

    2次曲線(クアドラティックカーブ)とは、XY平面上に描かれる次数2のベジェパラメトリック曲線のことです。 JavaFXでは、2次曲線はjavafx.scene.shape.QuadCurveクラスによって表現されます。CubicCurve(3次曲線)とよく似ていますが、制御点が2つではなく1つだけ使用される点が大きな違いです。 QuadCurveクラスの6つのプロパティ QuadCurveクラスには、曲線の形状を決定するために以下の6つのプロパティが用意されています。 startX ― 曲線の始点のX座標を表します。setStartX()メソッドで値を設定できます。 startY ― 曲線の

  2. JavaFXでCubicCurve(3次曲線)を作成・描画する方法を解説

    3次曲線(Cubic Curve)とは3次曲線とは、2つの変数を含む3次多項式関数によって表される曲線のことです。滑らかなS字カーブなどを描く際に利用され、グラフィック描画の分野で広く使われています。JavaFXでは、この3次曲線をjavafx.scene.shape.CubicCurveクラスで表現します。このクラスには以下の8つのプロパティが用意されています。startX:曲線の始点のX座標。setStartX()メソッドで値を設定します。startY:曲線の始点のY座標。setStartY()メソッドで値を設定します。controlX1:第1制御点のX座標。setControlX1()メ