2016-04-29 7 views
4

クラスGenotypesIndividualの実装が依存関係の反転原理に違反しているかどうか質問したいと思いますか?もしそうなら、それを修正する方法は?ここでこれはDIP(SOLID)の有効な使用ですか?

classes-abstraction hierarchy

コードです:

public interface IGenotype 
{ 
    //some code... 
} 

public abstract class AIndividual 
{ 
    // ... some code 
    public IGenotype Genotype { get; set;} // DIP likes that ! 
} 

public class Individual : AIndividual 
{ 
    public Individual() 
    { 
     // some code ... 
     this.Genotype = new Genotype(); // Is this ok in case of DIP? 
    } 
} 

public class Genotype : IGenotype 
{ 
    // ... some code 
} 

答えて

2

私は、これは(コメントをお読みください)に役立つかもしれない願ってい

public interface IGenotype 
{ 
    //some code... 
} 

public class Genotype : IGenotype 
{ 
    // ... some code 
} 

public class Individual 
{ 
    // Here, instead of depending on a implementation you can inject the one you want 
    private readonly IGenotype genotype; 

    // In your constructor you pass the implementation 
    public Individual(IGenotype genotype) 
    { 
     this.genotype = genotype; 
    } 
} 

// Genotype implements IGenotype interface 
var genotype = Genotype(); 

// So here, when creating a new instance you're injecting the dependecy. 
var person = Individual(genotype); 

あなたは

を浸漬する抽象クラスを必要としません
2

ソフトウェアとの依存性反転原理モジュールは必ずしもクラスである必要はありません。考えられるのは、下位レベルのレイヤーがどのようにコード化されているかによって、上位レイヤーの代わりに、上位レイヤーがレイヤーインターフェイスを定義する方が、下位レイヤーに対して抽象クラス(C#interfaceがうまく機能します)上位層が必要とするサービスを実装し提供する。よくある間違いは、この原則をdependency injectionと混同することです。従属クラスは、それを見つけて作成する必要のある従属クラスではなく、上位クラスによって従属クラスに提供されます。

あなたは依存性注入について質問しているようです。「依存するクラスがどうやって依存関係のインスタンスを取得するのですか?この例は、同じドメインモデルに属する2つのクラスのように見えます。つまり、同じモジュール内にある可能性が非常に高いクラスです。クラスを別のクラスに依存させ、同じモジュール内で直接作成することは合理的なアプローチですが、Factory patternはクラスが進化するにつれてより堅牢です。

関連する問題