重构多个自依赖的 await 调用

Refactoring multiple await calls that are self dependent

我不得不调查生产中的一些异常,然后我发现这段代码使用了 FluentValidation:

(inside async method)
var validator = new SomeCustomValidator();
var validationResult = validator.ValidateAsync(request).Result.ValidateRepositoryAsync(request, someRepository);

PS:方法ValidateRepositoryAsync是我们项目的自定义扩展。

为了对其进行一些重构,我只是更改为:

(inside async method)
ValidationResult validationResult;
var validator = new SomeCustomValidator();
validationResult = await validator.ValidateAsync(request);
validationResult = await validationResult.ValidateRepositoryAsync(request, someRepository);

所以,这段代码需要先执行ValidateAsync,等待它,然后根据结果执行ValidateRepositoryAsync

现在的问题是,我想知道是否有另一种方法可以做到这一点,也许在一行代码中,使用 ContinueWith,或者这是解决这个问题的更简洁的方法?

我越接近,但读起来似乎并不清晰:

var validator = new SomeCustomValidator();
var validationResult = await (await validator.ValidateAsync(request)).ValidateRepositoryAsync(request, someRepository);

有什么想法吗?

谢谢!

由于 ValidateRepositoryAsync 是您自己的扩展方法,也许您可​​以创建它的另一个原型,这个接受未等待任务的原型。

static async Task<ValidationResult> ValidateRepositoryAsync(this Task<ValidationResult> source, request, someRepository)
{
    var result = await source;
    return await result.ValidateRepositoryAsync(request, someRepository);
}

有了这个版本,您所要做的就是

validationResult = await validator.ValidateAsync(request).ValidateRepositoryAsync(request, someRepository);