zoukankan      html  css  js  c++  java
  • 依赖倒置原则

    今天讲一下,Asp.NetCore开发中一个很重要的概念,依赖倒置原则。依赖倒置原则主要是解耦类和类之间的依赖,面向对象一个很重要的概念就是高内聚,低耦合,降低耦合,可以让类和类之间的影响最大化降低,简单点,就是修改一个类的代码,不会让别的类也无法运作。

        依赖倒置就是开发中降低耦合的一个很好的方式,它通过IOC容器,将所有依赖关系都托管在IOC容器中,类需要什么,就给什么,这一过程,也叫做依赖注入(Dependency Injection)。

        在了解依赖倒置之前,先讲一下里氏转换原则,子类继承父类,那么,原来适用于父类的场景,一定适用于子类,因为子类继承了父类的所有显式功能,父类能做的,子类也能做。这一原则就是定义这个理论的存在,子类可以直接替代父类,将父类全部转换为子类,程序的行为没有区别。

        下面详细讲解一下,何为依赖倒置,举个例子,老板需要打印一份文档,如果自己去打印,老板就需要找打印机自行打印文件,这属于直接依赖打印机。反过来说,老板找秘书,分配打印任务叫秘书去做,老板只需要从秘书那里拿到文件,不必考虑秘书是如何打印的,这就是依赖倒置。

        其实,分配任务的过程其实就是一种抽象,把行为抽象出来,毫不考虑如何打印等细节。在程序开发中,我们非常需要面向抽象,也就是说面向接口编程,因为接口就是类的抽象,一个类依赖接口,那么所有实现这个接口的类,都能被其所用。

        依赖倒置就是类的秘书(IOC),它将类的依赖都托管给自己,类需要什么,就给什么,所以使用了依赖倒置原则的ASP.NetCore程序,在控制器中你很难看到new关键字,没有new实例,怎么使用类为我们服务呢,我们不需要知道,我们只需要将自己的依赖,放在构造函数中,相当于给IOC容器说明一下,在构造的时候,IOC就会自动new出实例。上面也讲到,这一过程叫做依赖注入,那依赖倒置和依赖注入有什么关系呢,其实依赖注入是依赖倒置的一个实现方式,也可以说,通过依赖注入,实现了依赖倒置原则。

        下面通过代码,去看一下,在ASP.netCore程序中,如何配置和使用依赖注入

        在StartUp里边,有一个管理中间件的类,还有一个管理依赖注入的类叫ConfigureServices微软自带了一套依赖注入的框架,通过这个类,就可以为IOC容器添加预定依赖,如果不添加,IOC找不到对应的依赖原型,就不能提供依赖注入。

     
    //这是三种配置依赖注入的方式
      //作用域范围
      services.AddScoped<IShoppingOperation, ShoppingOperation>();
      //瞬时模式
      services.AddTransient<IShoppingOperation, ShoppingOperation>();
      //单例模式
      services.AddSingleton<IShoppingOperation, ShoppingOperation>();

        下面解析一下这三种区别,

        作用域范围的依赖注入,在同一个作用域下,两处依赖某对象,IOC 容器会给分配相同的实例,也就是说,相当于两个实例引用同一个地址(拿开会举例子,作用域就是开会时共看一份会议说明)

        瞬时模式,顾名思义,不论任何情况,需要一次就new一个新的出来(人手一份会议说明)

        单例模式,程序的整个运行周期,只会new一次(每次会议都用一个会议说明,代代相传)

        单单这样引用是不会考虑到抽象的,这三个方法都有对应用于抽象的泛型,也是上面代码示例的样子,<接口,实现接口的类>,在依赖注入时,我们只需写接口对象,IOC就会new一个实现接口类的实例对象

     private readonly IShoppingOperation _shoppingOperation;
    public HomeController(IShoppingOperation shoppingOperation) { _shoppingOperation = shoppingOperation; }

        这样,就实现了面向抽象,我用接口对象,所有继承该接口的类,我都可以用,修改时只需修改startup中的依赖配置即可,一个文件看不出效果,不用抽象,直接改代码也不费劲,但是如果有100个文件呢,你会选择修改一次还是修改100次?

     这是我的公众号二维码

  • 相关阅读:
    c++跨平台技术学习(一)--使用公共的代码
    软件项目将死的27个征兆
    Java中的方法重载应用
    Java成员变量的初始化和在內存中的运行机制
    Java源文件结构和Java常用包
    细说Java访问控制符
    构造函数与this
    linux基础学习-6.3-DNS的配置文件
    linux基础学习-6.2-网卡配置文件
    linux基础学习-6.1-目录结构的特点
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13306942.html
Copyright © 2011-2022 走看看