1. 程式人生 > >關於IOC容器的一些個人理解

關於IOC容器的一些個人理解

它的 依賴註入 測試 代碼 工作 pan 你們 net tof

原文:關於IOC容器的一些個人理解

一丶前言

  下面是本人對於IOC容器的一些個人理解,希望能幫到初學者認識IOC,如有理解得不對的地方歡迎指正,也讓我學學。

二丶IOC是什麽,它是幹嘛的?

  IOC只是一種編程思想,不局限於任何一種語言,任何語言都可以實現這種編程思想。它的設計思想是想把創建對象,管理對象生命周期,程序集之間的解耦的工作交給第三方容器來處理。傳統的方式都是自己new一個對象,然後在寫一個公共類去維護這個對象的生命周期,例如單例對象,static靜態對象,同一個HTTP請求使用同一個對象等等,這些功能如果不用ioc容器組件,那就要自己寫代碼實現。

用了IOC組件之後這些操作就交由第三方ioc容器組件來處理,你只需要把對象塞進容器裏,並告訴容器這個對象的生命周期就可以了。這種思想是符合未來發展趨勢,專業的事交給專業的人來做,分工明確。

IOC是思想,實現這個思想的組件有Autofac,Castle Windsor,Unity,Spring.NET,StructureMap,Ninject,他們的功能類似,我用的最多的是Autofac和StructureMap,推薦使用Autofac,StructureMap作者很久沒有更新了,下面文章的例子也是用Autofac來實現的。

三丶IOC容器Autofac使用流程圖

技術分享圖片

四丶Autofac使用流程例子

  1.註冊對象到容器中的流程:

技術分享圖片

這裏有個要註意的地方,如果判斷自己註冊對象是否真正的在容器中了,這個可以用上面的方法,查詢容器中是否包含了指定名字,如果查詢到了說明你註冊成功了。

如果這裏沒註冊不成功,你在構造中註入會報錯,上面的方法可以幫助你排查問題。

  2.從容器中取出對象使用的流程

這裏使用的是構造函數註入:

技術分享圖片

扯一下,為啥必須EF在同一次請求裏或者是同一個線程裏必須用同一個EF上下文:

同一次請求可能包含對數據庫的不同操作,其他的EF對象內獲取的數據可能已經是過時的,如果不保證同一個請求中使用同一個EF上下文對象,事務工作單元模式將無法實現。而且可能造成數據混亂。

五丶如何驗證對象的生命周期

技術分享圖片

技術分享圖片

你們會看到同時兩個請求,guid會來回切換,因為他們所處的線程上下文在切換,下次請求guid還是一個新的,這個證明了這個ef上下文是同一個請求中使用的是同一個對象,說明註冊的生命周期是有效的。

這個例子可能不那麽直觀,你們可以自己註冊一個單例對象,或者靜態對象測試一下就明白了。

六丶結語

  依賴註入,控制反轉感覺沒啥講的,理解上面的ioc容器是啥東西,他能幹嘛,使用ioc容器已經沒啥問題了,等我有空再把AOP切面編程和ioc解耦說下我個人的理解。

五丶Github Demo,演示地址

Demo 源碼地址,順便給個Star謝謝了。

演示地址:http://gaobili.cn:8600/swagger/index.html

關於IOC容器的一些個人理解