zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Centos7永久修改hostname
    centos静态绑定IP地址
    Salesforce 报表开发
    Salesforce 测试类的实践
    Salesforce Aura开发 Component组件开发实践
    Salesforce Aura 开发 Hello World开发实践
    PHP设计模式之工厂模式
    PHP设计模式之单例模式
    PHP截取带有汉字的字符串,将汉字按两个字节计算
    window下安装Apache+PHP
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14442715.html
Copyright © 2011-2022 走看看