2012-09-18 16 views
5

Sono di fronte a un problema con AutoMapper 2.1.267.0 quando si lavora con oggetti contenenti raccolte di classi derivate. Ho isolato il mio problema in uno scenario più semplice con le seguenti classi:AutoMapper non funziona con la raccolta di classi derivate

public class ClassABase 
{ 
    public string Name { get; set; } 
} 

public class ClassA : ClassABase 
{ 
    public string Description { get; set; } 
} 

public class ClassBBase 
{ 
    public string Title { get; set; } 
} 

public class ClassB : ClassBBase 
{ 
    public string Text { get; set; } 
} 

public class ContainerA 
{ 
    public IList<ClassA> ClassAList { get; set; } 
    public ClassA ClassA { get; set; } 
} 

public class ContainerB 
{ 
    public IList<ClassB> ClassBList { get; set; } 
    public ClassB ClassB { get; set; } 
} 

e questi mapping

public class ClassABaseToClassBBase : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassABase, ClassBBase>() 
      .Include<ClassA, ClassB>() 
      .ForMember(dest => dest.Title, opt => opt.MapFrom(src => src.Name)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ClassAToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassA, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.MapFrom(src => src.Description)); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

public class ContainerAToContainerB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ContainerA, ContainerB>() 
      .ForMember(dest => dest.ClassBList, 
         opt => opt.MapFrom(src => Mapper.Map<IList<ClassA>, IList<ClassB>>(src.ClassAList))) 
      .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

    } 
} 

Ecco l'inizializzazione

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

e un diagramma che riassume tutto (Le frecce rosse rappresentano i mapping AutoMapper)

enter image description here

Ho mappato un'istanza ContainerA a ContainerB. Questo primo scenario funziona correttamente. L'oggetto di destinazione è completamente riempita, come mostrato nella immagine qui sotto:

enter image description here


Ma se aggiungo questa mappatura

public class ClassBBaseToClassB : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<ClassBBase, ClassB>() 
      .ForMember(dest => dest.Text, opt => opt.Ignore()); 

     Mapper.AssertConfigurationIsValid(); 
    } 
} 

Mapper.Initialize(x => 
    { 
     x.AddProfile<ClassABaseToClassBBase>(); 
     x.AddProfile<ClassAToClassB>(); 
     x.AddProfile<ClassBBaseToClassB>(); 
     x.AddProfile<ContainerAToContainerB>(); 
    }); 

enter image description here

il risultato è

enter image description here

Le proprietà "Testo" di tutti gli elementi dell'insieme diventano nulle. Come puoi vedere nell'immagine, la proprietà "Text" dell'oggetto container.B.ClassB è ancora mappata correttamente. Questo si verifica solo con le raccolte. Non so cosa sta succedendo. Qualche indizio?

Grazie

+0

quali risultati si aspetta? – Cybermaxs

+0

Mi aspettavo che tutti gli elementi di containerB.ClassBList venissero riempiti completamente, invece di avere proprietà nulle. – peflorencio

risposta

1

Hi,

tenta di modificare la mappatura tra i contenitori in questo modo:

public class ContainerAToContainerB : Profile 
    { 
     protected override void Configure() 
     { 
      CreateMap<ContainerA, ContainerB>() 
       .ForMember(dest => dest.ClassBList,opt=>opt.MapFrom(src=>src.ClassAList)) 
       .ForMember(dest => dest.ClassB, opt => opt.MapFrom(src => src.ClassA)); 

     } 
} 
Problemi correlati