依赖注入 Dependency Injection (DI)

依赖注入  Dependency Injection (DI)

如果是第一次接触这个概念,可能会一时没有头绪,网上的各种解释可能让你更加混乱,当看到下面那段实例代码你可能不相信它就这么简单。其实依赖注入本身是单纯、简单的。

你可以直接略过其他直接看实例代码!


设计原则

1.找到应用中可能需要改变之处,把他独立出来,不要和那些不需要编号的代码混在一起;

2.针对接口编程,而不是针对实现编程;

3.多用组合,少用继承;

4.为了交互对象之间的松耦合设计而努力。

5.依赖倒置原则:高层模块不应该依赖于低层模块;两者都应该依赖于抽象。


策略模式:

定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。其中以上列出的前3条设计模式在策略模式中有所体现。

策略模式有助于理解依赖注入(Dependency Injection)


依赖 Dependency:

从属,从属物(英文意思更直接、明了)。也可以把依赖看成是一种关系,一种被注入者与注入者直接的关系。(继承、实现、拥有(has)是面向对象中的关系)


依赖注入是一种方式、方法或者说手段,是让被注入者和注入者之间建立关联的手段。

依赖注入的目的是松耦合,是交互对象之间的松耦合。


容器

通常一个系统中使用 DI,会有一个(或多个)类被用来创建那些(使用依赖注入的)类及其相关的依赖关系,这个(些)类被称为 容器(containers) ,或者更具体地,控制反转(Inversion of Control,IoC) 容器或者依赖注入(Dependency injection,DI)容器。容器本质上是一个工厂,负责提供向它请求的类型实例。




一个构造器注入(Constructor Injection)的例子,C#代码:

    public class CharactersController
    {
        public string _title{get;set;}
        public ICharacterRepository _characterRepository { get;}

       public CharactersController(ICharacterRepository characterRepository, string title = "Characters")
        {
            _characterRepository = characterRepository;
            _title = title;
        }
    }
如此看依赖注入就比较简单,而且平时经常使用。提供一个抽象类型(接口),运行时确定其具体的类型。

(注:C#要求使用构造注入的构造函数只能以一个重载函数,并且该函数也是依赖注入的。构造函数不是依赖注入的参数要提供默认值,否则会InvalidOperationException异常)



其他关于依赖注入的解释:

1.https://docs.microsoft.com/en-us/aspnet/core/fundamentals/dependency-injection

Dependency injection (DI) is a technique for achieving loose coupling between objects and their collaborators, or dependencies. Rather than directly instantiating collaborators, or using static references, the objects a class needs in order to perform its actions are provided to the class in some fashion. Most often, classes will declare their dependencies via their constructor, allowing them to follow theExplicit Dependencies Principle. This approach is known as "constructor injection".

翻译版:http://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-3_10-dependency-injection.html

依赖注入(Dependency injection,DI)是一种实现对象及其合作者或依赖项之间松散耦合的技术。将类用来执行其操作(Action)的这些对象以某种方式提供给该类,而不是直接实例化合作者或使用静态引用。通常,类会通过它们的构造函数声明其依赖关系,允许它们遵循 显示依赖原则 (Explicit Dependencies Principle) 。这种方法被称为 “构造函数注入(constructor injection)”。

注:显示依赖原则——为了正确地运行,方法和类应该明确地要求(通常是通过方法参数或构造函数参数)它们所需要的任何协作对象。




2.https://www.cnblogs.com/yangecnu/p/Introduce-Dependency-Injection.html

其中一段引用:

关于什么是依赖注入,在Stack Overflow上面有一个问题,如何向一个5岁的小孩解释依赖注入,其中得分最高的一个答案是:

“When you go and get things out of the refrigerator for yourself, you can cause problems. You might leave the door open, you might get something Mommy or Daddy doesn’t want you to have. You might even be looking for something we don’t even have or which has expired.

What you should be doing is stating a need, “I need something to drink with lunch,” and then we will make sure you have something when you sit down to eat.”

翻译:
“当你自己从冰箱里取东西时,可能会导致问题。 你可能会让开门开着,可能会得到一些妈妈爸爸不希望你拥有的东西。你甚至可能正在寻找我们没有或已经过期的东西。
你应该做的是说明一个需要,“
午饭我需要喝点东西喝”,然后当你坐下来吃东西的时候,我们会确保你有东西喝。



你可能感兴趣的:(依赖注入 Dependency Injection (DI))