Я использую автомапер в проекте webapi.У меня есть контроллер, скажем ProductImagesController
, который выполняет следующие действия.
- Получить все продукты: ~ / api / productImagess
- Получить продукт по идентификатору: ~ / api / productImages / {id}
- Создать продукт: ~ / api / productImages
- Обновить продукт: ~ / api / productImages / {id}
У меня есть модель ProductImage, а такжеProductImageViewModel, как показано ниже;
public class ProductImage:
{
public int Id { get; set; }
public string FileName { get; set; }
public string Description { get; set; }
public byte[] Content { get; set; }
public double? Height { get; set; }
public double? Width { get; set; }
public string MimeType { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
}
public class ProductImageViewModel:
{
public int Id { get; set; }
public string FileName { get; set; }
public string Description { get; set; }
public string Base64Content { get; set; }
public double? Height { get; set; }
public double? Width { get; set; }
public string MimeType { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
}
Так что я использую ViewModel для передачи между клиентом и настроен с использованием автоматического сопоставления для сопоставления этих двух моделей.Пожалуйста, смотрите ниже;
config.CreateMap<ProductImage, ProductImageViewModel>()
.ForMember(dest => dest.Base64EncodedContent, opt => opt.Ignore())
.ReverseMap()
.ForMember(dest => dest.Content, opt => opt.MapFrom(src => Convert.FromBase64String(src.Base64Content)))
.ForMember(dest => dest.Created, opt => opt.Ignore())
.ForMember(dest => dest.Updated, opt => opt.Ignore())
});
Теперь работает отлично, и главное здесь - я не хочу отправлять клиенту строку в кодировке base64 из-за длины и размера.
Новый выход на пенсию:
В настоящее время у меня есть требование отправлять закодированную строку только для API Get by Id (~/api/productImages/{id
}).
Решение
В действии GetByID я могу обновить модель представления, преобразовав байты в base64, используя productImageViewModel.Base64Content = Convert.ToBase64String(productImage.Content);
после сопоставления модели для просмотра модели.
Вопрос:
Есть ли возможность достичь того же, сопоставив это условие с конфигурацией автоматического сопоставления?Это может избежать явного набора в действии.