博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅析依赖注入
阅读量:4703 次
发布时间:2019-06-10

本文共 2792 字,大约阅读时间需要 9 分钟。

      菜鸟D曾经的一个项目使用的是Spring.Net框架,是将java的Spring框架移植到.Net平台上来。但是它的核心思想没有发生什么变化,依然是——依赖注入和控制反转。

     老规矩,说一下依赖注入和控制反转的通用定义:

     依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(可能是一个Java实例,调用者)需要另一个角色(另一个Java实例,被调用者)的协助时,在 传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在Spring里,创建被调用者的工作不再由调用者来完成,因此称为控制反转;创建被调用者 实例的工作通常由Spring容器来完成,然后注入调用者,因此也称为依赖注入。

      菜鸟D表示很精炼,但是看不太懂。幸好,上一次大牛给我留了一些代码,本来是给我讲解委托事件的,但是其中的一些东西还是有利于依赖注入的理解的。

简化代码如下:

public interface IFrame  //定义一个接口    {        void Add();        void Edit();        void Save();    }    class FX操作1 : IFrame    {        public void Add()        {            MessageBox.Show("操作1");        }        public void Edit()        {        }        public void Save()        {        }    }    class FX操作2 : IFrame    {        public void Add()        {            MessageBox.Show("操作2");        }        public void Edit()        {        }        public void Save()        {        }    }    //自定义控件    public partial class FrameTwo : UserControl    {        public IFrame BindFrame        {            get;            set;        }        public FrameTwo()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            if (BindFrame == null) return;            BindFrame.Add();        }        private void button2_Click(object sender, EventArgs e)        {            if (BindFrame == null) return;            BindFrame.Edit();        }        private void button3_Click(object sender, EventArgs e)        {            if (BindFrame == null) return;            BindFrame.Save();        }    }    //主界面:    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void radioButton1_Click(object sender, EventArgs e)        {            if (radioButton1.Checked)            {                this.frameTwo1.BindFrame = new FX操作1();            }            else            {                this.frameTwo1.BindFrame = new FX操作2();            }        }    }

    可能代码有点乱,但是核心是最后的几行代码,采用接口可以实现多态,增加了可调用方法的种类,也提高了通用性。当我们把 new FX操作1()或者new FX操作2()放到另一个类(工厂或者容器)中,这就是一个spring的雏形。(个人观点,欢迎指正)代码的原意是封装一个拥有三个按钮的自定义控件,我们不知道触发点击事件后会发生什么,内部无法判断从而无法处理,于是将判断的逻辑放在外部,通过接口向控件内部“注入”一个“IFrame”的实体(其实就是控件内部可以调用外部不属于控件的方法)。控件在依靠外部的注入,外部给他提供什么样的类(此例,如接口),它就执行类中相应的方法。这时,就可以看到提供new FX操作1()或者new FX操作2()的“容器”为控件提供了注入的功能,而控件不需要自己来创建 FX操作1()或者 FX操作2(),这就实现了控制的反转。此例中spring(暂且如此称呼)将控件与操作类的耦合解开了,但是spring自身与操作类又耦合上了,相较而言解开操作类和控件的耦合才是我们需要的。

      菜鸟D的看法是,编程中没有设计模式,所谓的设计模式只在做一件事——解耦。我们解开了实体类和操作类的耦合,但是却将操作类和工厂耦合在一起,想要解开操作类和工厂的耦合,又有可能会造成新的耦合,我们在不同的场景采用不同的解耦手段,这些手段被总结起来就叫做设计模式。

      菜鸟D希望这篇白话对您有所帮助。

以下部分可能会对您有所帮助:

这篇文章的人和斧头的例子,感觉还是很不错的,对于依赖注入和控制反转的核心思想的理解还是挺有帮助的,代码是java的,学C#的也不难看懂。
这篇文章比较深,但是不难理解,而且是层次递进,读起来也很容易。

转载于:https://www.cnblogs.com/cnDqf/p/4093271.html

你可能感兴趣的文章
【JBPM4】判断节点decision 方法3 handler
查看>>
filter 过滤器(监听)
查看>>
node启动时, listen EADDRINUSE 报错;
查看>>
杭电3466————DP之01背包(对状态转移方程的更新理解)
查看>>
python--注释
查看>>
SQL case when else
查看>>
SYS_CONTEXT 详细用法
查看>>
Pycharm配置autopep8让Python代码更符合pep8规范
查看>>
我的第一篇博客
查看>>
【C++算法与数据结构学习笔记------单链表实现多项式】
查看>>
C#垃圾回收机制
查看>>
31、任务三十一——表单联动
查看>>
python之hasattr、getattr和setattr函数
查看>>
maven使用阿里镜像配置文件
查看>>
Copy code from eclipse to word, save syntax.
查看>>
arguments.callee的作用及替换方案
查看>>
PHP echo 和 print 语句
查看>>
第一讲 一个简单的Qt程序分析
查看>>
Centos 6.5下的OPENJDK卸载和SUN的JDK安装、环境变量配置
查看>>
poj 1979 Red and Black(dfs)
查看>>