面試官:. NET5源碼裏用到了哪些設計模式?懵!

作爲微軟最早邁向開源的重要軟件之一,.NET 5的發佈具有重要意義!

微軟希望 .NET Framework 開發者能夠遷移他們的代碼和應用到 .NET 5.0 上,爲明年發佈的 .NET 6.0 將 Xamarin 開發者過渡到統一平臺奠定基礎。

版本發佈時間軸:

.NET 5.0是我們的.NET統一之旅的第一個版本。構建.NET 5.0是爲了讓更多的開發人員能夠將他們的.NET Framework代碼和應用程序遷移到.NET5.0。

自首個預覽版發佈以來微軟已經進行了廣泛的內部部署,除了在 .NET 5.0 上運行 .NET 網站外,Bing 也在使用這個新平臺。

ASP.NET Core在啓動以及後續針對每個請求的處理過程中的各個環節都需要相應的組件提供相應的服務,爲了方便對這些組件進行定製ASP.NET通過定義接口的方式對它們進行了“標準化”,我們將這些標準化的組件稱爲服務,ASP.NET在內部專門維護了一個DI容器來提供所需的服務。要了解這個DI容器以及現實其中的服務提供機制,我們先得知道什麼是DI(Dependence Injection),而一旦我們提到DI,又不得不說IoC(Inverse of Control)。

.NET5核心IOC容器如何實現

我聽到很多人將IoC說成是一種“面向對象的設計模式”,但IoC不能算作一種“設計模式”!

1、工廠模式

工廠模式(Factory Pattern)是 C# 中最常用的設計模式之一。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。

依賴注入框架中有着大量的工廠模式的代碼,註冊服務的時候我們可以通過一個工廠方法委託來獲取服務實例.

依賴注入的本質就是將對象的創建交給 IOC 容器來處理,所以其實 IOC 容器本質就是一個工廠,從 IOC 中獲取服務實例的過程就是工廠創建對象的過程,只是會根據服務的生命週期來決定是創建新對象還是返回已有對象。

其他的一些使用場景例如:日誌記錄器、數據庫訪問。

2.抽象工廠模式

圍繞一個超級工廠創建其他工廠,該超級工廠又稱爲其他工廠的工廠。這種類型的設計模式屬於創建型模式,它提供了一種創建對象的最佳方式。

在抽象工廠模式中,接口是負責創建一個相關對象的工廠,不需要顯式指定它們的類。每個生成的工廠都能按照工廠模式提供對象。

使用場景:QQ 換皮膚,一整套一起換;生成不同操作系統的程序。

3.策略模式

一個抽象類公開定義了執行它的方法的方式/模板。它的子類可以按需要重寫方法實現,但調用將以抽象類中定義的方式進行。這種類型的設計模式屬於行爲型模式。

asp.net core 中的認證和授權,就是策略模式的應用,在使用 [Authorize] 的時候會使用默認的 policy,也可以指定要使用的策略 [Authorize("Policy1")] 這樣就會使用另外一種策略 Policy1,policy 還是比較簡單的。

而不同的認證模式(Cookie/JWT/自定義Token等)其實是不同的處理方法,也就是策略模式中不同的算法實現,指定哪種認證模式,就是使用哪種算法實現來獲取用戶信息。

4.綜合案例實戰:(手寫.NET5 IOC源碼)

可能有的朋友還是區分不了依賴倒置、依賴注入、控制反轉這幾個名詞,或許知道的也只是知道依賴倒置是原則,依賴注入、控制反轉都是實現的方式,我將在下面課程做詳細的介紹,在篇幅的最後還會自己實現了IoC容器的功能。

.NET5的執行引擎Middleware源碼如何實現

1.責任鏈模式

爲請求創建了一個接收者對象的鏈。這種模式給予請求的類型,對請求的發送者和接收者進行解耦。這種類型的設計模式屬於行爲型模式。

使用場景:1、有多個對象可以處理同一個請求,具體哪個對象處理該請求由運行時刻自動確定。2、在不明確指定接收者的情況下,向多個對象中的一個提交一個請求。3、可動態指定一組對象處理請求。asp.net core 中間件的設計就是責任鏈模式的應用和變形。

每個中間件根據需要處理請求,並且可以根據請求信息自己決定是否傳遞給下一個中間件,我也受此啓發,封裝了一個 PipelineBuilder 可以輕鬆構建中間件模式代碼。

2.迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 編程環境中非常常用的設計模式。

這種模式用於順序訪問集合對象的元素,不需要知道集合對象的底層表示。

C#中Array 和 List 各自實現了自己的迭代器,是非常經典的迭代器模式!

3.空對象模式

在空對象模式(Null Object Pattern)中,一個空對象取代 NULL 對象實例的檢查。Null 對象不是檢查空值,而是反應一個不做任何動作的關係。這樣的 Null 對象也可以在數據不可用的時候提供默認的行爲。

在空對象模式中,我們創建一個指定各種要執行的操作的抽象類和擴展該類的實體類,還創建一個未對該類做任何實現的空對象類,該空對象類將無縫地使用在需要檢查空值的地方。

4.綜合案例實戰:(手寫.NET5 Middleware源碼)

學習.NET 5必須學習中間件,中間件是什麼?

中間件是組裝到應用程序管道中以處理請求和響應的軟件。

我們經常在startup的configure中調用的app.use()方法,其實也就是向這個集合中添加一個middleware,Context進入後,必須被該Middleware處理。

ASP.NET Core Middleware是在應用程序處理管道pipeline中用於處理請求和操作響應的組件。

研究.NET5的源碼,是一件非常枯燥、艱鉅的事情,從設計模式的角度去研究,是一個很好的辦法,也就是探究.NET5源碼底層哪些用到了設計模式,運用這些設計模式,如何去手寫.NET5底層核心內容,通過這種方法,相信對你識.NET5底層,提升自身實戰能力有很大的幫助!

.NET5內部技術架構集訓營

2020年12月22日~23日晚8點~9點30,.NET資深架構師Tony老師,將帶領帶領大家開啓《純手寫.NET 5源碼+設計模式》三天特訓營,帶領大家深入解讀源碼,手擼設計模式!

超多資料,免費領取

添加微信:ruanmou_xy

僅限前100名免費領取!

送完恢復原價!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章