首页 > 解决方案 > 重构多个自依赖的等待调用

问题描述

我不得不在生产中调查一些异常,然后我发现这段代码使用了 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);

对此有什么想法吗?

谢谢!

标签: c#multithreadingasynchronousasync-awaitfluentvalidation

解决方案


由于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);

推荐阅读