軟體開發的架構與設計模式
- 什麼是軟體開發架構設計?
- 分層的意義
- 傳統與近代的架構分層
- 近代的軟體分層(Layer)
- 關鍵設計原則
- 構建系統的各種能力
- 什麼是框架
- 架構、框架、模式、基礎
- Lab:架構設計議題
- Lab:架構分層議題
- 參考:程式碼可維護性評量
軟體架構師
常用的設計模式 - DI
- 相依性管理
- 什麼是物件相依性
- Lab:DI與IoC
- 使用DI(依賴注入)服務
- Lab:使用DI服務
- 補充:DI服務的作用域
- DI注入是誰下的手?
- 透過設定實現注入
- Lab:透過設定檔動態注入
- 透過NuGet套件動態注入
- Lab:透過NuGet套件動態注入
常用的設計模式 - AOP
- 什麼是AOP與職責分離
- 以Attribute實現AOP
- Lab : 使用AOP切分關注點
- 參考:關於Attribute
- 參考:關於反射(Reflection)
- 如何建立AOP底層框架
- Lab:使用AOP處理例外
關於測試與可測試性
- 測試左移
- 單元測試與整合測試
- 測試金字塔
- 建立與使用單元測試
- 利用DI提升可測試性
- Lab:提升可測試性A
- 透過繼承建立fake物件
- Lab:提升可測試性B
- 使用測試隔離框架
- Lab:使用測試隔離框架
- 關於Mock物件
- Lab:使用隔離框架Mock物件
- 架構與可測試性
- 自動化單元測試
- Lab:建立覆蓋率報表
- 自動化整合測試
- Lab:自動化整合測試
實踐系統的可擴展性
- NuGet套件庫的價值與意義
- 建立Nuget套件
- Lab:建立Nuget套件
- DI與系統可擴展性
- Lab:使用套件實踐擴充性
- 模塊的可抽換性
- 單體式應用(Monolith)與微服務
- 案例:可擴展性的WinForm系統
- 案例:M365-可擴展性的Web系統
系統的身分驗證與安全性
- .net WebApp的身分驗證
- Lab:使用Cookies驗證
- 一次搞懂OAuth與SSO在幹什麼?
- 具體使用OAuth進行身分驗證
- Lab:建立應用程式並取得Token
- Lab:使用Microsoft AAD驗證
- Lab:使用Google驗證
- Lab:使用LINE驗證
- 用JWT Token進行身分驗證
- Lab:使用JWT實現SPA系統的身分驗證
- 分散式系統的身分驗證
- API呼叫的身分驗證
關於微服務
- 什麼是微服務?
- 補充:Clean Architecture
- 補充:DDD中的Repository與Services
- 利用容器化實踐微服務
- Lab:使用VS建立容器化應用
- Demo:使用AKS運行容器
- 建立微服務式的系統UI
- 微服務的身分驗證
- 利用APIM實作微服務介面
- 微服務的Configuration
雲端架構
- Cloud Native與Cloud Based
- 使用Web App實現HA架構
- 使用VM實現HA架構
- 微服務的通訊機制
- 事件與訊息架構
- Demo:Event Grid
- Demo:在軟體分層中以觀察者模式實現事件
- 訊息架構
- 使用Queue與Service Bus
架構的推動與框架的使用
dotnet 的專案與項目範本
開發者體驗(DX)
- 使用Snippet Designer建構程式碼片段
- Lab:建立自己的Code Snippet
- 建立VS Code當中的Snippet
- 團隊開發流程(working flow)
- 使用Pipeline建立自動化開發流程
- Lab:建立自動化 CI Pipeline
- Lab:在CI中建立自動化測試覆蓋率
- 自動化UI/Function測試
- Lab:在Pipeline中建立自動化整合測試
- Lab:在Pipeline做自動化程式碼掃描
- 使用ChatGPT對PR進行自動化Code Scan
- GitHub Copilot
- 未來的軟體開發願景
補充資料 與 參考
分層的意義
一般討論的系統分層有兩種,分別是 Layer(層)與 Tier(層)。
"Layer"(層)通常指系統中邏輯上的功能分類,比如說常見的四層架構:展示層(Presentation Layer)、業務邏輯層(Business Logic Layer)、資料存取層(Data Access Layer)和資料庫層(Database Layer)等。每一層都有其特定的職責和功能,並通過明確的介面和協議來與其他層進行互動,以實現系統的整體功能。
"Tier"(層級)則是指系統中實際的部署架構,通常以物理或者邏輯上的隔離為基礎進行切分,比如說常見的三層架構:用戶界面層(User Interface Tier)、應用程序層(Application Tier)和數據存儲層(Data Storage Tier)等。每一層都運行在獨立的環境中,有自己的計算和儲存資源,並透過特定的通信協議和介面來實踐系統的整體功能。
簡單來說,"Layer"是一種邏輯分類方式,強調功能分類和職責分離;"Tier"是一種物理或者邏輯部署方式,強調隔離和拆分。
資訊系統的分層有何好處?
- 結構清晰:系統分層可以使系統的架構更加清晰明了,每一層都有其特定的職責和功能,並且層與層之間的依賴關係明確,便於理解和設計、分工。
- 降低耦合度(減少相依性):系統分層可以減少各層之間的相互依賴和耦合,每一層都有自己的職責和功能,可以獨立設計和開發,降低系統維護成本,也方便模組化開發和重用。
- 易於擴展:系統分層可以使系統擴展(Extend)更加容易,每一層都有自己的職責和功能,可以在維持自身相容性的狀況下,根據需求進行擴展或調整,而不影響其他層的運行。
- 易於維護:系統分層可以使系統的維護更加容易,每一層都可以獨立進行維護和升級,而不影響其他層的運行。
- 可測試性:系統分層可以使系統的測試更加容易,每一層都有自己的職責和功能,可以獨立進行單元測試和整合測試,提高系統的可靠性和穩定性。
總的來說,系統分層可以使系統的設計、開發、擴展和維護更加容易和高效,提高系統的可靠性和穩定性,降低開發和維護成本。
資訊系統的分層有何缺點?
- 增加間接性:系統分層會增加層與層之間的傳輸和資料傳輸與轉換過程(序列化、反序列化),從而增加系統的間接性,可能會影響系統的效能和性能。
- 過度設計:系統分層可能會導致過度設計和過度抽象化,增加系統的複雜性、開發難度、和不必要的通訊,需要更多的時間和精力進行系統設計和開發。
- 系統重量增加:系統分層可能會增加系統的重量和體積,對系統的運行和儲存產生影響,可能導致需要更大的硬體資源和成本。
- 錯誤傳遞風險:系統分層可能會增加系統錯誤傳遞的風險,層與層之間的傳輸和轉換可能會導致數據的不一致和錯誤,需要更多的測試和驗證。
總的來說,所謂的分層,有Tier和Layer兩種,Tier之間一定有通訊,Layer之間則一定會有不同的主要職責。 系統分層需要根據具體的系統設計和需求來進行適當的分層,避免過度設計和抽象化,降低系統的間接性和風險,提高系統的效能和性能。