Пользовательский асинхронный распознаватель AutoMapper

#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. Вы можете сделать это старомодным способом, написав функцию 🙂