控制反轉(IoC, Inversion of Control),依賴注入(DI, Dependency Injection)是在面向對象編程中常常碰到的專業術語。不少朋友可能在百度以後,便淺嘗輒止,沒有深刻理解這兩種思想的精髓。咱們在查找IoC的含義的過程當中,可能 見過這句通俗的解釋:你呆着別動,到時我會找你。這句解釋到底應該如何去理解呢?下面,咱們結合具體的業務場景和其實現方式的研究,來對IoC以及DI作一個比較詳細的解釋,但願可以對初學者有所啓發。編程
一. 一個常見的業務場景微信
在移動互聯網APP中,幾乎都要使用推送信息的功能,如:咱們常常會在週五晚上收到APP的推送消息,這樣的消息形式包括APP自有推送(通知欄),短信推送(短信中的通知類消息,有可能被過濾),郵件推送,微信推送,甚至之後還可能拓展到穿戴式設備推送,消息的形式很是豐富。而推送的消息中,主要是一些商品推薦類,內容推薦類或者系統通知類的內容。假定如今公司要你負責這部分推送功能的架構和實現,你應該如何去設計呢?網絡
這個業務場景能夠說在每一個移動互聯網公司都會遇到。假如該公司的名稱爲XM,負責實現該部分功能的小組中有三位研發成員,分別是:小A,小B和小C。如何對該功能系統進行總體架構,使得開發效率最高?咱們能夠圍繞如下幾個問題,進行逐步探討:架構
咱們圍繞這三個具體的問題,來一步步實現和改進咱們的系統。spa
二. 功能的設計實現與改進架構設計
2.1 程序實現V1.0設計
首先,短信推送的功能,要今天晚上開發上線。三我的一聽就慌了,還有五個小時,顧不上考慮那麼多了,先把功能開發出來再說。因而,三我的通過簡單的討論,將系統的實現架構設計以下:code
根據系統設計,分工以下:由小A負責業邏輯控制模塊LogicController的開發,此處簡化爲XM.LogicController.exe;由小B負責推送消息管理(PushMsgService),並集成到組件 XM.MsgService.dll中;由小C負責短信功能幫助類(SMSHelper),並提供組件XM.SMS.dll。對象
根據以上的設計和分工,不到一個小時,功能便作出來了。各自的代碼以下:blog
小C的短信功能幫助類核心代碼:
1 public class SMSHelper 2 { 3 public void Send(string message) 4 { 5 Console.Write("From SMS: " + message); 6 } 7 }
小B的消息管理模塊核心代碼以下:
1 public class PushMsgService 2 { 3 SMSHelper pushTool; 4 5 public PushMsgService() 6 { 7 pushTool = new SMSHelper(); 8 } 9 10 public void Push(string message) 11 { 12 pushTool.Send(message); 13 } 14 }
小A的業務集成模塊的核心代碼以下:
1 string message = "今日特價:創意城綠茶餐廳30元4人餐"; 2 MsgService.PushMsgService service = new MsgService.PushMsgService(); 3 service.Push(message);
三我的通過短暫的拼搏,終於完成了任務,順利上線了產品。作完以後,三我的洋洋得意的push了代碼,一塊去街邊擼串去了。當日,系統運行良好,無任何bug出現。次日,相應的功能被移植到了公司的其餘部門。如:後臺編輯部開發的推送管理系統,也須要此功能;運營部開發的產品推薦系統,也須要此功能;人力資源部門的招聘管理系統,也須要此功能。短信消息推送的功能,在各個部門裏面,被普遍的應用,都是採用ABC開發的這一套庫去作的實現。
2.2 程序實現V2.0
有天,跟XM合做的短信服務商忽然提升了合做的價格,每條短信要多收1分錢。因而,部門經理當機立斷:當即研發自有推送功能。除非客戶所處的地區網絡及其很差,不然,一概採用自有推送功能進行消息推送。
接到這個需求以後,ABC便快馬加鞭的開始工做了。不過,此次他們有點頭疼了,由於他們以前的代碼不只在本身部門使用,並且在編輯部,運營部,人力資源部都有被使用。若是要修改,難道我要一個個去各個部門修改嗎?怎麼樣使得此處的變化,產生最小的影響呢?這就是咱們要研究的第二個問題。