2016-12-21 55 views
1

從問題在這裏跟進: Cleanest way to write retry logic?通用重試邏輯的代碼,其中Constructor可以拋出

在答案,泛型類重試功能的定義和使用這樣的:

Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1)); 

會如何你實現了一個通用的重試,構造函數也可以拋出?

所以我不只是要重試:

SomeFunctionThatCanFail() 

我要重新以下塊以通用的方式:

SomeClass sc = new SomeClass(); 
    sc.SomeFunctionThatCanFail(); 
+0

如果您不需要訪問'後來sc',你可以做新的'Retry.Do(()=>新SomeClass的()SomeFunctionThatCanFail(),時間跨度。 FromSeconds(1));' –

+1

「構造函數拋出的地方」聽起來很腥。是的構造函數可能會拋出,但必須是嚴重錯誤的東西。沒有什麼可以在第二次嘗試中工作 – Steve

+0

將整個塊放入lambda表達式有什麼問題? –

回答

0

我沒有意識到我可以把一個代碼塊到Lambda表達式。這正是我想要的:

Retry.Do(() => { using (DataBaseProxy db = new DataBaseProxy(dbList.Next())) { .DoSomething(); } }, new TimeSpan(0)); 
3

這裏的構造也扔?

通常這是一個壞主意。我會建議看工廠模式:

public class SomeClass 
{ 
    private SomeClass() 
    { 
    } 

    public static SomeClass GetInstance() 
    { 
    // Throw Exception here, not in constructor 
    } 

    public void SomeFunctionThatCanFail() 
    { 
    } 
} 

現在你可以這樣做:

Retry.Do(() => 
    SomeClass.GetInstance().SomeFunctionThatCanFail(), 
    TimeSpan.FromSeconds(1));