2015-09-23 7 views
2

В разделении проблем у меня есть контроллер, обработчик и репозиторий. Если я хочу, чтобы IO базы данных выполнялась асинхронно, где я должен поместить метод async?Вложенные Async с Entity Framework

Например, я в настоящее время следующие:

В контроллере

public async Task<ActionResult> CreateOrder(OrderCreateModel ocm) 
{ 
    var order = await Using<CreateOffer>().Exeucte(ocm, userID); 
    ... 
} 

В Handler

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

я t похоже, что это слишком много методов Async. Получаю ли я те же результаты, если я:

  1. Как сделать метод репозитория асинхронным (и все вышеперечисленные методы синхронными)?
  2. Или если я просто сделаю метод контроллера Async (и сделаю все базовые вызовы синхронными)?

Каковы были бы лучшие практики, пересекающие разные слои, чтобы сделать работу данных асинхронной?

ответ

2

В настоящее время у вас есть правильный подход. Это проблема с названием «async all the way down». В основном это означает, что если вам нужен какой-то код для асинхронизации, все вызывающие методы должны быть также асинхронными. Вы не должны смешивать синхронизацию и асинхронный код, так как легко затормозить и/или полностью превзойти цель асинхронного кода (т. Е. Масштабируемость).

Так что в вашем случае код, который вы написали, соответствует лучшим практикам.

См. this amazing article (really, it's the best article about the subject IMHO) для других передовых методов. Обратите внимание, что глава «Async All the Way» по сути является ответом на ваш вопрос.

+0

Большое спасибо! И статья замечательная. –