c# - 重构多个自依赖的等待调用
问题描述
我不得不在生产中调查一些异常,然后我发现这段代码使用了 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);
推荐阅读
- api - 尝试调用 FourSquare API 时收到版本控制日期错误
- swiftui - 使用 SwiftUI 和图表库合并两个 xy 图
- python - Kaggle 练习:列出问题编号。5. 使用“print”的语法错误
- python - Python Streamlit nltk 应用程序的 Heroku R10 和 H20 超时错误
- python - 即使我尝试先启动进程,进程也会在我调用函数后启动
- string - Groovy:将字符串标记为仅出现第 3 次分隔符
- python - 对数据框进行排序
- sql - 可以使用 sql 在月历中显示事件吗?
- python - 如果它们一起使用,如何替换令牌?
- vue.js - Nuxt JS 插件是否可以只运行一次?