我正在浏览一个在线视频,作者有以下代码:
public async Task CreateBookAsync(BookDto newBook)
{
var book = new Book(newBook.Id, newBook.Title, newBook.Author, newBook.Price);
await _bookRepository.AddAsync(book);
await _bookRepository.SaveChangesAsync();
}
书籍存储库:
public Task AddAsync(Book book)
{
_dbContext.Add(book);
return Task.CompletedTask;
}
public async Task SaveChangesAsync()
{
await _dbContext.SaveChangesAsync();
}
我不确定为什么
AddAsync
返回一个任务而不只是无效,为什么要返回Task.CompletedTask
?是不是因为CreateBookAsync
正在使用async Task
,所以将所有方法保留在使用Task
内是有益的?如果它只是返回 void
然后将 await
从调用者方法中删除,会有什么不同吗?
我不确定为什么
返回一个任务而不只是无效,为什么要返回AddAsync
?Task.CompletedTask
我想到两个可能的原因:
BookRepository
类实现了一个具有AddAsync
方法的接口。 BookRepository.AddAsync
的实现无法真正实现异步,因为(大概)_dbContext
不提供 Add
的异步版本。因此,实现者可以选择同步实现它或公开异步包装器,明智地选择前者,因为后者是邪恶的。
BookRepository
类是预计会发展的库的一部分。该库的作者预计 _dbContext
将在不久的将来获得异步 Add
的能力。他们决定不公开具有同步签名的 Add
,因为这样库的用户将使用此方法,并且他们的项目不会自动从包含 _dbContext
的新异步的库的未来版本中受益能力。他们选择公开具有异步签名的同步方法,因为他们正在考虑未来。