Как указать правило отображения, когда имена свойств различаются

Я новичок в рамках 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 (целевой класс), как я могу указать правило отображения? Другими словами, как мне сделать больше с строкой кода (***) выше?

6 ответов

Решение

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

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

Действительно старая тема, но просто для того, чтобы свернуть комментарии выше в обновленном подходе, используя 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();

Мы также можем указать атрибуты класса для сопоставления

Из https://docs.automapper.org/en/stable/Conventions.html

Поддержка атрибутов

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * В настоящее время всегда включен

Ищет экземпляры SourceToDestinationMapperAttribute для свойств / полей и вызывает определяемую пользователем функцию isMatch для поиска совпадений членов.

MapToAttribute - один из них, который будет соответствовать свойству на основе предоставленного имени.

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

Учитывая, что у нас два класса

public class LookupDetailsBO
    {
        public int ID { get; set; }

        public string Description { get; set; }

    }

а другой класс

public class MaterialBO
    {
        [MapTo(nameof(LookupDetailsBO.ID))]
        public int MaterialId { get; set; }

        [MapTo(nameof(LookupDetailsBO.Description))]
        public string MaterialName { get; set; }

        public int LanguageId { get; set; }
    }

Таким образом вы обычно знаете, к какой собственности вы следуете. и вы убедитесь в соглашении об именах, поэтому, если вы изменили собственное имя в источнике. МАПТО () запросит об ошибке

Новый стиль отображения атрибутов с помощью аннотаций данных:

https://docs.automapper.org/en/v8.1.0/Attribute-mapping.html?highlight=annotation

         [AutoMap(typeof(Order))]
   public class OrderDto {
      // This is equivalent to a CreateMap<Order, OrderDto>() 

Для отображения члена

         [SourceMember(nameof(Order.OrderTotal))]
   public decimal Total { get; set; }

Если вам нужна обратная карта, вы добавляете это свойство в

         [AutoMap(typeof(Order), ReverseMap = true )]
   public class OrderDto {
      // This is equivalent to a CreateMap<Order, OrderDto>().ReverseMap() 

Приведенные выше ответы великолепны, и надеюсь, что OP получил свой ответ. Я просто хочу добавить, как мы можем отображать фиксированные значения вместо полей, используяUseValue()методIMemberConfigurationExpressionИнтерфейс.

      Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.Department, opt => opt.UseValue("Development"));

Это сопоставит «Развитие» со значением свойства отдела для данных назначения.

Другие вопросы по тегам