HttpClient 與 Polly 進行重試與斷路策略 - Microsoft.Extensions.Http.Resilience
HttpClient 與 Polly 進行重試與斷路策略 - Microsoft.Extensions.Http.Resilience在開發WebAPI串接第三方服務或是其他服務,通常會在HttpClient連線部分進行設定 Polly,以前會使用 Microsoft.Extensions.Http.Polly套件,但是最近翻文件發現 Polly 更新版本提供了 Pipeline 使用方式。使用 HttpClientFactory 微軟官方也有新增 Microsoft.Extensions.Http.Resilience 來支援這方式。比起 Policy 方式宣告 Pipeline 在效能上更優化。而且提供斷路器可以進行監控狀態及手動控制等功能,讓斷路器實作上更方便。下面範例使用 .Net 8 進行示範。
Polly 官方文件
https://www.pollydocs.org/advanced/performance.html
微軟官方文件
https://learn.microsoft.com/en-us/dotnet/core/resilience/?tabs=dotnet ...
使用 MockServer 與 TestContainer 進行整合測試
使用MockServer進行整合測試進行整合測試的時候,有些專案會依賴外部服務,以前是將外部服務抽成介面並進行抽換,但是這方法並不是很好。之前剛好使用MockServer進行壓力測試及相關測試。所以想說在整合測試裡面使用Docker去啟動MockServer方式。這邊使用 TestContainer 進行架設 MockServer 的 Docker。(下面其中的 MockServerClientNet 套件可以選擇不使用。只是去設定MockServer相關期望比較簡單而已。)
安裝方式12dotnet add package Testcontainersdotnet add package MockServerClientNet
建立 MockServer 的 TestContainer
MockServerConfiguration.cs
12345678910111213141516public sealed class MockServerConfiguration : ContainerConfiguration{ public MockServerConf ...
資料庫與物件導向的不匹配阻抗 (二) - Object-Relational Mapping 框架
資料庫與物件導向的不匹配阻抗 (二) ORM框架這邊先提一下什麼是ORM框架,ORM 的全名是「Object-Relational Mapping」,即「物件關係映射」。
我們可以從維基百科看定義:
物件關聯對應(Object–relational mapping,簡稱ORM、O/RM 或 O/R mapping tool)在電腦科學中是一種程式技術,用於在關聯資料庫與物件導向程式語言的堆疊之間轉換資料。這實際上創建了一個虛擬的物件資料庫,可以在程式語言中使用。
在 .Net 生態系中,微軟開發了 Entity Framework 作為其主要的 ORM 框架。
ORM (Object-Relational Mapping) 框架在實務上有些人會使用ORM框架。那ORM框架主要解決什麼問題?
不用寫SQL?
ORM 框架主要解決的是資料庫與物件導向程式設計語言之間存在的不匹配阻抗問題,其中包括:
結構不匹配:物件導向語言支持繼承、封裝和多型等特性,這些在傳統的關係資料庫中難以直接實現。物件之間的關係是透過引用和組合來管理的,而關係資料庫則通過外鍵建立表之間 ...
資料庫與物件導向的不匹配阻抗 (一) - 什麼是不匹配阻抗?
資料庫與物件導向的不匹配阻抗 (一) - 什麼是不匹配阻抗?我們可以從維基百科看定義:
Object–relational impedance mismatch is a set of difficulties going between data in relational data stores and data in domain-driven object models.
翻譯蒟蒻:
物件關聯阻抗不匹配是一組在關聯式資料庫中的資料與領域驅動物件模型中的資料之間轉換時遇到的困難。。
不匹配阻抗 (Impedance Mismatch) 是什麼?為何資料轉換這麼困難?在物件導向中,我們通常會用物件來表示現實世界中的事物,並且這些物件之間存在關聯。
UML 圖例如,一個團隊(Team)可以包含多位成員(TeamMember)。用 UML 圖來表示,會是以下的類別圖:
classDiagram
class Team {
+int Id
+string Name
+List<TeamMember> Tea ...
Event Storming 工作坊:打破溝通的橫溝
Event Storming隨著軟體服務越來越複雜,很多時候團隊的領域知識(Domain-Know How)是很難共享的。尤其在團隊之中會遇到特定的邏輯只有少部人知道關鍵邏輯。其他人在合作上會遇到認知上的落差,導致團隊合作上溝通麻煩及代溝。
例如:之前在工作上對於訂單產品相關知識,兩個人有兩個說法,三個人有三個人說法。這導致了開發上邏輯非常混亂,這時候我提出跑一次 Event Storming工作仿。用來釐清需求及各種專有名詞。並讓參與人員一起討論關於產品訂單的流程概念。目的是為了釐清需求和專有名詞,並讓所有參與者共同討論產品訂單的流程概念。
事前準備需要一份畫紙捲及很多顏色的便利貼,找一間有很大的牆面或是會議室。至於便利貼,最少要有以下有基本顏色較佳。
卡片顏色及介紹Domain Event 領域事件
橘色便利貼 : 表示領域事件,指在業務流程裡面產生的事件(使用英文表示應用過去式)。例如:所在地座標已重新定位(領域事件)。
User/Actor 使用者或是角色
...
Domain Driven Design 中的問題領域與解決領域
Domain Driven Design: 問題領域與解決領域Domain Driven Design (DDD) 是一種軟體開發方法,專注於連接軟體的技術實現與其業務需求。這種方法特別重視區分問題領域(ProblemDomain)與解決領域(Solution Domain),以確保軟體解決方案能精準地滿足業務需求。
問題領域 (Problem Domain/Space)問題領域涉及發現什麼問題、要解決的問題,即任何想解決的問題。
發現什麼問題、要解決的問題,我們有什麼問題,任何想解決的問題。通常以某個領域裡面知識為前提條件,需要處理或解決的問題。舉例來說,現在要開發一套可以解決人們沒有時間到實體店面進行購物,可以使用網路進行購物,下單物流等。這時候為了解決這問題,我們需要許多購物相關知識,在這個過程中,我們會聚焦於收集與該問題相關的業務知識,以便形成解決方案。
解決領域 (Solution Domain/Space)如何解決問題,要如何解決,要用什麼工具解決這個問題。在軟體工程就是開發人員熟悉的程式開發,包含用什麼程式語言、資料庫..等等。關注於如何通過技術手段 ...
xUnit 整合測試:記錄 WebAPI 的請求與回應資訊
WeatherForecastControllerTests.cs進行 .net core xUnit 的整合測試時,我們通常會使用 WebApplicationFactory.cs來模擬整個應用程序的啟動和運行。由於測試中經常需要自定義HTTP Header,因此可以通過實現一個簡單實作DelegatingHandler.cs來記錄請求和回應的詳細信息。也讓執行整合測試的請求與回應可以輸出到xUnit 中的 Console視窗。
WeatherForecastControllerTests.cs
123456789101112131415161718192021222324252627282930public class WeatherForecastControllerTests : IClassFixture<TestWebApplicationFactory<Program>>{ public WeatherForecastControllerTests(TestWebApplicationFactory<Program> ...
Swagger 文件加上FluentValidation驗證規則
Swagger 文件加上FluentValidation驗證規則MicroElements.Swashbuckle.FluentValidation 是一個 Swagger 擴展庫,它提供了一個便利的方法來顯示 FluentValidation驗證器的錯誤信息,使得 Swagger API 文檔更加友好和易於使用。
具體而言,MicroElements.Swashbuckle.FluentValidation 可以自動從 FluentValidation 驗證器中提取錯誤信息,並將其顯示在Swagger UI 的輸入欄位旁邊,以便用戶更快速地找到並修復錯誤。
MicroElements.Swashbuckle.FluentValidation安裝方式Nuget Package:
1Install-Package MicroElements.Swashbuckle.FluentValidation
註冊服務Program.cs 中 Dependency Injection 加上以下的程式碼:
12345// Register Validators builder.Services. ...
Swagger 文件加上範例格式資料
Swagger 文件加上範例格式資料Swashbuckle.AspNetCore.Filters 是一個 Swagger 擴充庫,提供一組有用的Attribute和工具,可以幫助開發人員更輕鬆地使用 Swagger和 .NET Core 開發 Web API。
其中的 ExampleProvider 是一個介面,用於定義如何生成 Swagger API 文檔中的範例資料。具體而言,ExampleProvider提供了一種方法,即 GetExamples(),該方法返回物件,其中包含要顯示在 Swagger API 文檔中的示例數據。通常,開發人員可以實現自己的ExampleProvider,並使用自定義的邏輯生成範例資料。
Swashbuckle.AspNetCore.Filters安裝方式Nuget Package:
1Install-Package Swashbuckle.AspNetCore.Filters
註冊服務Program.cs 中 Dependency Injection 加上以下的程式碼:
12345678910111213141516171819202122b ...
Swagger 文件安裝與設定
Swagger 文件安裝與設定現今許多 Web API 開發團隊都採用 Swagger 來製作 API 文件,這讓開發人員能夠更加便利地開發和測試 API。使用 Swagger的好處包括但不限於:清楚的 API 規範、易於閱讀的 API 文件、快速的 API 測試等。此外,Swagger 還支援自動生成客戶端程式碼,使得開發人員能夠更快地建立與API 互動的應用程式。
Swashbuckle.AspNetCore安裝方式Nuget Package:
1Install-Package Swashbuckle.AspNetCore
註冊服務Program.cs 中 Dependency Injection 加上以下的程式碼:
12345678910111213141516builder.Services.AddSwaggerGen(options => { options.SwaggerDoc ( "v1", new OpenApiInfo() ...
