问题描述
所以我问这个问题,因为我不确定这些选项中的哪个是保持异步的正确解决方案。我猜两者都可以胜任,但我仍然想确定哪种方法最合适:
public async Task GetEntry(int id)
{
var entity = await _repository.GetByIdAsync(id)
}
选项1:存储库 注意:此选项未使用异步修饰符
public Task<MyEntity> GetByIdAsync(int id)
{
return Query().SingleOrDefaultAsync(e => e.Id == id);
}
public IQueryable<MyEntity> Query()
{
return _dbContext.Set<MyEntity>().AsQueryable();;
}
选项2:存储库(使用await和async修饰符)
public async Task<MyEntity> GetByIdAsync(int id)
{
return await Query().SingleOrDefaultAsync(e => e.Id == id);
}
public IQueryable<MyEntity> Query()
{
return _dbContext.Set<MyEntity>().AsQueryable();;
}
解决方法
我认为这将基于观点而关闭,因此我将首先给出我的观点:
2和3似乎非常规地使用EF(例如,不是直接在上下文中使用DbSet,而是按类型)。
1根本没有使用EF,但是对于单元测试很有用,因为隐藏了实际的数据库调用(尽管如果您使用的是.net core,则可以使用内存数据库来测试EF,因此可能还是没有意义。
您可能会说2中的第一个函数很好,因为它只是在不等待的情况下返回任务(这节省了上下文切换)。
要考虑的另一件事是,即使EF支持异步/等待,每个DbContext也不能同时由多个任务使用。如果尝试这种方法,应该会得到一个例外。当然,如果每个工作单元都有一个单独的DbContext,那么这不是问题。