拥抱.NET Core系列:依赖注入(1)
前言
DIP、IoC、DI
說起DI不得不提IoC這個(gè)模式,很多人會(huì)把DI和IoC混為一談,但其實(shí)這兩者是概念和實(shí)現(xiàn)的關(guān)系。
依賴倒置原則(DIP):軟件設(shè)計(jì)原則,要依賴于抽象,不要依賴具體實(shí)現(xiàn)。
控制反轉(zhuǎn)(IoC):一種實(shí)現(xiàn)DIP原則的模式。
依賴注入(DI):IoC的具體實(shí)現(xiàn)。
DIP就好比一個(gè)目標(biāo)一個(gè)法則。
IoC就好比是論文,“應(yīng)該怎么做才能遵循DIP”
DI就好比是實(shí)際的產(chǎn)品,“落實(shí)到具體的語(yǔ)言的工具”
關(guān)于這個(gè)比喻可能不是很準(zhǔn)確,大家可以使用搜索引擎去了解更為詳細(xì)的差異。
在.NET
在我接觸的很多.NET項(xiàng)目中,很少有人使用DI,更別提像Orchard那樣把DI用得出神入化。而復(fù)雜的代碼很大一部分的原因是沒有引入DI。在java中幾乎從剛?cè)腴T的新手都使用Spring提供的DI。
依賴注入生命周期
生命周期是指對(duì)服務(wù)實(shí)例的存活狀態(tài)控制,"Microsoft.Extensions.DependencyInjection"提供了一個(gè)枚舉定義了三種生命周期狀態(tài)。
| 類型 | 描述 | 
| Singleton | 單例服務(wù),從當(dāng)前服務(wù)容器中獲取這個(gè)類型的實(shí)例永遠(yuǎn)是同一個(gè)實(shí)例。 | 
| Scoped | 域內(nèi)單例,為每個(gè)作用域創(chuàng)建一個(gè)服務(wù)實(shí)例,也就是說域內(nèi)單例(域類似子容器)。 | 
| Transient | 瞬態(tài),從服務(wù)容器中每獲取一次創(chuàng)建一個(gè)新的實(shí)例。 | 
用例服務(wù)
代碼如下:
回到目錄
注冊(cè)服務(wù)的N種姿勢(shì)
其實(shí)可以很容易的看出,服務(wù)注冊(cè)是通過創(chuàng)建一個(gè)“ServiceDescriptor”來(lái)完成的,而其它方式的注冊(cè)只不過是基于一個(gè)方法的封裝而已,讓使用者可以更為方便的進(jìn)行服務(wù)注冊(cè)。
我們可以通過很多手段去注冊(cè)一個(gè)服務(wù),但這里推薦大家優(yōu)先使用擴(kuò)展方法進(jìn)行服務(wù)注冊(cè),因?yàn)檫@樣的代碼更易讀。反射循環(huán)注入時(shí)可以使用其它方式。
回到目錄
服務(wù)使用
首先我們來(lái)看一下服務(wù)提供者提供的方法簽名。
可以發(fā)現(xiàn)與服務(wù)注冊(cè)一樣,基于同一個(gè)方法提供了很多擴(kuò)展方法讓使用者更加便捷的獲取服務(wù)。
我們先來(lái)看“GetService<T>”與“GetRequiredService<T>”這兩個(gè)方法。
這兩個(gè)方法非常接近,唯一不同的是GetRequiredService會(huì)在找不到服務(wù)的時(shí)候拋出異常,而GetService在找不到服務(wù)時(shí)會(huì)返回null。
“GetServices”這個(gè)方法是用來(lái)獲取多個(gè)服務(wù)實(shí)例,該方法會(huì)返回該類型注冊(cè)的多個(gè)服務(wù)實(shí)例。我們來(lái)看個(gè)例子:
服務(wù)的生命周期
我們可以通過運(yùn)行結(jié)果很好的理清各個(gè)生命周期的用意。下面用一張圖來(lái)說明較復(fù)雜情況下“scope”的服務(wù)結(jié)果。
小技巧
注冊(cè)支持延遲加載的服務(wù)
開發(fā)過程中經(jīng)常有一種情況,服務(wù)A的A方法依賴了服務(wù)B,而服務(wù)A的B方法依賴了服務(wù)C,這時(shí)候你就得在構(gòu)造函數(shù)上同時(shí)聲明服務(wù)B和C,就像這樣。
這在其它DI組件中非常常見,比如autofac。而在現(xiàn)在我們需要這樣做:
原文地址:http://www.cnblogs.com/ants/p/7130293.html
.NET社區(qū)新聞,深度好文,微信中搜索dotNET跨平臺(tái)或掃描二維碼關(guān)注
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的拥抱.NET Core系列:依赖注入(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 使用docker-compose搭建As
 - 下一篇: DDD理论学习系列(9)-- 领域事件