5

私が更新しようとしているこの古いコードでは、次のような依存性注入を実装しました。

public class Program
{
    private IProgramRepository programRepository;

     public Program(IProgramRepository repository)
        {
             this.programRepository = repository;
        }

     public Program() : this(new EN_Program()) { }

現在、このプログラムクラスではすべてのメソッドが静的であるため、すべての静的メソッドには実際には次のような 2 つのメソッドがあります。

    public static List<Program> GetProgramsByUser(int userId)
    {
        return GetProgramsByUser(userId, GetDefaultRepository());
    }
    private static List<Program> GetProgramsByUser(int userId, IProgramRepository repo)
    {
        return repo.GetProgramsByUser(userId);
    }

今、私はDIの実装についてとりわけこれを読みました:

これは依存性注入ではありません。これは実際には依存関係の逆転の原則に明らかに違反しています。原則は、「高レベルのモジュールは低レベルのモジュールに依存するべきではなく、両方とも抽象化に依存する必要があります。詳細は抽象化に依存する必要があります」と述べています。上記のコードでは、Product.cs 自体が EN_Program オブジェクトを作成します。したがって、IProgramRepository の実装 (EN_Program) に直接依存します。将来、IProgramRepository インターフェイスの別の実装が行われる場合、Product.cs コード自体を変更する必要があります。そのため、適切な方法ではないことが調査されています。

古い開発者は、コントローラーに何も注入せずに、ヘルパー クラス (Program.cs) から始めて DI を実装したかったようです。

この古いコードが正しく書かれていないと仮定するのは正しいですか? DI を実装する場合、コントローラーからバックエンドまですべてにインジェクションが必要ですか?

元。コントローラーには、ヘルパー クラスが使用するインターフェイス (Program.cs) を挿入する必要があります。次に、リポジトリが使用するインターフェイスを Program.cs に挿入します。

4

2 に答える 2

7

コメントが正しくありません。Dependency Injection パターンについて述べていますが、Dependency Inversion Principleを引用しています。オーバーロードされたコンストラクターは Dependency Injectionパターンの実装であり、既定のコンストラクターはPoor Man's Dependency Injection アンチパターンの実装です。

オーバーロードされたコンストラクターは Dependency Injection パターンを実践しますが、既定のコンストラクターは依存関係の逆転の原則に違反しておらず、実際に違反しています。引用された理由のため。

つまり、あなたは依存性注入を絶対に実践していますが、多くの理由で悪い貧乏人の依存性注入も実践しています。例えば:

  • コードが低レベル コンポーネントに直接依存しているため、個別に出荷することができません。
  • 直接的な依存関係により、実装を交換することが難しくなります。これは、(デコレーターまたはインターセプターを使用して) 分野横断的な懸念事項を追加するときに非常に一般的に行われることです。EN_Programデコレーターまたはインターセプターでインスタンスをラップするためだけにすべてのコンストラクターを変更するために、アプリケーション全体を調べたくはありません。
于 2013-04-29T15:43:56.180 に答える
1

最初の方法は、ファクトリ メソッドに依存しています (希望します)。このファクトリ メソッド内でIProgramRepositoryが作成されます。この関数は、ファクトリ メソッド自体以外には依存していません。

public static List<Program> GetProgramsByUser(int userId)
{
    return GetProgramsByUser(userId, GetDefaultRepository());
}

2 番目の方法も、他のクラスに依存しません。依存関係はパラメーターで「指定」されます。

private static List<Program> GetProgramsByUser(int userId, IProgramRepository repo)
{
    return repo.GetProgramsByUser(userId);
}

編集

正式には依存性注入 (DI) は制御の反転 (IoC) のサブセットであり、これらの用語は時々混同されます。おそらくあなたのコードは正式には DI のルールに従っていないかもしれませんが、それは確かに IoC です!

于 2013-04-29T15:23:09.553 に答える