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

    举个例子,组件A中有类ClassA,组件B中有接口IB和其对应的实现类B1和B2。

    那么,现在ClassA需要利用IB接口来做一些事情,例如:

    public class ClassA {
    public void DoSomething() {
    IB b = ???
    b.DoWork();
    }
    }

    现在的问题来了,IB b = ??? 中这三个???要写什么代码?是要写成 IB b = new B1(),还是要写成IB b = new B2() ?

    不管是哪一种,都会让ClassA强依赖于IB的实现。  ib在 类内实现了,下边的实现是在new class a的时候 在外部调用ib

    在上面这种方案中,ClassA通过new一个B1或B2来实现对IB的依赖的获取,换句话说,ClassA在主动获取依赖。

    这样的设计会让ClassA很难扩展,那我们要改良设计:使用依赖注入。上面说到了,问题出在new这里,也就是依赖是Class去主动获取的,那我们就要解决这个问题:不要去主动获取对IB的依赖(通过new),而让这个依赖从ClassA的外面“注入”进来。注入有多种方式,比较常用的一种是通过构造函数注入,那么,我们要把ClassA改成:

    public class ClassA {
    private IB b;

    public ClassA(IB b) {
    this.b = b;
    }

    public DoSomething() {
    this.b.DoWork();
    }
    }

    可以看到,通过把IB这个依赖从构造函数中“注”进来后,ClassA就不依赖IB的实现了。还可以发现,这个重构过程中,我们是把"ClassA主动获取对IB的依赖”变成“把对IB的依赖从外部注入到ClassA中”,依赖的方向反转了,所以,依赖注入又称“控制反转”。

    上面是依赖注入的所有内容。依赖注入不涉及任何反射、IoC框架(如Unity, Autofac)等内容。要注意这点。

    依赖注入让生成b实例不放在 A中,让其放在A的外边

      static void Main()
            {
                B1 b1=new B1();
                B2 b2=new B2();
               A  a=new A(b1);
               A  a2=new A(b1);
            }
  • 相关阅读:
    vue 无缝无限滚动横条实现
    小程序 recycle-view 个人demo
    js 笔记
    java整理的一些面试资料
    使用js获取浏览器地址栏里的参数
    java面试题
    sql中索引不会被用到的几种情况
    常用linux命令
    shiro登录成功之后跳转原路径
    springboot 整合 mongodb实现 批量更新数据
  • 原文地址:https://www.cnblogs.com/zuochanzi/p/8432763.html
Copyright © 2011-2022 走看看