我想简化存储库代码,并希望使用Funcs来提供常用功能。 现在的问题是基于这个代码:
namespace Test
{
public class Demo
{
public Task<Person> GetAsync1(Guid id)
{
return ExecuteAsync(context => context.Persons.GetAsync(id));
}
public async Task<Person> GetAsync2(Guid id)
{
return await ExecuteAsync(async context => await context.Persons.GetAsync(id));
}
public Task<Person> GetAsync3(Guid id)
{
return ExecuteAsync(async context => await context.Persons.GetAsync(id));
}
public Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func)
{
using(var context = new Context())
{
return func(context);
}
}
}
}
现在我的问题是如何正确调用async func。 这三种Get方法中的哪一种是正确的? 有了第一个,我认为我陷入了僵局,因为它在这一点上悬而未决。 2号工作正常,但我认为这里有两个异步/等待是不正确的,因为任务重新包装!?
答案 0 :(得分:8)
实际上所有3 GetAsync
条款都很好(我个人会使用GetAsync1
),你所拥有的是ExecuteAsync
中的错误
public async Task<TOut> ExecuteAsync(Func<Context, Task<TOut>> func)
{
using(var context = new Context())
{
return await func(context);
}
}
等待func
的输出,在函数完成它之前,你不会处理上下文。