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;
}
看来异步方法太多了。如果我:
,我会得到相同的结果吗?
- 只是让存储库方法异步(以及所有上述方法同步)?
- 或者如果我只是让 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" 章节实质上是对您所提问题的回答。
在关注点分离中,我有一个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;
}
看来异步方法太多了。如果我:
,我会得到相同的结果吗?- 只是让存储库方法异步(以及所有上述方法同步)?
- 或者如果我只是让 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" 章节实质上是对您所提问题的回答。