Intern Day7

一、什么是依赖注入

  • 依赖注入( Dependency Injection = DI)的概念:把有依赖关系的类放到容器中,解析出这些类的实例。
  • 注入什么东西:应用程序依赖容器创建并注入它所需要的外部资源
  • 为什么需要依赖注入(目的):实现类的解耦。
  • 依赖注入的原理
  • 好处:如果后期代码因改动量过大,这样做可以减少维护和管理的量。
  • 在ASP.NET Core中,依赖注入是最基础的。任何你想使用的类型,都得注入进来才可以使用。
  • 设计原则:依赖于抽象(接口),而不是具体的实现。(解释:喝水依赖于喝水的工具,而不关心是马克杯还是保温杯等)
    • 接口特征:不可以被实例化,不能有构造方法;接口中的所有成员都是public,static,final;接口中的方法都是抽象方法,接口中的方法会自动使用public abstract修饰;一个类可以同时实现多个接口;实现类必须实现接口中的所有方法;接口可以继承接口。
    • 抽象类和接口的相同点:都代表系统的抽象层、都不能被实例化、都能包含抽象方法
  • 例子理解:如果一个类A的功能实现需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者之间会出现较高的耦合。 一旦B出现了问题,A也需要进行改造,如果这样的情况较多每个类之间都有很多依赖,程序会极难维护并且很容易出现问题。要解决这个问题,就要把A对B的控制权拿出来,交给一个第三方去做,把控制权反转给第三方,就叫控制反转。由第三方(我们称作IOC容器)来控制依赖,把它通过构造函数、属性或者工厂模式等方法,注入到A内,这样就极大程度的对A和B进行了解耦。
  • 个人理解:把A本来需要从B获得的东西(依赖),通过第三方(控制反转)换一种方式给(注入)它。

二、控制反转

  • 概念(Inversion Of Control = IOC):控制反转IOC是一个重要的面向对象编程的法,
  • 为什么反转:为了在业务变化的时候尽量减少改动代码造成的问题。
  • 反转的目的:控制反转用于解耦( 用来削减计算机程序的耦合问题)
  • 控制反转的实现方式(实现手段):依赖注入DI(最常见)、依赖查找DL(Dependency Lookup)

三、IOC容器

  • 容器是什么

  • 容器的构建和规则

  • IOC容器是由框架提供的,我们只要会用就行了。

  • IOC容器本身也是一个对象,只不过这个对象里面存储的都是已注册的类型。

  • 常见的IOC框架:微软自带DI、Autofac、Unity

  • 什么时候创建/使用:需要依赖管理的时候就可以用IOC。

  • 作用:

    1. 注册类型:把一些类注册到容器中。在我们当前这个环境下我们要 服务注册 。
    2. 解析实例。如果我们想要获取A类,我们在容器里注册一个A类,这时候我们想要获得A的实例,我们一般会去 new A () ,但是现在我们只需要直接从容器里来请求这个实例。
    3. 管理实例的生命周期。

.NET Core DI

  • DI在 .NET扩展包 里。

  • 关系:IOC是一种设计思想,而DI是这种设计思想的一个最典型的实现。正是因为用到了依赖注入的手段,所以才产生了控制反转这个结果。

  • 使用DI的好处?

    1. 让程序之间松散耦合,减少依赖,有利于功能复用。
    2. 让程序整体结构更加灵活,有利于单元测试。
  • 实例的注册

  • 服务的生命周期(三个)(在start.up类中ConfigureServices方法对实例进行注册)

    1. 单例生存期:整个应用程序生命周期以内只在第一次被请求时创建一个实例,后续每个请求都使用相同的实例。

      services.AddSingleton<IMessageService>();
      
    2. Transient(暂时/瞬时生存期):在每次请求时都会创建一个新实例。

      services.AddTransient<IMessageService, EmailService>();
      
    3. Scoped(作用域生存期):作用域生存期。在同一个作用域内只初始化一个实例 ,每一个请求只创建一个实例,同一个请求会在一个作用域内。

      services.AddScoped<IMessageService, EmailService>();
      

五、DI在ASP.NET Core中的基本用法

  • 在Startup类中初始化

  • Controller中使用

  • View中使用

  • 通过HttpContext来获取

  • 依赖注入的实现方式/基本用法(三种)

    1. 构造函数注入(最常用的注入方式,主要要会写这个)

      • 如果你需要添加一个自定义服务类,你就需要选择一个生存期。

      • 构造函数注入常用于在服务构建上定义和获取服务依赖。

      • 具体代码见:https://www.cnblogs.com/OFSHK/p/14446626.html

    2. setter注入

    3. 接口注入:接口注入使用接口来提供setter方法

  • 如何使用依赖注入

    • 在 ASP.NET Core中已经内置了一套依赖注入的容器,我们可以直接使用。在Startup.ConfigureServices中添加我们要注册的服务和实现,添加的时候可以对服务的生命周期进行相应的配置,然后就可以在PageModel、Controller、Views等需要的地方使用了。

四、如何替换其它的IOC容器

参考

  1. 通俗故事解释:https://learnku.com/articles/44564

  2. 场景举例:

  3. 参考视频:https://www.bilibili.com/video/BV1k7411A7Yv

  4. 参考博客:https://www.cnblogs.com/yjm8023/p/11858696.html

原文地址:https://www.cnblogs.com/OFSHK/p/14442715.html