Автоматическое сопоставление исходного объекта с вложенным объектом

#c# #asp.net #asp.net-mvc #automapper

Вопрос:

Как сопоставить один объект вложенному объекту

Нижеприведенное — это моя сущность.

 class Employee
{
    public string name { get; set; }
    public string city_name { get; set; }
    public string State_name { get; set; }
}
 

Я хочу сопоставить

 class Employee
{
    public string Name;
    public Location Location;
}

class Location
{
    public string City;

    public string State;
}
 

Обратите внимание, что имена апартаментов отличаются. Может ли кто-нибудь помочь сопоставить их с помощью AutoMapper

Комментарии:

1. Вам следует просто проверить документацию automapper и создать пользовательское сопоставление. похоже, образец документации automapper очень похож на ваш сценарий

Ответ №1:

Решение 1: ForPath

1.1 Создайте Profile экземпляр с наследованием от Profile и поместите конфигурацию в конструктор.

1.1.1 Использование ForPath для сопоставления вложенного свойства.

 public class EmployeeProfile : Profile
{
    public EmployeeProfile()
    {
        CreateMap<Employee, EmployeeDto>()
            .ForPath(dest => dest.Location.City, opt => opt.MapFrom(src => src.city_name))
            .ForPath(dest => dest.Location.State, opt => opt.MapFrom(src => src.State_name));
    }
}
 

1.2 Добавление профиля в конфигурацию картографа

 public static void Main()
{
    var config = new MapperConfiguration(cfg =>
    {

        cfg.AddProfile<EmployeeProfile>();

        // Note: Demo program to use this configuration rather with EmployeeProfile
        /*
        cfg.CreateMap<Employee, EmployeeDto>()
            .ForPath(dest => dest.Location.City, opt => opt.MapFrom(src => src.city_name))
            .ForPath(dest => dest.Location.State, opt => opt.MapFrom(src => src.State_name));
        */      
    });
    IMapper mapper = config.CreateMapper();
        
    var employee = new Employee{name = "Mark", city_name = "City A", State_name = "State A"};

    var employeeDto = mapper.Map<Employee, EmployeeDto>(employee);
}
 

Пример решения 1 на скрипке .Net


Решение 2: AfterMap

2.1 Создайте Profile экземпляр с наследованием от Profile и поместите конфигурацию в конструктор.

2.1.1 Использование AfterMap для выполнения сопоставления вложенного свойства после появления карты.

 public class EmployeeProfile : Profile
{
    public EmployeeProfile()
    {
        CreateMap<Employee, EmployeeDto>()
            .AfterMap((src, dest) => { dest.Location = 
                    new Location {
                        City = src.city_name,
                        State = src.State_name
                    };
                });
    }
}
 

2.2 Добавление профиля в конфигурацию картографа

 public static void Main()
{
    var config = new MapperConfiguration(cfg =>
    {

        cfg.AddProfile<EmployeeProfile>();

        // Note: Demo program to use this configuration rather with EmployeeProfile
        /*
        cfg.CreateMap<Employee, EmployeeDto>()
            .AfterMap((src, dest) => { dest.Location = 
                    new Location {
                        City = src.city_name,
                        State = src.State_name
                    };
                });
        */      
    });
    IMapper mapper = config.CreateMapper();
        
    var employee = new Employee{name = "Mark", city_name = "City A", State_name = "State A"};

    var employeeDto = mapper.Map<Employee, EmployeeDto>(employee);
}
 

Пример решения 2 на скрипке .Net


Рекомендации

  1. ForPath
  2. Экземпляры профилей
  3. До и после карты