1.初步了解IOC容器
学习地址:腾讯课堂 https://ke.qq.com/course/28986?_bid=167&_wv=3&from=iosapp
1.什么是IOC容器
定义:
1.是一个可以把面向细节编程方式,转变为面向抽象编程方式的第三方容器(工厂模式差不多)
2.可以用来自动化创建对象的容器(利用DI依赖注入和配置文件的手段来实现)
遵循依赖倒置原则:
高层不直接依赖底层的细节,而是通过抽象来依赖,也就是所谓的把面向细节编程变为面向抽象编程
IOC控制反转:
把高层对底层的依赖去掉,对象的控制权转移到第三方容器,让程序更具有扩展性
DI依赖注入:
实现IOC的一种手段,构造对象时,把依赖的对象自动创建并传入进去
DI依赖注入的先后顺序:
构造函数注入-->属性注入-->方法注入
2.为什么要用IOC容器
面向细节编程:
当我们面向细节编程的时候,如果细节变化了(扩展了),那么高层也需要改变,程序中往往底层的细节是容易改变的,这样会导致程序架构不稳定(往往我们的程序是不止一层的)
面向抽象编程:
当我们面向抽象编程的时候,如果细节变化了(扩展了),高层时不需要改变,这样阻止了程序升级时的水波效应,使程序架构更加稳定
例如(随便举例子):
手机类如下:
public class Iphone { public void Play() { Console.WriteLine("我在玩iphone"); } } public class VIVO { public void Play() { Console.WriteLine("我在玩vivo"); } }
学生类如下:
public class Student { public void Play(IMobile iphone) { iphone.Play(); } }
现在我们创建一个学生,并让学生玩iphone(面向细节)
//我们通过买一款iphone手机玩 public Unity_Test1() { Student stu = new Student(); Iphone iphone = new Iphone(); stu.Play(iphone); }
到后面这个学生想玩vivo手机了,不想玩iphone,那么我们需要改低层的 Play(Iphone iphone)方法,应为它接受的是一个Iphone类型的参数,同时我们还需要改Unity_Test1类中的代码
我们可以使用多态来解决此问题
先定义一个接口,并让上面2款手机继承此手机接口,并把
public interface IMobile { void Play(); }
代码如下(多态:里氏替换原则):
Student stu = new Student(); IMobile iphone = new Iphone(); stu.Play(iphone);
想玩vivo手机了,不想玩iphone,这下我们只需要更改 IMobile iphone = new Iphone(); 此句话即可
public Unity_Test1() { Student stu = new Student(); IMobile iphone = new VIVO(); stu.Play(iphone); }
注意:这里还是是依赖了细节(IMobile iphone = new VIVO();),并不满足依赖倒置原则(面向抽象,而不是面向细节)
3.如何实现依赖倒置原则
问题:
不依赖细节,那么我们如何创建对象呢?
解决:
把创建对象的事情交给第三方去实现
方式如下:
1)使用工厂模式
2)使用IOC容器