2010-12-05 22 views
3

Je suis mappage de mes entités aux DTO, en utilisant AutoMapper. Certaines de mes entités ont des propriétés virtuelles qui peuvent être remplacées par des entités dérivées. Je mappe les propriétés virtuelles à l'aide des classes de base dans lesquelles elles sont définies. Toutefois, lors du mappage des classes dérivées, AutoMapper mappe l'implémentation de base des propriétés virtuelles au lieu de celle substituée.Comment mapper une propriété virtuelle sans mappage explicite pour chaque classe dérivée qui remplace la propriété à l'aide d'AutoMapper?

Je vais commencer par les définitions de classe:

public class BaseType 
{ 
    public virtual string Title 
    { 
     get { return string.Empty; } 
    }  
} 

public class DerivedType : BaseType 
{ 
    public override string Title 
    { 
     get { return Name; } 
    }  

    public string Name { get; set; } 
} 

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

public class DerivedTypeDto : BaseTypeDto 
{ 
    public string Name { get; set; }  
} 

Maintenant, pour la configuration de la cartographie:

CreateMap<BaseType, BaseTypeDto>() 
    .ForMember(n => n.Title, p => p.MapFrom(q => q.Title ?? "-")) 
    .Include<DerivedType, DerivedTypeDto>(); 

CreateMap<DerivedType, DerivedTypeDto>() 

Et enfin la mise en correspondance:

DerivedTypeDto dto = Mapper.Map<DerivedType, DerivedTypeDto>(instance); 

Quand je mets le titre mappage sur l'appel CreateMap qui configure le type dérivé, cela fonctionne. Mais comme j'ai environ 20 types dérivés, je veux vraiment que le mapping de titre soit configuré sur la classe de base, sans avoir à le répéter pour chaque classe dérivée.

Est-ce possible avec AutoMapper?

Répondre

1

Pourriez-vous ne pas utiliser l'option ConstructUsing()? Cela vous permettrait d'avoir un délégué à mapper à l'objet de classe de base tout le temps?

CreateMap<basetype, baseTypeDto>() 
    .ConstructUsing(y => base.title = basetype.title);