Karte async Ergebnis mit automapper
Sind wir createing eine Web.Api-Anwendung eine angularjs-Anwendung. Die Web -.- Api gibt json-Ergebnis.
Schritt eins war immer, die Daten:
public List<DataItem>> GetData()
{
return Mapper.Map<List<DataItem>>(dataRepository.GetData());
}
Arbeitete wie ein Charme. Dann machten wir die Daten repo async, und wir geändert, um code zu arbeiten.
public List<DataItem>> GetData()
{
return Mapper.Map<List<DataItem>>(dataRepository.GetDataAsync().Result);
}
Stil keine Probleme. Jetzt wollten wir machen meine Web.Api full async awayt also haben wir es geändert:
public async Task<List<DataItem>> GetData()
{
return await Mapper.Map<Task<List<DataItem>>>(dataRepository.GetDataAsync());
}
In diesem moment Automapper verwechselt wird. Zuerst mussten wir die folgenden mapper-Regel:
Mapper.CreateMap();
Diese arbeiteten, bis die web-api-Methode wurde voll async. Die Ausnahme sagte, es fehlt eine Karte von
Task<ICollection<Data>> to Task<ICollection<DataItem>>.
Den mapper wurde geändert, um
Mapper.CreateMap<Task<List<Data>>, Task<List<DataItem>>>();
Bei der Validierung der Konfiguration, die Sie beklagt, dass das Ergebnis nicht zugeordnet werden können. Wie sollten wir konfigurieren Sie die Zuordnungen?
- könnte man ändern in:
var data = await dataRepository.GetDataAsync(); return Mapper.Map<List<DataItem>>(data);
? Ähnlich wie hier: stackoverflow.com/questions/24827417/... - Aber dann der controller selbst ist nicht async mehr?
- Die Methode markiert async und enthält die erwarten innerhalb des Körpers, so dass Sie nicht verlieren Ihre Zuordnung und immer noch async
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie bewegen Sie den asynchronen Datenabruf aus der Karte nennen:
Alternativ können Sie AutoMapper LINQ Projektionen:
Ich weiß nicht, ob Ihre repository stellt IQueryable direkt (die wir nicht benutzen-repositories). Unsere apps verwenden Sie die zweite version so ziemlich ausschließlich in diesen Tagen.
Können Sie auch hinzufügen, ein paar Task-Erweiterung-Methoden, die dies für Sie tun:
Jose Lösung erwies sich als ziemlich nützlich für mich. Ich hatte allerdings re-Ziel der Erweiterung Methode zum erweitern IMapper die es mir erlaubt, entfernen Sie die singleton-Referenz Mapper.