目錄背景
重試模式 實現
使用**
興趣點
最近,當我在**中修復某些內容時,偶然發現了重試的實現,該實現是有效的,但效果不是很好。它與該類的實際邏輯交織在一起,使單元測試不必要地變得複雜。實際上,我們的公共庫中有一些不錯的實現,所以我採用並重用了它。
我們的應用程式在其中執行的環境本質上是不可靠的。尤其是當您與應用程式外部的資源(例如服務或儲存)進行通訊時。這些錯誤可以是永久性的(找不到資源,或者您無權使用該資源),也可以是暫時性的(超時或您的呼叫受到限制)。如果可以確定哪個故障是暫時的,則可以自動重試這些操作,而不必將故障返回給呼叫方。
成功的重試策略必須滿足以下要求:
microsoft docs
上的以下文章:
讓我們從重試策略本身開始。我在這裡選擇
async
版本,因為我認為這在當今很普遍。可以很容易地將其重寫為不使用任務。而且,將要重試的動作是返回資料。同樣,您可能有乙個單獨的過載而不返回資料,但我的意思並不是要提供完整的實現只是為了展示物件導向的設計。
public inte***ce iretrystrategy
我們將基於異常處理錯誤。
public inte***ce iexceptionhandler
最後,我們還有另乙個依賴關係來確保重試之間的延遲。
public inte***ce idelayprovider
這是重試策略的簡化實現。請檢視隨附的完整版本**。在這裡,您還可以找到異常處理程式和延遲提供程式的實現。
public async taskexecute(func> action)
catch (exception ex)
}retrycounter++;
var delay = this.delayprovider.getnextvalue();
await task.delay(delay);
}}
重試策略具有多個依賴關係,我們使用工廠來建立它。
通常,您希望它是可配置的(重試次數,延遲次數等),這是使用工廠的另乙個引數。這是乙個示例,它看起來可能是什麼樣子,但是您需要根據自己的需要進行定製。
public class retrystrategyfactory : iretrystrategyfactory
}
然後,您每次需要執行不可靠的操作時,都可以使用工廠建立重試策略。請注意,您可能希望針對不同的操作採用不同的策略。
public async task process()
); // process data
}
此實現幾乎與我們在生產**中使用的實現相同。您可以爭辯說,在物件導向設計方面還有改進的餘地,我同意。例如,與介面相比,使用委託非常方便且極為容易,但是如在測試中,進行模擬有點棘手,這表明設計並不理想。我當時正在考慮進一步推動設計,但如果有足夠的興趣,也許以後再考慮。
物件導向的方法
物件導向是按照貼近生活的認知論和思維方式來研究和模擬客觀世界的方法學。物件導向方法是一種運用物件 類 繼承 封裝 聚合 訊息傳遞 和多型等概念來設計 系統的軟體開發方法。物件導向方法 object oriented oo 以系統物件作為研究物件 為 資訊系統的分析與設計提供了一種全新的方法。彌補了傳...
物件導向的設計模式
header content type text html charset utf 8 函式 function,功能,方法 類 class 命名空間 namespace class person static function crypt p new person echo p hand.箭頭叫物件...
物件導向方法與物件導向測試
物件導向 object oriented,oo 方法認為,客觀世界是由各種物件組成的,任何事物都是物件,每乙個物件都有自己的運動規律和內部狀態,都屬於某個物件類,是該物件類的乙個元素。複雜的物件可由相對簡單的各種物件以某種方式而構成,不同物件的組合及相互作用就構成了系統。oo方法是當前的主流開發方法...