但願給你3-5分鐘的碎片化學習,多是坐地鐵、等公交,聚沙成塔,水滴石穿,謝謝關注。數據庫
1.1什麼是依賴app
咱們先看下圖框架
能夠簡單理解,一個HomeController類使用到了DBContext類,而這種關係是有偶然性,臨時性,弱關係的,可是DBContext的變化會影響到HomeController函數
1.2顯示依賴和隱式依賴單元測試
先看顯示依賴代碼:學習
顯示依賴經過構造函數,很清楚的描述了HomeController類都依賴了哪些對象,這樣就能夠很好的管理這些依賴。而隱式依賴的缺點恰好就是顯示依賴的優勢。咱們看下面的隱式依賴:測試
若是一個類有上千行代碼,處處都充斥着該類型的代碼,這些代碼就像隱藏的病毒同樣,無處不在,能夠想象後續的變化和修改是多麼的恐怖。編碼
1.3依賴倒置3d
依賴倒置的概念其實很簡單,一句話就講完了:咱們要依賴抽象,而不依賴具體實現。什麼是抽象?好比接口,抽象類就是。對象
依賴抽象的目的是什麼?封裝變化!由於全部實現接口的實現均可以互相替換。
如上圖所示,當數據庫DapperUserRepository切換到EfUserRepository,對HomeController類能夠無需任何修改,就能夠平滑切換過去。反之,則更改的面就會很是大。
再看下面的代碼,OrderController依賴接口IUserRepository就是依賴倒置的表現。
也許你會說,個人變化沒有那麼頻繁,不須要那麼麻煩。那麼你是否考慮過,有可能本身的代碼須要進行單元測試?若是存在這種可能,那麼依賴注入是你必需要作的事。
2.1控制反轉
咱們再看下面這個代碼的問題
雖然OrderController依賴的是接口IUserRepository,知足依賴倒置原則,可是構造函數卻依賴的是具體實現類UserRepository,這種作法屬於硬編碼,仍然沒法知足將來變化帶來的修改,怎麼辦?接下來咱們來說控制反轉這個相對難以理解的概念。
先說反轉,到底反轉的是什麼?咱們知道OrderController依賴的對象UserRepository是在構造函數內的生成的。如何可以把該對象的生成交給外部去決定生成呢?能夠的!這種轉移對象生成的方式就是控制反轉。
簡而言之,反轉的是控制權,即依賴對象生成的控制權。是本身決定生成仍是交由別人去決定生成。
因此上面的代碼,修改以下:
以上的代碼才達到真正的控制反轉,UserRepository對象的生成徹底交由外部進行控制,交給變化去控制。
這樣有什麼好處呢?交給外部生成的最大好處是想要生成什麼對象能夠自由控制,這樣仍是爲了未來對象生成的可替換,好比數據庫訪問對象的變動;單元測試的實現類替換等等。
這裏借用大內老A一句話作爲總結:所謂控制反轉就是將對應流程的控制權轉移到框架裏。它體現的意思是控制權的轉移,即原來控制權在A手中,如今須要B來接管。IoC涉及的所謂控制能夠理解爲「針對流程的控制」。
2.2單元測試
有了上面的控制反轉,咱們的單元測試就方面不少了。
咱們能夠看到,在數據庫沒法鏈接的時候,咱們可使用MemoryUserRepository進行替換單元測試,很是方便。
我是IT人張飛洪,入行10年有餘,人不堪其憂,吾不改其樂,謝謝您關注