淺析依賴注入

      菜鳥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

相關文章
相關標籤/搜索