IOC
控制反转(IOC),依赖倒置(DIP),依赖注入(DI)
IOC控制反转:他为相互依赖的组件提供抽象,将依赖(底层模块)对象的获得交给第三方(系统)来控制,即依赖对象不在被依赖模块的类中直接通过new来获取。
DIP:是一种软件原则,他仅仅告诉你两个模块之间应该如何依赖,但是它没有告诉如何做。IOC则是一种软件设计模式,它告诉你应该如何做,来解除相互依赖模块得耦合;
IOC:一种操作,解决new对象产生得耦合性;
底层模块:相对于上层模块,是底层模块,相对于下层模块,是上层模块,比如三层架构,bll相对于ui层是底层模块,bll相对于dal层是上层模块;
上层模块不应该依赖于底层模块,而应该依赖于抽象,ui不应该依赖bll,应该依赖于bll得抽象,bll不因该依赖于dal,而应该依赖于dal得抽象
里氏替换原则:父类出现得地方,子类一定可以出现;工厂模式;
耦合:是指两个或两个以上的体系或两种运动形式间通过相互作用而彼此影响以至联合起来的现象。
在我们开发过程中,往往就因为面向对象,每使用必须new它得实例,所以在模块与模块之间往往会因为new对象产生耦合,这样的话我在模块开发过程中,切换得时候,会因为某一模块得切换而引起另一个模块得变更,那我们就遵循依赖倒置原则,将对应依赖的模块进行抽象,而我们的模块依赖于他的抽象,而不依赖他的细节,当你某些模块需要切换的时候,我们只需要切换对应的实现,而具体的抽象不需要发生变更,如果需要做到这一步,首先要实现依赖倒置,要把对应的实现进行抽象,写一个接口,抽象了以后,但是我们的类都是封闭的,为了把这个对应的细节能传进来,所以我们要开个口子,这个口子可以从构造传进来,也可以从属性传进来,这个叫依赖注入,我们把new交给你第三方(工厂,上层模块)这个叫控制反转;
IOC:模块与模块之间调用必须new对象,模块与模块之间就产生耦合,互相依赖,为了解决这个问题,我就把new放到外面,放到外面我们还要用,所以我把它抽象出来,抽象出一个接口,我在内部用的是这个接口,外部给的实现,我不用管,我就用这个接口代替实例(接口看作是一个替代品),但是具体是谁实例的,我不知道,我知道我用的时候必然会有具体的实例传进来。如果都用工厂模式来new对象,会非常麻烦,所以我用的时候会引入ioc容器,自动进行控制反转,自动进行依赖注入。
工厂模式:解决new对象产生的耦合问题。
面试:你知道什么是接口,你说的是interface吗?不是(指的是webapi接口),是 interface是一种抽象,把它对应的实现抽象出来,在面向对象的原则中有一种是控制反转,上层模块不应该依赖于底层模块,而应该依赖于抽象,抽象不应该依赖与细节,细节依赖于抽象;比如说工厂模式,解决new对象产生的耦合,引用依赖倒置,但是我需要把抽象和实现带入进去,所以引入依赖注入,在构造和属性开个口子把它注入进去,依赖倒置,外部来传;
抽象类和接口的区别:抽象类可以有实现的方法,接口不可以有
wcf有微软开发的一些列支持数据通信的应用程序框架。
两个模块之间调用需要new对象,就把这种new对象改成依赖于接口,而把new对象的操作交给工厂,由工厂new对象,然后传进来,这里面有几个概念,首先就是依赖倒置,就是我们本来依赖于这几个实现,但是现在我们依赖于抽象,就是依赖接口,这就是依赖倒置,接着就是我依赖的是抽象,但是具体要用的时候,我还用到细节,所以我们要开一个口子,让它传进来,这个叫做依赖注入,原本我是在内部new这个对象,现在我把它放在外部,用接口来代替这些实例,控制权转移了,这时候包含一个概念就是控制反转,控制反转也叫IOC,但是new对象这部分如果全部用工厂来实现,会比较麻烦,所以这个时候我们引入了IOC容器,自动进行依赖注入,所以最终工厂模式就为了解决一个问题就是,new对象引发的耦合问题,所以引入了控制反转,依赖倒置,依赖注入。
问接口时:你要问一下,您问的是webapi里面的接口还是c#中的interface
问接口时:你要问一下,您问的是webapi里面的接口还是c#中的interface
面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变化时,上层也要跟着变化,这就会导致模块的复用性降低而且大大提高了开发的成本。上层模块不应该依赖于底层模块,而是依赖于它的抽象,抽象不应该依赖于细节,而是依赖于它的实现,
相对的(上层和下层,例如相对于dal,bll就是上层,相对于UI层,bll就属于底层)
相对的(上层和下层,例如相对于dal,bll就是上层,相对于UI层,bll就属于底层)