在关注点分离中,我有一个 Controller、Handler 和 Repository。如果我想异步完成数据库IO,我应该把async方法放在哪里?
例如,我目前有以下内容:
在 Controller 中
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 方法异步(并使所有底层调用同步)?
遍历不同层以使数据操作异步的最佳做法是什么?
最佳答案
您目前的方法是正确的。这是一个名为“一直异步”的已知问题。基本上这意味着如果你需要一些代码是异步的,那么所有的调用方法也应该是异步的。您不应混合使用同步和异步代码,因为这很容易造成死锁和/或完全破坏异步代码的目的(即可伸缩性)。
因此在您的情况下,您编写的代码遵循最佳实践。
参见 this amazing article (really, it's the best article about the subject IMHO)其他最佳实践。请注意,“Async All the Way”一章实质上是对您所提出问题的回答。
关于c# - 嵌套异步与 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32741193/