嵌套异步与实体框架
本文关键字:框架 实体 异步 嵌套 | 更新日期: 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;
}
似乎这是太多的异步方法。如果我输入
,会得到相同的结果吗?- 只是使存储库方法异步(和所有上述方法同步)? 或者如果我只是使控制器方法异步(并使所有底层调用同步)?
遍历不同层以使数据操作异步化的最佳实践是什么?
您目前的方法是正确的。这是一个众所周知的问题,叫做"异步所有的方式"。基本上,这意味着如果你需要一些代码是异步的,那么所有的调用方法也应该是异步的。你不应该混合同步和异步代码,因为它很容易死锁和/或完全破坏异步代码的目的(即可伸缩性)。
所以在你的例子中,你写的代码遵循了最佳实践。
请参阅这篇令人惊叹的文章(真的,这是关于这个主题的最佳文章)以获取其他最佳实践。