控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。
简单的说就是实现由外部提供,而当前类里只有定义。
using System;
namespace SinGooCMS.电脑
{
/*
* 依赖注入 指不依赖于细节,而依赖于抽象,依赖由外部产生
* 主板提供了稳定的接口,并要求实现各自的功能。职责分工互不影响
*/
public class 主板
{
private ICPU插槽 _cpu;
private I内存插槽 _mem;
private I硬盘插槽 _disk;
private I显卡插槽 _vcard;
private I外设插槽 _io;
public 主板(ICPU插槽 cpu, I内存插槽 mem, I硬盘插槽 disk, I显卡插槽 vcard, I外设插槽 io)
{
this._cpu = cpu;
this._mem = mem;
this._disk = disk;
this._vcard = vcard;
this._io = io;
}
public virtual void 开机运行()
{
_cpu.提供运算();
_mem.提供高速缓存();
_disk.提供数据存储();
_vcard.显示();
_io.外设输入输出();
}
}
public interface ICPU插槽
{
void 提供运算();
}
public interface I内存插槽
{
void 提供高速缓存();
}
public interface I硬盘插槽
{
void 提供数据存储();
}
public interface I显卡插槽
{
void 显示();
}
public interface I外设插槽
{
void 外设输入输出();
}
}
具体实现由外部提供
public class 英特尔CPU : ICPU插槽
{
public void 提供运算()
{
Console.Write("英特尔CPU正在运行");
}
}
public class AMDCPU : ICPU插槽
{
public void 提供运算()
{
Console.Write("AMD CPU正在运行");
}
}
public class 三星内存条 : I内存插槽
{
public void 提供高速缓存()
{
Console.Write("三星内存条提供高速缓存");
}
}
public class 西部数据 : I硬盘插槽
{
public void 提供数据存储()
{
Console.Write("西部数据500G");
}
}
public class 金士顿固态256G : I硬盘插槽
{
public void 提供数据存储()
{
Console.Write("金士顿固态256G");
}
}
public class 七彩虹1050i : I显卡插槽
{
public void 显示()
{
Console.Write("七彩虹1050i显卡");
}
}
public class 双飞燕键鼠 : I外设插槽
{
public void 外设输入输出()
{
Console.Write("双飞燕键鼠");
}
}
class Program
{
static void Main(string[] args)
{
主板 组装机 = new 主板(new 英特尔CPU(), new 三星内存条(), new 西部数据(), new 七彩虹1050i(), new 双飞燕键鼠());
组装机.开机运行();
Console.WriteLine();
主板 华硕 = new 主板(new AMDCPU(), new 三星内存条(), new 金士顿固态256G(), new 七彩虹1050i(), new 双飞燕键鼠());
华硕.开机运行();
Console.WriteLine();
}
}
最后实现的效果
总结:应该依赖于抽象(接口),而不应该依赖于具体实现。所谓注入就是把具体的对象注入到所应用接口中,凡是实现接口的对象,都是可以被注入的!