一丶前言 下麵是本人對於IOC容器的一些個人理解,希望能幫到初學者認識IOC,如有理解得不對的地方歡迎指正,也讓我學學。 二丶IOC是什麼,它是幹嘛的? 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,演示地址
演示地址:http://gaobili.cn:8600/swagger/index.html