2016-09-17 2 views
0

Я перед проблемой для отображения для вложенных объектов с помощью метода Auto Mapper Может ли один дать предложение для отображения исходного и целевого класса с использованием автоматического картографаКак использовать Auto Mapper Для вложенных объектов

Например, этот пример кода.

Источник:

Main Class: 
public class EMP { 
    public int empid {get;set;} 
    public int Name {get;set;} 
    public EMPDetails Employeedata {get;set;}//Here is inner object in main class 
    public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class 
} 

public Class EMPDetails { 
    public String Name {get;set;} 
    public EmpAdd EmpAddress {get;set;}//Here is inner Object in one class 
} 

public class EmpAdd { 
    public int id {get;set;} 
    public int Street {get;set;} 
} 

public class EmpContact { 
    public int id {get;set;} 
    public int Mobile {get;set;} 
} 

Цель:

Main Class:  
public class EMPInfo { 
    public int id {get;set;} 
    public int EmpName {get;set;} 
    public EMPPerdata Employeedata {get;set;}//Here is inner object in main class 
    public EmpContact EmpContactdetails {get;set;}//Here is other inner object in main class 
} 

public class EMPPerdata { 
    public String FullName {get;set;} 
    public EmpAdressInfo EmpAddress {get;set;}//Here is inner Object in one class 
} 

public class EmpAdressInfo { 
    public int id {get;set;} 
    public int Street {get;set;} 
} 

public class EmpContact { 
    public int id {get;set;} 
    public int Mobile {get;set;} 
} 

ответ

0

Оригинал ответа

Вам нужно создавать карты как для наружных и внутренних классов.

Ex:

Mapper.CreateMap<Emp,EmpInfo>(); 
Mapper.CreateMap<EmpDetails,EMPPerdata>(); 

и т.д ...

Тогда:

EmpInfo Dest = Mapper.Map<Emp, EmpInfo>(srcObj); 

Это должно работать.

Редактировать(потому что это не отличный ответ)

Так, просто хотел бы добавить по этому редактированию, чтобы показать несколько AutoMapper лучших практиков, потому что если вы будете следовать этим лучшим практикам это намного проще в использовании ,

AutoMapper Профили

При использовании Automapper, если вы не картирование действительно очень простые объекты, лучший способ настроить отображение через с помощью профилей. Для того, чтобы использовать эти профили убедитесь, чтобы добавить using AutoMapper; к вашей программе, а затем вы можете создать профиль отображения, как так:

public class MappingProfile : Profile 
{ 
    public MappingProfile() 
    { 
    CreateMap<EMP, EMPInfo>(); 
    } 
} 

Теперь в любом из классов, которые вы хотите использовать этот профиль вы можете использовать его как так :

Mapper.Initialize(cfg => 
{ 
    cfg.AddProfile<MappingProfile>(); 
}); 

EMPInfo empInfo = Mapper.Map<EMP, EMPInfo>(emp); 

Теперь ... почему бы вам не пойти на все это, чтобы сделать это? Вы могли бы так же легко сказать Mapper.CreateMap<EMP, EMPInfo>(); Mapper.Map<EMP, EMPInfo(src);, и он будет делать то же самое.

Преимущества для этого, как я сказал выше, три раза.

  1. Централизация ваших выражений отображения. В моем случае у меня обычно есть один класс MappingProfiles, который содержит все профили Mapping, которые я мог бы использовать. Эта практика помогает больше организовать ваш код, чем что-либо еще.
  2. Повторное использование. Где бы вы ни находились в своей программе, вам нужно использовать этот профиль сопоставления, который, вероятно, будет больше, чем просто одна строка CreateMap(), вы можете просто инициализировать этот профиль, а затем использовать его.
  3. Единичное тестирование.Загрузка в профилях делает модульное тестирование для AutoMapper очень простым. И модульное тестирование поможет вам точно определить, как отображать вложенные объекты.

Модульное тестирование AutoMapper

В Вашем проекте модульного тестирования (добавьте, если вы не имеете его, это шаблон проекта по умолчанию в Visual Studio), вы должны иметь класс, который содержит следующую единицу тест:

[TestMethod] 
public void AutoMapperConfigIsValid() 
{ 
    Mapper.Initialize(cfg => 
    { 
    cfg.AddProfile<MappingProfile>(); 
    // add all profiles you'll use in your project here 
    }); 
    Mapper.AssertConfigurationIsValid(); 
} 

Теперь, если бы я, чтобы запустить этот тест единицы с помощью классов вы изложенные выше и отображения профиля, который я ставлю выше, это даст мне ошибку:

Unmapped Properties: 
id 
EmpName 

Это не полная ошибка, а самая важная часть. Что происходит ... AutoMapper не может определить, где должны отображаться поля id и EmpName типа EMPInfo.

Для решения этой проблемы нам нужно добавить отображение для определенных членов в наш профиль. Наш профиль станет следующим:

CreateMap<Source.EMP, Target.EMPInfo>() 
    .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid)) 
    .ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name)); 

Мы добавим, что в ... снова запустите тест ... получите новую ошибку.

Add a custom mapping expression, ignore, add a custom resolver, or modify the destination type TestStuff.Target.EmpContact. 
Context: 
    Mapping from type TestStuff.Source.EmpContact to TestStuff.Target.EmpContact 
Exception of type 'AutoMapper.AutoMapperConfigurationException' was thrown. 

Это говорит о том, что нам нужно добавить карту для вложенных элементов объектов, которые мы сопоставляем.

Чтобы решить эту проблему, мы добавляем следующую карту в профиле отображения:

CreateMap<Source.EmpContact, Target.EmpContact>(); 

Теперь то, что вам нужно сделать здесь, и это является своего рода трудной, но необходимой, процесс, это продолжать работать, что тестирования конфигурации и устранения проблем, которые он дает вам, пока тест не завершится.

Когда все проблемы устранены, профиль отображения выглядит следующим образом:

public class MappingProfile : Profile 
{ 
    public MappingProfile() 
    { 
    CreateMap<Source.EMP, Target.EMPInfo>() 
     .ForMember(dest => dest.id, opt => opt.MapFrom(src => src.empid)) 
     .ForMember(dest => dest.EmpName, opt => opt.MapFrom(src => src.Name)); 

    CreateMap<Source.EmpContact, Target.EmpContact>(); 

    CreateMap<Source.EMPDetails, Target.EMPPerdata>() 
     .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name)); 

    CreateMap<Source.EmpAdd, Target.EmpAdressInfo>(); 
    } 
} 

Это отображение профиля отлично работает и будет отображать ваши два объекта штрафом.

Теперь эта карта, похоже, много работает для мелочи, но преимущества ее выполнения приходят со шкалой. Если вы когда-либо используете AutoMapper в большом проекте типа «Адаптер», код, структурированный таким образом, будет легче ориентироваться, читать и тестировать.

Надеюсь, это немного поможет. Извините, если я пошел слишком далеко в любой момент, но, надеюсь, этот ответ может помочь любому, кто пытается использовать AutoMapper.

Вы можете найти документацию на некоторые вещи я уже упоминал выше, в документации AutoMapper, а также: https://github.com/AutoMapper/AutoMapper/wiki/Configuration

0

вам нужно будет создавать карты для всех моделей

Mapper.CreateMap<EMP,EmpInfo>(); 
Mapper.CreateMap<EmpDetails,EMPPerdata>(); 
Mapper.CreateMap<EmpContact,EmpContact>(); 
Mapper.CreateMap<EmpAdd,EmpAdressInfo>(); 

затем:

Mapper.Map<Emp, EmpInfo>(someEmp); 
Смежные вопросы