Як вказати правило зіставлення, коли назви властивостей відрізняються


144

Я новачок у програмі Automapper. У мене є доменний клас і клас DTO наступним чином:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

Примітка: Назва властивості " Назва " Employeeкласу не збігається з властивістю " FullName " EmployeeDtoкласу.

А ось код для Employeeоб’єкта на карті EmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

Моє запитання: Якщо я хочу відобразити Employee(клас джерела) на EmployeeDto(клас призначення), як я можу вказати правило відображення? Іншими словами, як мені зробити більше з рядком коду (***) вище?

Відповіді:


292

Неважливо, я сам знайшов рішення:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
Чи є спосіб її глобально визначити для будь-якого класу, щось на зразок префікса / суфікса? Наприклад, у мене є маса класів бібліотеки, у яких кожен має властивість "Локалізації". І я хочу їх віднести до класів, де відповідне властивість називається "LocalizedName". Моя єдина можливість - додати ForMember до кожної конфігурації відображення?
NickAb

2
у класі Mapper немає методу CreateMap :(
Navid_pdp11

3
@ Navid_pdp11 так, є. Ви повинні мати статичний клас Mapper не екземпляр
Jordy van Eijk

@JordyvanEijk Яку версію ви використовуєте зі статичним методом "CreateMap"? У 5.1.1.0 такого немає
Метт Томас

6
@MattThomas Після огляду github на автоматичній машині я бачу, що з версії 5.0 CreateMap є застарілим, і вони кажуть, що вам потрібно використовувати MapperConfiguration або Mapper.Initialize.
Джорді ван Ейк

7

Просто накрутити вищезазначені коментарі до оновленого підходу за допомогою Automapper 8.1 + ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

Тоді ви побудували б картограф за допомогою mapConfig:

var mapper = mapConfig.CreateMapper();

2

Ми також можемо вказати на атрибути Class для відображення

Від https://docs.automapper.org/en/stable/Conventions.html#attribute-support

Підтримка атрибутів

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Зараз увімкнено

Шукає екземпляри SourceToDestinationMapperAttribute для властивостей / полів та викликів, визначених користувачем, це функціяMatch для пошуку відповідностей членів.

MapToAttribute - це одна з них, яка відповідатиме властивості на основі вказаного імені.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

Коли ви цитуєте вміст з іншого місця дослівно, не забудьте скористатися форматуванням блокових цитат, щоб зрозуміти читачам, що вміст скопійовано.
TylerH

Перевірте новий стиль :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu

Дуже новинка для stackoverflow. Впевнений, буде дотримуватися правил @TylerH
Pranay DevOps
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.