Как указать правило отображения, когда имена свойств различаются
Я новичок в рамках 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"));
Это сопоставит «Развитие» со значением свойства отдела для данных назначения.