重构多个自依赖的 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);
我不得不调查生产中的一些异常,然后我发现这段代码使用了 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);