Универсальная логика повторов для кода, в который конструктор может бросить
Ответьте на вопрос здесь: Самый простой способ написать логику повторных попыток?
В ответе универсальный класс для повторных функций определяется и используется как таковой:
Retry.Do(() => SomeFunctionThatCanFail(), TimeSpan.FromSeconds(1));
Как бы вы реализовали универсальную повторную попытку, куда также может сгенерировать конструктор?
Так что я не просто хочу повторить попытку:
SomeFunctionThatCanFail()
Я хочу повторить следующий блок в общем виде:
SomeClass sc = new SomeClass();
sc.SomeFunctionThatCanFail();
2 ответа
Решение
Я не понимал, что могу поместить блок кода в лямбда-выражение. Это именно то, что я хочу:
Retry.Do(() => { using (DataBaseProxy db = new DataBaseProxy(dbList.Next())) { .DoSomething(); } }, new TimeSpan(0));
куда может закинуть и конструктор?
Вообще это плохая идея. Я бы порекомендовал посмотреть на заводской шаблон:
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));