这是DIP(SOLID)的有效使用吗?

时间:2016-04-29 10:06:40

标签: c# interface abstraction solid-principles dependency-inversion

我想问一下,GenotypesIndividual类的实现是否违反了依赖性倒置原则?如果是这样,如何解决?

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 个答案:

答案 0 :(得分:3)

依赖性倒置原则处理的软件模块不一定是类。我们的想法是,取决于更高级别的层,取决于低级层的编码方式,更高层通过提供抽象类(C#interface很好地服务于此)来定义层接口更好。较低层实现并提供高层需要的服务。一个常见的错误是将此原则与dependency injection混淆,其中依赖关系通过更高级别提供给依赖类,而不是依赖类需要找到它们并创建它们。

好像你在询问依赖注入,这是"我的依赖类如何得到我的依赖实例?"此示例看起来像属于同一域模型的这两个类,这意味着它们很可能位于同一模块中。让一个类依赖于另一个类并在同一模块中直接创建它是一种合理的方法,但随着类的发展,Factory pattern更加健壮。

答案 1 :(得分: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);

您不需要抽象类来DIP