c# - 嵌套异步与 Entity Framework

标签 c# entity-framework asynchronous async-await task

在关注点分离中,我有一个 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;
}

似乎这是太多的异步方法。如果我:

  1. 只是让存储库方法异步(以及所有上述方法同步)?
  2. 或者如果我只是让 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/

相关文章:

c# - 为应用程序定义路由

c# - Entity Framework 4 中的左外连接太多了吗?

javascript - 递归中的异步方法如何正确返回结果?

c# - 对话日期字符串的优雅算法?

c# - Azure 故障转移组的 SQL Server 连接字符串

c# - Entity Framework Fluent API 映射问题

javascript - Node 7 : EventEmitter + await/async

c++ - 如何保持 boost asio async 连续读取事件

c# - log4net:将标题写入每个滚动日志段

asp.net - DropDownlist 或 DropDownListFor Html 助手之间的区别