【问题标题】:Nested Async with Entity Framework嵌套异步与实体框架
【发布时间】:2015-09-23 13:37:50
【问题描述】:

在关注点分离中,我有一个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 方法异步(并使所有底层调用同步)?

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

【问题讨论】:

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


    【解决方案1】:

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

    因此,就您而言,您编写的代码遵循最佳实践。

    请参阅this amazing article (really, it's the best article about the subject IMHO) 了解其他最佳做法。请注意,“一路异步”一章基本上是您所遇到问题的答案。

    【讨论】:

    • 非常感谢!这篇文章很棒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-27
    • 2014-12-27
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2020-05-16
    相关资源
    最近更新 更多