5分鐘玩轉依賴注入和控制反轉

如果你是開發大牛,可以評論指正,如果你是新手,對依賴注入摸不到頭緒,又或者看了許多大牛的博文,卻發現一臉懵逼,那麼把你懵逼的臉轉過來,這裏你可能會找到一點感悟,或者,你想象中非常複雜的東西其實沒有那麼恐怖,而真正恐怖的應該是中國的那些喜歡故弄玄虛的所謂的大牛前輩們!
本文采用.net語言來進行解釋,和你以往看到的教程不同,我們先看實例,再講概念。

一:實例:傳奇遊戲代言
如果你是遊戲開發商,在初期的時候,秀逗的你爲了讓自己的遊戲讓更多人看到了解,最後進行註冊,可能會去請許多明星來進行代言。第一次,你找了angelabay代言,沒辦法,人家火呀。於是發生了這樣的場景。
傳奇:你好,我想讓你給我的遊戲代言,因爲您的形象特別好呢。
angelababy:ok,木有問題,錢多錢少也不是問題,只要你肯砸錢讓我經常在網上露臉就行。
傳奇:哇塞,真是遇到好人了,一切聽您安排。
angelababt:各單位無條件服從我的命令(注意,此時的控制權在angelababy手中),於是各種代言詞開始被pass,重寫,pass,重寫,最終經過長達半年的選詞,代言完成。
開發商事後感悟:雖然麻煩,耗費了大量資金和時間,但是真值!薄利多銷的道理我還是懂得的,所以,我要再找一個明星代言!

於是我們的春哥陳小春被選中了,同樣的流程,長達半年的時間過去了,代言形象深入人心呀!

然而傳奇老闆這次似乎有點感悟了,爲什麼明明是雙贏的事,自己卻被牽着鼻子走呢?

這一夜,傳奇老闆做了一個夢,他夢到了喬布斯!喬布斯告訴他,直起腰板,你是金主,你說的算!把控制權要回來!

於是,控制反轉發生了,傳奇老闆瘋了一樣大刀闊斧的修改經營模式。所有人聽我號令,劇本,代言詞先準備好,哪個明星願意來,就必須給我老實的讀劇本!

於是發生了接下來的一幕,代言大戶聰哥來了,劇本的讀的很6,短短一天的時間,代言完成,傳奇老闆站在窗外,深吸一口氣:控制反轉真強大呀,我要弄一個明星庫,給他們編號。於是大量明星的信息被收錄進了明星庫,而這個明星庫就是我們說的容器,IOC容器!
傳奇老闆:這下萬無一失了,我把這些明星信息注入到明星庫裏,有一天,我要打敗麻花騰!

故事結束。
沒錯,控制反轉和IOC容器就是這麼回事,小夥伴,有感覺了沒有,好,開始講概念。

2.控制反轉和IOC容器
官方解釋,雖然我也看不懂,但是沒辦法,複製粘貼過來,勸你還是殭屍讀一樣的過一遍。
控制反轉(IoC),是面向對象編程中的一種設計原則,可以用來減低計算機代碼之間的耦合度。其中最常見的方式叫做依賴注入(DI)
ioc容器就不多解釋了,就是個大盒子。
3.傳奇案例,代碼實現之不使用依賴注入
首先明確一點,傳奇依賴於明星代言,我們先建幾個明星類。

 public class Angelababy
    {
        public void Speak()
        {
            Console.WriteLine("點我玩真的傳奇遊戲,我是Angelababy,我在傳奇等你哦!");
        }
    }

    public class ChenXiaoChun
    {

        public void Speak()
        {
            Console.WriteLine("我是陳小春,我在傳奇等你,是兄弟,就來砍我吧!");
        }
    }

接着是傳奇類:

  //此時是baby代言
 public class Game
    {
    
        public void Speak()
        {
         Angelababy   angelababy=new Angelababy   ();
            angelababy.Speak();
        }
    }
    //此時是春哥代言
 public class Game
    {
      //此時是baby代言
        public void Speak()
        {
         ChenXiaoChun   chenxiaochun=new  ChenXiaoChun();
            chenxiaochun.Speak();
        }
    }

看到這裏,有的小夥伴可能會覺得,還好啊,邏輯清晰,書寫規範,是我喜歡的代碼,
可是想一下,如果後期再來七八十個明星,你的代碼就會變成貪吃蛇的尾巴了。這還是不最可怕的,畢竟貪吃蛇再長,也可以複製,但是如果明星的詳細資料你都要改變呢,你是不是要跑回去把明星資料以及明星關聯的一些特定操作都要改一遍呢?不給自己擡槓了,繼續。

4 傳奇案例,代碼實現之使用依賴注入

這次我們會先建立一個明星庫,也就是ioc容器,注意,這個容器我們會選擇接口的方式來實現,你也可以弄個實體類基類來做ioc,前提是你不嫌麻煩。

//這就是最原始的容器,你沒有看錯,明星都聽我的號令,就給你們一個開口說話的權力,愛幹不幹
 public interface IStars
    {
        void Speak();
    }

接着,我們要開始向容器裏注入明星信息了

 public class Angelababy : IStars
    {
        public void Speak()
        {
            Console.WriteLine("點我玩真的傳奇遊戲,我是Angelababy,我在魔域等你哦!");
        }
    }

    public class ChenXiaoChun : IStars
    {

        public void Speak()
        {
            Console.WriteLine("我是陳小春,我在傳奇等你,是兄弟,就來砍我吧!");
        }
    }

到了這裏,我們的容器就ok了,接下來是遊戲類了。

 public class Game
    {
       //這裏給個註解:沒錯,就是把最原始的接口容器當作變量一樣定義在遊戲裏,明星屬於遊戲的一
       部分,而 不是遊戲完全依賴於明星了,這個思想,你要體會一下
        public IStars  _Istars { get; set; }

       //重寫構造,將接口當作參數,再次賦值給接口容器,他倆看似一樣,其實不然,因爲屬性不會變,
       參數卻是會改變哦
        public Game(IStars Stars)
        {
            this._Istars = Stars;
        }

       //遊戲裏屬於自己的代言方法,方法就是讓明星沒毛病說兩句
        public void DaiYan()
        {
            _Istars.Speak();
        }
    }

至此,依賴注入完成了,有強迫症的你可能會問,怎麼調用呢?
代碼在此:

 class Program
    {
        static void Main(string[] args)
        {
            //這裏的baby很委屈的被new了過來,沒辦法,需要流量呀
            Angelababy Angelababy = new Angelababy();

           //傳奇把baby放入了自己的規劃藍圖之中
            Game ChuanQi = new Game(Angelababy);

           //傳奇開機,代言開始
           //發現沒有,不是調用的明星的代言方法了,而是傳奇一開機,明星自動說話了,而真相就在上
           面的代碼中,留給你一點思考空間吧
            ChuanQi.DaiYan();

            Console.Read();
         
          //接下來是春哥登場,一句代碼搞定了呢
          new Game(new ChenXiaoChun ()).DaiYan();
          Console.Read();
        }
    }

喜歡點贊,感謝!
回過頭來想想,突然感覺哪裏不對。。。。5分鐘讀完。。。好像有點勉強呢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章