【发布时间】:2018-02-02 10:19:24
【问题描述】:
我有以下代码部分,其中 SavePersonAsync 方法正在调用 3 个外部方法,任何人都可以告诉我异步/等待方法的实现是否正确实现。是否有没有正确实现 async/await 的调用链?
public PersonService(IPersonDbService personDbService,
IPersonEntityToPersonModelMapper personEntityToPersonModelMapper,
IPersonModelToPersonEntityMapper personModelToPersonEntityMapper)
{
_personDbService = personDbService;
_personEntityToPersonModelMapper = personEntityToPersonModelMapper;
_personModelToPersonEntityMapper = personModelToPersonEntityMapper;
}
public async Task<IEnumerable<PersonModel>> SavePersonAsync(IEnumerable<PersonModel> personsModel)
{
var personsEntity = await _personModelToPersonEntityMapper.MapPersonModelToPersonEntityAsync(personsModel);
var savedPersons = await _personDbService.SavePersonAsync(personsEntity.First()); // Currently only alow one person at a time, later it will allow to save a collection of persons
return await _personEntityToPersonModelMapper.MapPersonEntityToPersonModelyAsync(new List<PersonEntity>
{
savedPersons
});
}
}
public class PersonEntityToPersonModelMapper : IPersonEntityToPersonModelMapper
{
public async Task<IEnumerable<PersonModel>> MapPersonEntityToPersonModelyAsync(
IEnumerable<PersonEntity> personsEntity)
{
if (personsEntity.NullOrEmpty())
return await Task.FromResult(Enumerable.Empty<PersonModel>());
return await Task.FromResult(personsEntity.Select(personEntity => new PersonModel
{
FirstName = personEntity.FirstName,
LastName = personEntity.LastName
}));
}
}
public class PersonModelToPersonEntityMapper : IPersonModelToPersonEntityMapper
{
public async Task<IEnumerable<PersonEntity>> MapPersonModelToPersonEntityAsync(IEnumerable<PersonModel> personsModel)
{
if (personsModel.NullOrEmpty())
return await Task.FromResult(Enumerable.Empty<PersonEntity>());
return await Task.FromResult(personsModel.Select(personModel => new PersonEntity
{
FirstName = personModel.FirstName,
LastName = personModel.LastName
}));
}
}
【问题讨论】:
-
为什么
MapPersonModelToPersonEntityAsync和MapPersonEntityToPersonModelyAsync方法必须是async他们所做的只是执行一个Linq 查询? -
程序的其他部分正在使用这些方法,并且需要异步功能。
-
@TheBeginer 你的意思是接口在其他地方有不同的异步实现,你必须遵循异步签名?
-
@cassandrad 没错,这两个接口的现有实现是异步的(IPersonModelToPersonEntityMapper 和 IPersonEntityToPersonModelMapper)。而且我不想更改它,因为它已被大型应用程序的其他部分使用。让我知道是否有任何实施陷阱?如果是这样,如何避免或改善它。
-
@TheBeginer,除了缺少
ConfigureAwait(false),我没有看到任何内容,因为我不知道这个课程将如何使用。
标签: c# async-await call chain