Условная конфигурация для разных API в Autmapper - PullRequest
0 голосов
/ 30 января 2019

Я использую автомапер в проекте webapi.У меня есть контроллер, скажем ProductImagesController, который выполняет следующие действия.

  1. Получить все продукты: ~ / api / productImagess
  2. Получить продукт по идентификатору: ~ / api / productImages / {id}
  3. Создать продукт: ~ / api / productImages
  4. Обновить продукт: ~ / 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); после сопоставления модели для просмотра модели.

Вопрос:

Есть ли возможность достичь того же, сопоставив это условие с конфигурацией автоматического сопоставления?Это может избежать явного набора в действии.

...