@SimasikS
Я есть

Как сделать повторный вызов метода?

Всем привет, есть какой-то такой код

public async Task<List<AccountListView>> GetAsync()
        {
            try
            {
                return await TryGetAccountListAsync();
            }
            catch (UnauthorizedException)
            {
                await Context.Renew();

                return await TryGetAccountListAsync();
            }
        }

        private async Task<List<Model>> TryGetAccountListAsync()
        { 
           var response = /*Запрос к серверу*/
           if(!response.IsSuccessStatusCode) {
               throw new UnauthorizedException(); 
            } eles { 
               return response.ToModel();
            }
         }

Суть такая, пытаемся сделать запрос, если получаем что-то плохое то кидаем эксепшин, если эксепшин из-за того что токен устарел, то пытаемся обновить токен и повторить запрос. Как это сделать более красиво? Мне почему-то мой способ не заходит, потому что у меня уже есть 10 пар таких и это как-то не греет душу
  • Вопрос задан
  • 294 просмотра
Решения вопроса 2
@basrach
Если хочется "четко и красава чтоб не хуже чем у пацанов", гляньте на либу Polly:
public async Task<List<AccountListView>> GetAsync()
{
	var policy = Policy
		.Handle<UnauthorizedException>()
		.RetryAsync(
			retryCount: 1,
			onRetryAsync: (e, i) => Context.Renew());

	return await policy.ExecuteAsync(TryGetAccountListAsync);
}


Созданную policy можно переиспользовать. Т.е. вам не придется больше плодить копипасту, достаточно объявить одну политику на приложение, и дальше просто вызывайте то что требует обновления токена через эту политику.
Ответ написан
Можно попробовать сделать код реюз через делегаты, к примеру так:
public async Task<List<AccountListView>> GetAccountListAsync()
{
    return ContextGet(TryGetAccountListAsync);
}

private async Task<TReturn> ContextGet<TReturn>(Func<Task<TReturn>> func)
{
    try
    {
        return await func();
    }
    catch (UnauthorizedException)
    {
        await Context.Renew();

        return await func();
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы