Entity Framework 的嵌套异步

Nested Async with Entity Framework

在关注点分离中,我有一个Controller、Handler和Repository。如果我想让数据库IO异步完成,async方法应该放在哪里?

例如,我目前有以下内容:

在控制器中

public async Task<ActionResult> CreateOrder(OrderCreateModel ocm)
{
    var order = await Using<CreateOffer>().Exeucte(ocm, userID);
    ...
}

在处理程序中

public async Task<Order> Execute(OrderCreateModel ocm, Guid userID)
{
    ...
    return await _ordersRepository.CreateOrderAsync(new Order(ConvertToDataObject(ocm, userID));
}

最后,在存储库中

public async Task<Order> CreateOrderAsync(Order newOrder)
{
    context.orders.Add(newOrder);
    await context.SaveChangesAsync();
    return newOrder;
}

看来异步方法太多了。如果我:

,我会得到相同的结果吗?
  1. 只是让存储库方法异步(以及所有上述方法同步)?
  2. 或者如果我只是让 Controller 方法异步(并使所有底层调用同步)?

遍历不同层以使数据操作异步的最佳做法是什么?

您目前的方法是正确的。这是一个名为“async all the way down”的已知问题。基本上这意味着如果你需要一些代码是异步的,那么所有的调用方法也应该是异步的。你不应该混合同步和异步代码,因为很容易死锁 and/or 完全破坏异步代码的目的(即可伸缩性)。

所以在您的情况下,您编写的代码遵循了最佳实践。

有关其他最佳做法,请参阅 this amazing article (really, it's the best article about the subject IMHO)。请注意,"Async All the Way" 章节实质上是对您所提问题的回答。