Универсальная логика повторов для кода, в который конструктор может бросить

Ответьте на вопрос здесь: Самый простой способ написать логику повторных попыток?

В ответе универсальный класс для повторных функций определяется и используется как таковой:

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));
Другие вопросы по тегам