zoukankan      html  css  js  c++  java
  • C# 依赖注入

    依赖注入的另外一个意思便是控制反转,也就是说将控制权交给被调用者。

    百度百科定义:控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI)

    依赖注入的用处便是解除类之间直接依赖关系的方法,减小模块化设计的耦合性,即增加可维护性。

    假设我们有A,B两个模块,B要调用A来实现某种功能,通常最直接的做法是将A在B中创建实例:

    ps:

    interface IA{

    void PlayMusic();

    }

    public A1:IA{

    public void PlayMusic(){

    console.WriteLine('轰轰轰');

    }

    }

    public A2:IA{

    public void PlayMusic(){

    console.WriteLine('吼吼吼');

    }

    }

    public class B{

    var a= new A1;

    public void PlayMusic(){

       a.PlayMusic();

    }

    }

    这里有连个缺点:

    缺点:A1与B的耦合性,需要播放音乐完全依赖于调用者B,这时假如IA有两个子类,但是按照上面的硬编码,B只能实现A1播放音乐的功能。

    设想:如果我们将B的控制权交给被调用者IA,那么B要实现的播放功能由IA的实例决定,我传入A1的实例则播放A1的音乐,传入A2的实例则播放A2的音乐,控制权转交给IA,这时的耦合性降低了许多。

    依赖注入最常用的两种方式是setter注入(属性注入)和构造函数注入,除此之外,还有接口注入。

    下面我们来看两种依赖注入的方式:

    1、构造函数注入

    public class B{

    public IA a;

    public B(IA a){

     this.a=a;

    }

    public void PlayMusic(){

    a.PlayMusic();

    }

    }

    2、属性注入

    public class B{

    public IA a{

    get;

    set;

    }

    public void PlayMusic(){

    a.PlayMusic();

    }

    }

    public class Main(){

    B b=new B();

    b.a=new A1();

    b.PlayMusic();

    }

    以上创建的实例a都不是在B中硬编码,而是通过外部注入到B中的,从而将具体播放音乐的功能转移给外部注入到B中的a决定。

    上面介绍的是依赖注入的概念性上的解释,有兴趣同学们可以去看spring.net资料,将依赖关系转移到config配置文件中,可以说是最大的程度转移了控制权。

    参考地址:

    https://blog.csdn.net/hahajchahajc/article/details/47316189

    https://blog.csdn.net/zhonghua_csdn/article/details/90090263?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&dist_request_id=947afa4e-bb61-4d27-8f1c-8d32cb6ac1d2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control

    https://blog.csdn.net/Chen104617590/article/details/81775939?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control&dist_request_id=947afa4e-bb61-4d27-8f1c-8d32cb6ac1d2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.control

  • 相关阅读:
    【剑指offer】判断二叉树是否为平衡二叉树
    【剑指offer】数字在排序数组中出现的次数
    八大排序方法汇总(选择排序,插入排序-简单插入排序、shell排序,交换排序-冒泡排序、快速排序、堆排序,归并排序,计数排序)
    约瑟夫环问题-循环链表VS数组
    告别2014,你是否感谢这一年的自己?
    浅谈WEB页面提速(前端向)
    HTML5- Canvas入门(七)
    浅谈WEB安全性(前端向)
    是时候搁置Grunt,耍一耍gulp了
    前端神器avalonJS入门(二)
  • 原文地址:https://www.cnblogs.com/JoeYD/p/14428868.html
Copyright © 2011-2022 走看看