Ответ
AutoMapper — это популярная библиотека объектно-объектного маппера для .NET, которая автоматизирует преобразование объектов одного типа в другой, избавляя разработчика от написания шаблонного кода для копирования свойств.
Основное назначение: Сопоставление моделей предметной области (Domain Models) с DTO (Data Transfer Objects), ViewModels, запросами и ответами API.
Базовый пример использования:
// Исходный и целевой классы
public class UserEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public string Email { get; set; }
}
public class UserDto
{
public int Id { get; set; }
public string FullName { get; set; }
public string EmailAddress { get; set; }
}
// Конфигурация маппера (обычно в Startup/Program.cs)
var config = new MapperConfiguration(cfg =>
{
cfg.CreateMap<UserEntity, UserDto>()
.ForMember(dest => dest.FullName,
opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"))
.ForMember(dest => dest.EmailAddress,
opt => opt.MapFrom(src => src.Email));
});
IMapper mapper = config.CreateMapper();
// Использование
var userEntity = new UserEntity { Id = 1, FirstName = "Иван", LastName = "Иванов", Email = "ivan@mail.ru" };
UserDto userDto = mapper.Map<UserDto>(userEntity);
// userDto.FullName = "Иван Иванов", userDto.EmailAddress = "ivan@mail.ru"
Ключевые возможности:
- Автоматическое сопоставление по совпадающим именам свойств.
- Кастомные преобразования (
ForMember,ConvertUsing). - Обработка коллекций (списков, массивов).
- Вложенные объекты.
- Интеграция с DI-контейнерами (регистрация как Singleton).
Преимущества:
- Сокращает объем шаблонного, подверженного ошибкам кода.
- Делает код чище и проще для поддержки.
- Централизует логику преобразования в профилях (Profiles).
Недостатки и предостережения:
- Производительность: Нагрузка при первой конфигурации; для высокопроизводительных сценариев ручной маппинг или
Mapsterмогут быть быстрее. - «Магия»: Слишком сложная конфигурация может скрывать логику и усложнять отладку. Важно соблюдать баланс и использовать кастомные преобразования только там, где это необходимо.