加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 05:18:49 所属栏目:百科 来源:网络整理
导读:最近几天在?研究容器。发现有几个理念需要理一下。细一看,又发现根本就是我们之前学过的东西。控制反转(IoC)与依赖注入(DI)。这两个概念有很多相同的内容,只不过是侧重不相同。 控制反转 ??????? 控制反转(Inversion of Control,英文缩写为IoC)是一个重

最近几天在?研究容器。发现有几个理念需要理一下。细一看,又发现根本就是我们之前学过的东西。控制反转(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>



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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读