在分离关注点时,我有一个Controller、Handler和Repository。如果我希望异步执行数据库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));
}最后,在仓库里
public async Task<Order> CreateOrderAsync(Order newOrder)
{
context.orders.Add(newOrder);
await context.SaveChangesAsync();
return newOrder;
}看起来这是太多的异步方法了。如果我:
遍历不同层以使数据操作异步的最佳实践是什么?
发布于 2015-09-23 13:50:53
你现在有正确的方法。这是一个众所周知的问题,称为“异步一直下降”。基本上,这意味着如果您需要一些代码来实现异步,那么所有的调用方法也应该是异步的。您不应该将同步和异步代码混合在一起,因为死锁和/或完全违背异步代码的目的(即可伸缩性)很容易。
因此,在您的例子中,您编写的代码遵循最佳实践。
有关其他最佳实践,请参见这篇令人惊叹的文章(真的,这是关于IMHO主题的最好文章)。请注意,“全程异步”一章本质上是对您所提问题的回答。
https://stackoverflow.com/questions/32741193
复制相似问题