#c# #asp.net-core #automapper
#c# #asp.net-ядро #automapper
Вопрос:
У меня есть объект базы данных авторов, что их данные имеют внешний ключ в качестве данных.
Объект базы данных автора:
{
"id": 1,
"type": "author",
"name": "Author1",
"books": [1, 5, 8]
}
Я хочу восстановить из своего API AuthorResponse
, который похож, но отличается. AuthorResponse
Вместо идентификаторов должны быть возвращены объекты books.
Я создал этот преобразователь:
this.CreateMap<AuthorEntity, AuthorResponse>()
.ForMember(d => d.Books, opt => opt.MapFrom<BooksResolver, int[]>(s => s.Books));
И BooksResolver
:
public class BooksResolver : IMemberValueResolver<AuthorEntity, AuthorResponse, int[], Book[]>
{
public Book[] Resolve(AuthorEntity source, AuthorResponse destination, int[] sourceMember, Book[] destMember, ResolutionContext context)
{
var tasks = sourceMember.Select(id => GetBookFromDbAsync(id));
return await Task.WhenAll<Book>(tasks); // CAN'T USE AWAIT HERE
}
}
Но IMemberValueResolver
не поддерживает async/await
. Я могу преобразовать этот метод асинхронности в метод синхронизации, но я не думаю, что это хороший подход.
Как я могу использовать AutoMapper для этого сценария?
Комментарии:
1. Не делайте этого. Просто переместите этот код за пределы AM. Это не сопоставление кода, это логика вашего приложения. AM предназначен для сопоставления объектов с объектами. Если
ProjectTo
не подходит.2. Я понимаю. Я просто хотел сделать это здесь, поскольку у меня есть несколько мест, где мне нужно сопоставить идентификатор книги с объектом книги в системе… Поэтому я хотел повторно использовать это
BookResolver
везде…3. Вы можете сделать это старомодным способом, написав функцию 🙂