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次?

     这是我的公众号二维码

  • 相关阅读:
    mongodb
    python中读取文件的read、readline、readlines方法区别
    uva 129 Krypton Factor
    hdu 4734
    hdu 5182 PM2.5
    hdu 5179 beautiful number
    hdu 5178 pairs
    hdu 5176 The Experience of Love
    hdu 5175 Misaki's Kiss again
    hdu 5174 Ferries Wheel
  • 原文地址:https://www.cnblogs.com/charlesmvp/p/13306942.html
Copyright © 2011-2022 走看看