.NET 云原生架构师训练营(设计原则设计模式)--学习笔记
▲?點(diǎn)擊上方“DotNet NB”關(guān)注公眾號(hào)
回復(fù)“1”獲取開發(fā)者路線圖
學(xué)習(xí)分享?丨作者?/?鄭?子?銘????
這是DotNet?NB?公眾號(hào)的第180篇原創(chuàng)文章
目錄
設(shè)計(jì)原則
設(shè)計(jì)模式
設(shè)計(jì)原則
DRY (Don't repeat yourself 不要重復(fù))
KISS (Keep it stupid simple 簡(jiǎn)單到傻子都能看懂)
YAGNI (You Aren't Gonna Need It 你不會(huì)需要它的)
CCP 共同閉包
CRP 共同復(fù)用
高內(nèi)聚、低耦合
慣例優(yōu)先配置
SCO 關(guān)注點(diǎn)分離
ADP 無(wú)依賴環(huán)
SOLID 面向?qū)ο笤O(shè)計(jì)原則
SOLID
S - Single-responsiblity Principle 單一職責(zé)
O - Open-closed Principle 對(duì)修改關(guān)閉,對(duì)擴(kuò)展開放
L - Liskov Substitution Principle 里氏替換
I - Interface Segregation Principle 接口隔離
D - Dependency Inversion Principle 依賴反轉(zhuǎn)
設(shè)計(jì)模式
模式通常是指那些在一些相同的領(lǐng)域和上下文內(nèi),解決同樣的問題。所以一定要結(jié)合具體的使用場(chǎng)景去了解設(shè)計(jì)模式
使用設(shè)計(jì)模式的目的是為了可重用代碼,提高代碼的可擴(kuò)展性和可維護(hù)性
設(shè)計(jì)模式主要分為三種類型:創(chuàng)建型,結(jié)構(gòu)型,行為型
創(chuàng)建型模式關(guān)注點(diǎn)是如何創(chuàng)建對(duì)象,其核心思想是要把對(duì)象的創(chuàng)建和使用相分離,這樣使得兩者能相對(duì)對(duì)立地變換
結(jié)構(gòu)型模式主要涉及如何組合各種對(duì)象以便獲得更好、更靈活的結(jié)構(gòu)。雖然面向?qū)ο蟮睦^承機(jī)制提供了最基本的子類擴(kuò)展父類的功能,但結(jié)構(gòu)型模式不僅僅簡(jiǎn)單地使用繼承,而更多地通過組合與運(yùn)行期的動(dòng)態(tài)組合來(lái)實(shí)現(xiàn)更靈活的功能
行為型模式主要涉及算法和對(duì)象間的職責(zé)分配。通過使用對(duì)象組合,行為型模式可以描述一組對(duì)象應(yīng)該如何協(xié)作來(lái)完成一個(gè)整體任務(wù)
| 創(chuàng)建型 | 工廠方法:Factory Method;抽象工廠:Abstract Factory;建造者:Builder;原型:Prototype;單例:Singleton |
| 結(jié)構(gòu)型 | 適配器;橋接;組合;裝飾器;外觀;享元;代理 |
| 行為型 | 責(zé)任鏈;命令;解釋器;迭代器;中介;備忘錄;觀察者;狀態(tài);策略;模板方法;訪問者 |
工廠方法:Kestrel Server 從網(wǎng)絡(luò)監(jiān)聽
意圖:定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類中
何時(shí)使用:有多種類型需要根據(jù)特定的場(chǎng)景進(jìn)行創(chuàng)建實(shí)例時(shí)(或單個(gè)對(duì)象的創(chuàng)建過程比較復(fù)雜時(shí))
外觀模式:Kestrel Server 到請(qǐng)求執(zhí)行調(diào)度
為子系統(tǒng)中的一組接口提供一個(gè)一致的界面。Facade 模式定義了一個(gè)高層接口,這個(gè)接口使得這一子系統(tǒng)更加容易使用
符合單一職責(zé)原則,不要將過多的邏輯封裝在 TransportManager 類中
KISS 原則,KEEP IT Stupid Simple
源碼
https://github.com/dotnet/aspnetcore/
目錄 Microsoft.AspNetCore.Server.Kestrel.Core 下面的 KestrelServerImpl 類中有一個(gè)綁定方法
options.EndPoint = await _transportManager.BindAsync(options.EndPoint, connectionDelegate, options.EndpointConfig, onBindCancellationToken).ConfigureAwait(false);這個(gè)方法是通過 TransportManager 實(shí)現(xiàn)的,它是 Facade 模式,所以直接用了一個(gè)類來(lái)實(shí)現(xiàn)
在 TransportManager 的 StartAcceptLoop 方法中實(shí)現(xiàn)了綁定的功能,其實(shí)就是調(diào)用了其他的幾個(gè)類
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 轉(zhuǎn)到實(shí)現(xiàn)可以看到 SocketTransportFactory,它在 Transport.Sockets 中
除了 SocketTransportFactory,還有 QuicTransportFactory,它是 HTTP/3 協(xié)議的監(jiān)聽器
多種實(shí)現(xiàn)最后都由 TransportManager 進(jìn)行統(tǒng)一的管理
工廠方法符合開閉原則,后期有新的類型的時(shí)候,只需要添加新的類型和對(duì)應(yīng)的工廠即可。不需要對(duì)代碼邏輯進(jìn)行修改
課程鏈接
.NET云原生架構(gòu)師訓(xùn)練營(yíng)講什么,怎么講,講多久
推薦閱讀:
《Kubernetes全棧架構(gòu)師(Kubeadm高可用安裝k8s集群)--學(xué)習(xí)筆記》
《.NET 云原生架構(gòu)師訓(xùn)練營(yíng)(模塊一 架構(gòu)師與云原生)--學(xué)習(xí)筆記》
《.NET Core開發(fā)實(shí)戰(zhàn)(第1課:課程介紹)--學(xué)習(xí)筆記》
總結(jié)
以上是生活随笔為你收集整理的.NET 云原生架构师训练营(设计原则设计模式)--学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MongoDB服务无法启动,原因居然是.
- 下一篇: 实践剖析.NET Core如何支持Coo