2015-01-22 2 views
0

моих объекты структураУплотненное картирования с использованием automapper для сбора объекта

Class cls1 
{ 
    id, 
    name, 
    List<Address> address 
} 

Class cls2 
{ 
    prop1, 
    prop2, 
    street, 
    HouseNumber 
} 

Я хочу карту cls1 в cls2, где cls2.street должна карта с улицей собственностью Адрес объекта.

Когда я пытаюсь Mapper.CreateMap<cls1, cls2>().ForMember(gn => gn.Street, item => item.MapFrom(i => i.address. ...) это шоу как коллекция. как разрешить это сопоставление с помощью Automapper

ответ

0

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

Чтобы преодолеть это, сопоставьте один cls1 с несколькими cls2, введя денормализованный объект, который представляет адрес и его родительский cls1. Тогда отображение может быть от денормализованного представления до cls2.

public class Cls1AndAddress 
{ 
    public Cls1 Cls1; 
    public Address Address; 
} 

[Test] 
public void DenormalizationApproach() 
{ 
    AutoMapper.Mapper.CreateMap<Cls1AndAddress, Cls2>() 
     .ForMember(dest => dest.Prop1, opt => opt.MapFrom(src => src.Cls1.Name)) 
     .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Address.Street)) 
     .ForMember(dest => dest.HouseNumber, opt => opt.MapFrom(src => src.Address.HouseNumber)) 
     ; 

    var c1 = new Cls1 
    { 
     Addresses = new List<Address> 
     { 
      new Address {Street = "foo", HouseNumber = 1}, 
      new Address {Street = "bar", HouseNumber = 2}, 
     } 
    }; 

    var denormalized = c1.Addresses.Select(address => new Cls1AndAddress {Cls1 = c1, Address = address}); 

    var c2 = AutoMapper.Mapper.Map<IEnumerable<Cls1AndAddress>, IEnumerable<Cls2>>(denormalized); 

    var c2Array = c2.ToArray(); 
    Assert.AreEqual(2, c2Array.Length); 
    Assert.AreEqual("foo", c2Array[0].Street); 
    Assert.AreEqual("bar", c2Array[1].Street); 
} 

С другой стороны, если есть только один адрес в cls1, вы могли бы использовать более прямой путь взять на себя это в отображении:

[Test] 
public void AssumeSingleApproach() 
{ 
    AutoMapper.Mapper.CreateMap<Cls1, Cls2>() 
     .ForMember(dest => dest.Street, opt => opt.MapFrom(src => src.Addresses.Single().Street)) 
     .ForMember(dest => dest.HouseNumber, opt => opt.MapFrom(src => src.Addresses.Single().HouseNumber)) 
     ; 

    var c1 = new Cls1 
    { 
     Addresses = new List<Address> 
     { 
      new Address {Street = "foo", HouseNumber = 1}, 
      // new Address {Street = "bar", HouseNumber = 2}, This would cause failure 
     } 
    }; 

    var c2 = AutoMapper.Mapper.Map<Cls1, Cls2>(c1); 

    Assert.AreEqual(c2.Street, "foo"); 
} 
Смежные вопросы