Метод расширения для политики Polly

Я пытаюсь найти лучший способ написать метод расширения для политики Polly.

У меня есть следующие

public static async Task<IPollyDto> RunAsync(this IPolicy dtoClass, Func<Task<IDto>> action)
{
    return
        await Policy
            .Handle<ApiException>(ex => ex.StatusCode == HttpStatusCode.RequestTimeout)
            .RetryAsync(3,
                async (exception, retryCount) => await Task.Delay(200))
            .ExecuteAsync(async () => await action.Invoke().ConfigureAwait(false))
            .ConfigureAwait(false);
}

public interface IPollyDto {}
public interface IPolicy {}

Затем я называю код следующим образом

public class DtoTest : IPollyDto
{
}

public class TestA
{
    public static async Task<DtoTest> GetItem(string datasetName)
    {
        return await Task.Run(() => new DtoTest()) ;
    }
}

public class PollyTest : IPolicy
{
    public async Task<DtoTest> TestMe(string dataset)
    {
       return (DtoTest) await this.RunAsync(() => Task.Run(() => (IPollyDto) TestA.GetItem(dataset)));
    }
}

Я получаю сообщение об ошибке при разрешении типов.


person MicroMan    schedule 02.06.2020    source источник


Ответы (1)


Вы пропустили async-await в своем this.RunAsync(() => Task.Run(() => (IPollyDto) TestA.GetItem(dataset))) звонке. Измените его на:

this.RunAsync(() => Task.Run(async () => (IPollyDto)(await TestA.GetItem(dataset))));

Или просто:

this.RunAsync(async () => (IPollyDto)(await TestA.GetItem(dataset)))
person Guru Stron    schedule 02.06.2020
comment
спасибо Гуру Строну, я получаю ошибку времени компиляции, и мне нужно изменить ее, чтобы вернуть (DtoTest) await this.ExecutePollyAsync (async () = ›(IPollyDto) (await TestA.GetItem (dataset))); но по-прежнему получаю ту же ошибку при выполнении - person MicroMan; 02.06.2020
comment
@MicroMan да, остальная часть вашего кода должна была остаться нетронутой. См. эту скрипку, я изменил Func<Task<IDto>> action to Func<Task<IPollyDto>> action в RunAsync причина IDto не была определена. - person Guru Stron; 02.06.2020