面试官:. NET5源码里用到了哪些设计模式?懵!
作為微軟最早邁向開源的重要軟件之一,.NET 5的發(fā)布具有重要意義!
微軟希望 .NET Framework 開發(fā)者能夠遷移他們的代碼和應(yīng)用到 .NET 5.0 上,為明年發(fā)布的 .NET 6.0 將 Xamarin 開發(fā)者過渡到統(tǒng)一平臺(tái)奠定基礎(chǔ)。
版本發(fā)布時(shí)間軸:
.NET 5.0是我們的.NET統(tǒng)一之旅的第一個(gè)版本。構(gòu)建.NET 5.0是為了讓更多的開發(fā)人員能夠?qū)⑺麄兊?NET Framework代碼和應(yīng)用程序遷移到.NET5.0。
自首個(gè)預(yù)覽版發(fā)布以來微軟已經(jīng)進(jìn)行了廣泛的內(nèi)部部署,除了在 .NET 5.0 上運(yùn)行 .NET 網(wǎng)站外,Bing 也在使用這個(gè)新平臺(tái)。
ASP.NET Core在啟動(dòng)以及后續(xù)針對(duì)每個(gè)請(qǐng)求的處理過程中的各個(gè)環(huán)節(jié)都需要相應(yīng)的組件提供相應(yīng)的服務(wù),為了方便對(duì)這些組件進(jìn)行定制ASP.NET通過定義接口的方式對(duì)它們進(jìn)行了“標(biāo)準(zhǔn)化”,我們將這些標(biāo)準(zhǔn)化的組件稱為服務(wù),ASP.NET在內(nèi)部專門維護(hù)了一個(gè)DI容器來提供所需的服務(wù)。要了解這個(gè)DI容器以及現(xiàn)實(shí)其中的服務(wù)提供機(jī)制,我們先得知道什么是DI(Dependence Injection),而一旦我們提到DI,又不得不說IoC(Inverse of Control)。
.NET5核心IOC容器如何實(shí)現(xiàn)
我聽到很多人將IoC說成是一種“面向?qū)ο蟮脑O(shè)計(jì)模式”,但I(xiàn)oC不能算作一種“設(shè)計(jì)模式”!
1、工廠模式
工廠模式(Factory Pattern)是 C# 中最常用的設(shè)計(jì)模式之一。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在工廠模式中,我們?cè)趧?chuàng)建對(duì)象時(shí)不會(huì)對(duì)客戶端暴露創(chuàng)建邏輯,并且是通過使用一個(gè)共同的接口來指向新創(chuàng)建的對(duì)象。
依賴注入框架中有著大量的工廠模式的代碼,注冊(cè)服務(wù)的時(shí)候我們可以通過一個(gè)工廠方法委托來獲取服務(wù)實(shí)例.
依賴注入的本質(zhì)就是將對(duì)象的創(chuàng)建交給 IOC 容器來處理,所以其實(shí) IOC 容器本質(zhì)就是一個(gè)工廠,從 IOC 中獲取服務(wù)實(shí)例的過程就是工廠創(chuàng)建對(duì)象的過程,只是會(huì)根據(jù)服務(wù)的生命周期來決定是創(chuàng)建新對(duì)象還是返回已有對(duì)象。
其他的一些使用場(chǎng)景例如:日志記錄器、數(shù)據(jù)庫(kù)訪問。
2.抽象工廠模式
圍繞一個(gè)超級(jí)工廠創(chuàng)建其他工廠,該超級(jí)工廠又稱為其他工廠的工廠。這種類型的設(shè)計(jì)模式屬于創(chuàng)建型模式,它提供了一種創(chuàng)建對(duì)象的最佳方式。
在抽象工廠模式中,接口是負(fù)責(zé)創(chuàng)建一個(gè)相關(guān)對(duì)象的工廠,不需要顯式指定它們的類。每個(gè)生成的工廠都能按照工廠模式提供對(duì)象。
使用場(chǎng)景:QQ 換皮膚,一整套一起換;生成不同操作系統(tǒng)的程序。
3.策略模式
一個(gè)抽象類公開定義了執(zhí)行它的方法的方式/模板。它的子類可以按需要重寫方法實(shí)現(xiàn),但調(diào)用將以抽象類中定義的方式進(jìn)行。這種類型的設(shè)計(jì)模式屬于行為型模式。
asp.net core 中的認(rèn)證和授權(quán),就是策略模式的應(yīng)用,在使用 [Authorize] 的時(shí)候會(huì)使用默認(rèn)的 policy,也可以指定要使用的策略 [Authorize("Policy1")] 這樣就會(huì)使用另外一種策略 Policy1,policy 還是比較簡(jiǎn)單的。
而不同的認(rèn)證模式(Cookie/JWT/自定義Token等)其實(shí)是不同的處理方法,也就是策略模式中不同的算法實(shí)現(xiàn),指定哪種認(rèn)證模式,就是使用哪種算法實(shí)現(xiàn)來獲取用戶信息。
4.綜合案例實(shí)戰(zhàn):(手寫.NET5 IOC源碼)
可能有的朋友還是區(qū)分不了依賴倒置、依賴注入、控制反轉(zhuǎn)這幾個(gè)名詞,或許知道的也只是知道依賴倒置是原則,依賴注入、控制反轉(zhuǎn)都是實(shí)現(xiàn)的方式,我將在下面課程做詳細(xì)的介紹,在篇幅的最后還會(huì)自己實(shí)現(xiàn)了IoC容器的功能。
.NET5的執(zhí)行引擎Middleware源碼如何實(shí)現(xiàn)
1.責(zé)任鏈模式
為請(qǐng)求創(chuàng)建了一個(gè)接收者對(duì)象的鏈。這種模式給予請(qǐng)求的類型,對(duì)請(qǐng)求的發(fā)送者和接收者進(jìn)行解耦。這種類型的設(shè)計(jì)模式屬于行為型模式。
使用場(chǎng)景:1、有多個(gè)對(duì)象可以處理同一個(gè)請(qǐng)求,具體哪個(gè)對(duì)象處理該請(qǐng)求由運(yùn)行時(shí)刻自動(dòng)確定。2、在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求。3、可動(dòng)態(tài)指定一組對(duì)象處理請(qǐng)求。asp.net core 中間件的設(shè)計(jì)就是責(zé)任鏈模式的應(yīng)用和變形。
每個(gè)中間件根據(jù)需要處理請(qǐng)求,并且可以根據(jù)請(qǐng)求信息自己決定是否傳遞給下一個(gè)中間件,我也受此啟發(fā),封裝了一個(gè) PipelineBuilder 可以輕松構(gòu)建中間件模式代碼。
2.迭代器模式
迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環(huán)境中非常常用的設(shè)計(jì)模式。
這種模式用于順序訪問集合對(duì)象的元素,不需要知道集合對(duì)象的底層表示。
C#中Array 和 List 各自實(shí)現(xiàn)了自己的迭代器,是非常經(jīng)典的迭代器模式!
3.空對(duì)象模式
在空對(duì)象模式(Null Object Pattern)中,一個(gè)空對(duì)象取代 NULL 對(duì)象實(shí)例的檢查。Null 對(duì)象不是檢查空值,而是反應(yīng)一個(gè)不做任何動(dòng)作的關(guān)系。這樣的 Null 對(duì)象也可以在數(shù)據(jù)不可用的時(shí)候提供默認(rèn)的行為。
在空對(duì)象模式中,我們創(chuàng)建一個(gè)指定各種要執(zhí)行的操作的抽象類和擴(kuò)展該類的實(shí)體類,還創(chuàng)建一個(gè)未對(duì)該類做任何實(shí)現(xiàn)的空對(duì)象類,該空對(duì)象類將無縫地使用在需要檢查空值的地方。
4.綜合案例實(shí)戰(zhàn):(手寫.NET5 Middleware源碼)
學(xué)習(xí).NET 5必須學(xué)習(xí)中間件,中間件是什么?
中間件是組裝到應(yīng)用程序管道中以處理請(qǐng)求和響應(yīng)的軟件。
我們經(jīng)常在startup的configure中調(diào)用的app.use()方法,其實(shí)也就是向這個(gè)集合中添加一個(gè)middleware,Context進(jìn)入后,必須被該Middleware處理。
ASP.NET Core Middleware是在應(yīng)用程序處理管道pipeline中用于處理請(qǐng)求和操作響應(yīng)的組件。
研究.NET5的源碼,是一件非常枯燥、艱巨的事情,從設(shè)計(jì)模式的角度去研究,是一個(gè)很好的辦法,也就是探究.NET5源碼底層哪些用到了設(shè)計(jì)模式,運(yùn)用這些設(shè)計(jì)模式,如何去手寫.NET5底層核心內(nèi)容,通過這種方法,相信對(duì)你識(shí).NET5底層,提升自身實(shí)戰(zhàn)能力有很大的幫助!
.NET5內(nèi)部技術(shù)架構(gòu)集訓(xùn)營(yíng)
2020年12月22日~23日晚8點(diǎn)~9點(diǎn)30,.NET資深架構(gòu)師Tony老師,將帶領(lǐng)帶領(lǐng)大家開啟《純手寫.NET 5源碼+設(shè)計(jì)模式》三天特訓(xùn)營(yíng),帶領(lǐng)大家深入解讀源碼,手?jǐn)]設(shè)計(jì)模式!
一
超多資料,免費(fèi)領(lǐng)取
添加微信:ruanmou_xy
僅限前100名免費(fèi)領(lǐng)取!
送完恢復(fù)原價(jià)!
總結(jié)
以上是生活随笔為你收集整理的面试官:. NET5源码里用到了哪些设计模式?懵!的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 明天面腾讯,我刷了这71道面试题...
- 下一篇: C# 中 ConcurrentDicti