.NET 雲原生架構師訓練營(設計原則&&設計模式)--學習筆記

MingsonZheng發表於2022-01-04

目錄

  • 設計原則
  • 設計模式

設計原則

  • DRY (Don't repeat yourself 不要重複)
  • KISS (Keep it stupid simple 簡單到傻子都能看懂)
  • YAGNI (You Aren't Gonna Need It 你不會需要它的)
  • CCP 共同閉包
  • CRP 共同複用
  • 高內聚、低耦合
  • 慣例優先配置
  • SCO 關注點分離
  • ADP 無依賴環
  • SOLID 物件導向設計原則

SOLID

  • S - Single-responsiblity Principle 單一職責
  • O - Open-closed Principle 對修改關閉,對擴充套件開放
  • L - Liskov Substitution Principle 里氏替換
  • I - Interface Segregation Principle 介面隔離
  • D - Dependency Inversion Principle 依賴反轉

設計模式

模式通常是指那些在一些相同的領域和上下文內,解決同樣的問題。所以一定要結合具體的使用場景去了解設計模式

使用設計模式的目的是為了可重用程式碼,提高程式碼的可擴充套件性和可維護性

設計模式主要分為三種型別:建立型,結構型,行為型

建立型模式關注點是如何建立物件,其核心思想是要把物件的建立和使用相分離,這樣使得兩者能相對對立地變換

結構型模式主要涉及如何組合各種物件以便獲得更好、更靈活的結構。雖然物件導向的繼承機制提供了最基本的子類擴充套件父類的功能,但結構型模式不僅僅簡單地使用繼承,而更多地通過組合與執行期的動態組合來實現更靈活的功能

行為型模式主要涉及演算法和物件間的職責分配。通過使用物件組合,行為型模式可以描述一組物件應該如何協作來完成一個整體任務

型別 模式
建立型 工廠方法:Factory Method;抽象工廠:Abstract Factory;建造者:Builder;原型:Prototype;單例:Singleton
結構型 介面卡;橋接;組合;裝飾器;外觀;享元;代理
行為型 責任鏈;命令;直譯器;迭代器;中介;備忘錄;觀察者;狀態;策略;模板方法;訪問者

工廠方法:Kestrel Server 從網路監聽

意圖:定義一個建立產品物件的工廠介面,將實際建立工作推遲到子類中

何時使用:有多種型別需要根據特定的場景進行建立例項時(或單個物件的建立過程比較複雜時)

外觀模式:Kestrel Server 到請求執行排程

為子系統中的一組介面提供一個一致的介面。Facade 模式定義了一個高層介面,這個介面使得這一子系統更加容易使用

符合單一職責原則,不要將過多的邏輯封裝在 TransportManager 類中

KISS 原則,KEEP IT Stupid Simple

原始碼

https://github.com/dotnet/aspnetcore/

目錄 Microsoft.AspNetCore.Server.Kestrel.Core 下面的 KestrelServerImpl 類中有一個繫結方法

options.EndPoint = await _transportManager.BindAsync(options.EndPoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);

這個方法是通過 TransportManager 實現的,它是 Facade 模式,所以直接用了一個類來實現

在 TransportManager 的 StartAcceptLoop 方法中實現了繫結的功能,其實就是呼叫了其他的幾個類

private void StartAcceptLoop<T>(IConnectionListener<T> connectionListener, Func<T, Task> connectionDelegate, EndpointConfig? endpointConfig) where T : BaseConnectionContext
{
    var transportConnectionManager = new TransportConnectionManager(_serviceContext.ConnectionManager);
    var connectionDispatcher = new ConnectionDispatcher<T>(_serviceContext, connectionDelegate, transportConnectionManager);
    var acceptLoopTask = connectionDispatcher.StartAcceptingConnections(connectionListener);

    _transports.Add(new ActiveTransport(connectionListener, acceptLoopTask, transportConnectionManager, endpointConfig));
}

在 TransportManager 的繫結方法中使用了 _transportFactory,它就是 IConnectionListenerFactory

var transport = await _transportFactory.BindAsync(endPoint, cancellationToken).ConfigureAwait(false);

IConnectionListenerFactory 轉到實現可以看到 SocketTransportFactory,它在 Transport.Sockets 中

除了 SocketTransportFactory,還有 QuicTransportFactory,它是 HTTP/3 協議的監聽器

多種實現最後都由 TransportManager 進行統一的管理

工廠方法符合開閉原則,後期有新的型別的時候,只需要新增新的型別和對應的工廠即可。不需要對程式碼邏輯進行修改

課程連結

https://appsqsyiqlk5791.h5.xiaoeknow.com/v1/course/video/v_5f39bdb8e4b01187873136cf?type=2

知識共享許可協議

本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。

如有任何疑問,請與我聯絡 (MingsonZheng@outlook.com) 。

相關文章