文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

什么是依赖注入?

为了回答这个问题,我们必须理解什么是依赖。

那么什么是依赖呢?

假设我们有一个命名为Computer的类,它使用一个命名为IDisplay的接口 (或类),用于显示内容。这个时候我们可以说类Computer类依赖于接口IDisplay。在这里理解使用的含义很重要,它与依赖是同义词.

如果以下条件有一个成立,我们可以说Computer类使用或依赖于IDisplay接口(或类)

  • Computer类至少有一个函数的参数类型是IDisplay。
  • Computer类至少有一个函数的返回值类型是IDisplay。
  • Computer有一个IDispaly类型的局部变量或者成员属性。
  • Computer类至少有一个参数类型为IDisplay的委托或者事件。
第 1 段(可获 2 积分)

让我们换种方式来解释它

如果我们删除了接口(或类)IDisplay,然后编译Computer,我们将得到一个异常如"未找到类型或空间为'IDisplay'(你是否缺少对指令或程序集的引用?)",这里我们就可以说Computer依赖IDisplay. 

让我们假设这里有 LcdDisplay 和 CrtDisplay两个类,都实现(继承)了IDisplay.现在我们描述的类之间的关系,可以用下面的图总结一下.

在这个模式下,我们的设计Computer并不依赖于 CrtDisplay 或 LcdDisplay.Computer只依赖于IDisplay . 换句话说,删除CrtDisplay 和 LcdDisplay,在编译Computer时并不会抛出异常,所以Computer并不依赖于CrtDisplay 和 LcdDisplay. 但正如前面看到的,IDisplay依赖它们.

第 2 段(可获 2 积分)

什么是依赖注入

很多时候,一个类的对象不可能独立完成其工作.对象完成任务时需要依赖于其它对象.在依赖对象内部可以调用被依赖对象的构造方法,或者被依赖对象可以在外部被推入(注入).在外部将被依赖对象推入到依赖对象的过程叫做依赖注入.

让我们来看一个例子.电脑工作时需要一个显示器.如果有其它类将一个类型为IDisplay的对象(或是它的派生类)注入到Computer类中,这时我们叫做依赖注入.

第 3 段(可获 2 积分)

如果计算机类调用IDisplay构造函数(或其派生类型)并创建依赖对象,不是依赖注入。也许我们可以称之为依赖创造。

根据注入不同的依赖对象,我们有三个类型的依赖注入。即…

1·构造函数(依赖)注入——依赖注入作为一个构造函数的参数

2·方法(依赖)注入——依赖是通过setter方法注入

3·属性(依赖)注入——依赖注入的方法是将它作为一个参数

第 4 段(可获 2 积分)

下面的代码显示了三种类型的依赖注入。

public class Computer
{
    private IDisplay display;
    public Computer (IDisplay display)
    {
        this.display = display;
    }
        
    public void Initialize(IDisplay display)
    {
        this.display = display;
    }

    public IDisplay Display 
    { 
        set
        {
            display = value;
        }
    }
}

//Some code outside to Computer class
{
    //Constructor dependency Injection
    Computer computer = new Computer(new LcdDisplay());

    //Method dependency Injection
    computer.Initialize(new CrtDisplay());

    //Property dependency Injection
    computer.Display = new CrtDisplay();
}

免责声明

我已经做了很多努力,让读者理解什么是依赖注入。我很高兴知道这篇文章里的所有缺点,如果你投票表决的话我甚至会更高兴。

第 5 段(可获 2 积分)

文章评论