浅析依赖注入

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

     老规矩,说一下依赖注入和控制反转的通用定义:
     依赖注入(Dependency Injection)和控制反转(Inversion of Control)是同一个概念。具体含义是:当某个角色(多是一个Java实例,调用者)须要另外一个角色(另外一个Java实例,被调用者)的协助时,在 传统的程序设计过程当中,一般由调用者来建立被调用者的实例。但在Spring里,建立被调用者的工做再也不由调用者来完成,所以称为控制反转;建立被调用者 实例的工做一般由Spring容器来完成,而后注入调用者,所以也称为依赖注入。java

      菜鸟D表示很精炼,可是看不太懂。幸亏,上一次大牛给我留了一些代码,原本是给我讲解委托事件的,可是其中的一些东西仍是有利于依赖注入的理解的。
简化代码以下:spring

 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但愿这篇白话对您有所帮助。框架

如下部分可能会对您有所帮助:
http://blog.csdn.net/taijianyu/article/details/2338311/
这篇文章的人和斧头的例子,感受仍是很不错的,对于依赖注入和控制反转的核心思想的理解仍是挺有帮助的,代码是java的,学C#的也不难看懂。
http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html
这篇文章比较深,可是不难理解,并且是层次递进,读起来也很容易。this

相关文章
相关标签/搜索