嵌套异步与实体框架

本文关键字:框架 实体 异步 嵌套 | 更新日期: 2023-09-27 18:14:16

在关注点分离中,我有一个控制器、处理程序和存储库。如果我希望数据库IO异步完成,我应该把异步方法放在哪里?

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

在控制器

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));
}

最后,在Repository

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

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

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

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

嵌套异步与实体框架

您目前的方法是正确的。这是一个众所周知的问题,叫做"异步所有的方式"。基本上,这意味着如果你需要一些代码是异步的,那么所有的调用方法也应该是异步的。你不应该混合同步和异步代码,因为它很容易死锁和/或完全破坏异步代码的目的(即可伸缩性)。

所以在你的例子中,你写的代码遵循了最佳实践。

请参阅这篇令人惊叹的文章(真的,这是关于这个主题的最佳文章)以获取其他最佳实践。