0

All my repository methods are async for my CRUD operations using EF.Core async methods and use AutoMapper to map my EF entity model (Customer) to Domain Model (CustomerModel) and pass it back to my service layer.

public async Task<CustomerModel> GetCustomerByIdAsync(int id)
{
    Customer customer = await _context.Customers.FindAsync(id);

    var mappedResult =  _mapper.Map<CustomerModel>(customer);

    return await Task.FromResult(mappedResult);
}

Since "_mapper.Map" is not async but GetCustomerByIdAsync is, I return await Task.FromResult(mappedResult) instead of return mappedResult;

My caller method in service layer is also async. Have I got this right? I am also wondering about deadlock implications, although I am not calling any of my async methods from sync methods using .Result.

Thanks for your time.

MedEzz
  • 1

1 Answers1

2

Since "_mapper.Map" is not async but GetCustomerByIdAsync is, I return await Task.FromResult(mappedResult) instead of return mappedResult;

No, await Task.FromResult(x) doesn't ever make any sense. I've seen this code a lot, and I'm not sure where it comes from.

await Task.FromResult(x) is literally a less-efficient way of writing x. It's less efficient and less maintainable, so I have no idea where this idea came from.

Your code should look like:

public async Task<CustomerModel> GetCustomerByIdAsync(int id)
{
    Customer customer = await _context.Customers.FindAsync(id);

    var mappedResult =  _mapper.Map<CustomerModel>(customer);

    return mappedResult;
}
Stephen Cleary
  • 437,863
  • 77
  • 675
  • 810