2011-06-02 11 views
8

Estoy intentando usar automapper para crear un solo mapa para un objeto principal y reutilizarlo entre sus elementos secundarios.Herencia de Automapper: reutilización de mapas

Para propiedades secundarias solo quiero asignar los campos adicionales.

¿Esto es posible? El código que tengo se ve así

CreateCalculationMap(message); ---- This does the BASE parent mappping. 
    Mapper.CreateMap<QuoteMessage, CalculationGipMessage>()      -- This is the child. 
     .Include<QuoteMessage, CalculationBase>()        -- Include the parent? 
     .ForMember(a => a.OngoingCommission, b => b.MapFrom(c => c.OngoingASF)) - Child 
     .ForMember(a => a.SpecialRate, b => b.MapFrom(c => c.BlahBlah)));  - Child 

¿Por qué me sigue diciendo que las propiedades de los padres no están mapeadas? Sin embargo, pensé que los incluí en CreateCalculationMap (mensaje); que contiene

Mapper.CreateMap<QuoteMessage, CalculationBase>()() 

Respuesta

6

FYI me di cuenta de esto

public static IMappingExpression<A, T> ApplyBaseQuoteMapping<A, T>(this IMappingExpression<A, T> iMappingExpression) 
     where A : QuoteMessage 
     where T : CalculationGipMessage 
    { 
     iMappingExpression 
      .ForMember(a => a.LoginUserName, b=> b.MapFrom(c => c.LoginUserName)) 
      .ForMember(a => a.AssetTestExempt, b => b.Ignore()) 
      ; 

     return iMappingExpression; 
    } 


Mapper.CreateMap<QuoteMessage, CalculationGipMessageChild>() 
      .ApplyBaseQuoteMappingToOldCol() 
      // do other mappings here 
0

No se puede hacer esto. No creo que deba tener las asignaciones juntas. Esto en realidad podría ser un error ya que el wiki afirma que se puede hacer; sin embargo, el ejemplo que se da es simplemente confiar en el nombre de las propiedades para hacer el mapeo, no en el bit de inclusión. Al menos así es como lo entiendo.

Si mira http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays y cambia el nombre de las propiedades en el Origen y el Dest (les hago el Valor 3 y el Valor 4 para realmente mezclar cosas), entonces agregue explícitamente sus asignaciones.

Mapper.CreateMap<ChildSource, ChildDestination>() 
      .ForMember(x => x.Value4, o => o.MapFrom(y => y.Value2)); 
     Mapper.CreateMap<ParentSource, ParentDestination>() 
      .Include<ChildSource, ChildDestination>() 
      .ForMember(x => x.Value3, o => o.MapFrom(y => y.Value1)); 

Parece que falla.

 ChildSource s = new ChildSource() 
     { 
      Value2 = 1, 
      Value1 = 3 
     }; 

     var c = s.MapTo<ChildDestination>(); 
     var c2 = s.MapTo<ParentDestination>(); 

     Assert.AreEqual(c.Value3, s.Value1); 
     Assert.AreEqual(c.Value4, s.Value2); 
     Assert.AreEqual(c2.Value3, s.Value1); 
     Assert.AreEqual(c.Value4, s.Value2); 

Otras Notas

También el incluir las necesidades de ser no el niño al padre. El prototipo de hecho afirma este

public IMappingExpression<TSource, TDestination> Include<TOtherSource, TOtherDestination>() 
     where TOtherSource : TSource 
     where TOtherDestination : TDestination 

De lo que he leído debe crear su asignación niño primero, a pesar de que podría haber sido una cuestión de edad.

Mapper.CreateMap<ChildSource, ChildDest>(); 

Luego, su padre

Mapper.CreateMap<ParentSource, Parent Dest>() 
     .Include<ChildSource, ChildDest>(); 

Procedente de http://automapper.codeplex.com/wikipage?title=Lists%20and%20Arrays