控制反转(IoC)与依赖注入(DI)

来源:互联网 发布:apache shirt session 编辑:程序博客网 时间:2024/04/30 15:32

最近几天在 研究容器。发现有几个理念需要理一下。细一看,又发现根本就是我们之前学过的东西。控制反转(IoC)与依赖注入(DI)。这两个概念有很多相同的内容,只不过是侧重不相同。


控制反转

        控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。

更通俗的说,就是本来你该做的事情 你不去做了 让系统去做。

我们举一个例子来说明,皇上生病了传御医。以前的做法是,皇上想叫哪一个大臣直接传旨召XX御医。而现在的做法就是这之间有了一个爱妃团。皇上只告诉爱妃团召御医。但是具体召哪一个御医,是由娘娘团决定的。很明显,整个事件的控制权掌握在了娘娘团手里。也就是我们说的控制反转(ICO)。


Demo

        ①皇上直接传御医


<span style="font-size:18px;">namespace  DemoFactory{    public interface IDoctor//医生接口    {        void GiveMedicine();//拿药    }    public class Doctor : IDoctor    {        public void GiveMedicine()        {            Console.WriteLine("中草药");        }    }}namespace SpringNewIoC {    class Program {        private static void NormalMethod() {            IDoctor doc = new IDoctor();            doc.GiveMedicine();            Console.WriteLine("我是皇上叫过来的御医");        }    }}</span>

这样的话,我们通过“IDoctor doc=new IDoctor() “   可知皇上一定要知道具体某个御医。

②皇上通过爱妃团传御医。

<span style="font-size:18px;">namespace DaoFactory{    public  static class wife    {        public static IDoctor CallDoctor()        {            return new Doctor();        }}namespace SpringNetIoC {    class Program {        private static void FactoryMethod()        {            IDoctor doc = wife.CallDoctor();            doc.GiveMedicine();            Console.WriteLine("我是娘娘团叫过来的御医");        }    }        }}</span>

有人说它是一种概念,也有人认为是一种设计模式。

那么依赖注入是什么意思呢?还是皇上通过娘娘叫御医。对爱妃团来说,她们把御医带给皇上。就相当于娘娘团把御医“注入”给皇上。

说到这大家千万不要觉得陌生,我们之前在设计模式的时候,这些都是已经接触过的。其实我上面写的demo 就是之前学过的一个简单的工厂方法而已。

此外,看网上的博客,他们实现IOC是通过配置文件来实现的。如下

<span style="font-size:18px;"><object id="Doctor" type="Dao.Doctor,Dao"/></objects></span>


<span style="font-size:18px;">private static void IoCMethod()        {            IApplicationContext ctx = ContextRegistry.GetContext();            IPersonDao dao = ctx.GetObject("Doctor") as IDoctor;            if (dao != null)            {                dao.Save();                Console.WriteLine("我是IoC方法");            }        }</span>



 说到这里,像我们的模板方法等等也有这些原理的应用。接下来开始深入的学习,请多指教。





0 0