2010-07-26 18 views
5

J'ai un scénario dans lequel je souhaite ignorer certaines propriétés des classes définies dans la classe de base.Problème lié à l'ignorance de la propriété de classe de base dans les mappages de classes enfants à l'aide de Automapper

J'ai une cartographie initiale comme celui-ci

Mapper.CreateMap<Node, NodeDto>() 
       .Include<Place, PlaceDto>() 
       .Include<Asset, AssetDto>(); 

Je personnalisé plus comme celui-ci d'ignorer l'une des propriétés définies dans la classe de base NodeDto

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

Cependant lorsque je tente de la carte, Placez à PlaceDto ou Asset to AssetDto, la propriété ChildNodes n'est pas ignorée. Donc, je fini par faire soething comme celui-ci

Mapper.CreateMap<Node, NodeDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Place, PlaceDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 
      Mapper.CreateMap<Asset, AssetDto>() 
       .ForMember(dest => dest.ChildNodes, opt => opt.Ignore()); 

Depuis que j'ai beaucoup de classes d'enfants pour NodeDto, le processus ci-dessus est lourd, et je voudrais savoir s'il y a une meilleure approche?

Merci Nabeel

Répondre

2

désolé mais, non, il n'y a pas d'autre moyen, voilà comment automapper fonctionne

5

Il devient encore plus lourd si vous décidez alors que vous voulez ignorer non seulement 1, mais 2, 3 ou peut-être même plus de propriétés de la classe de base. Cela pourrait ne pas vous aider beaucoup dans ce cas et je suis sûr que vous avez probablement déjà trouvé une solution il y a neuf mois, mais pour le bénéfice de quelqu'un d'autre qui trébuche sur cette question, une méthode d'extension pourrait réduire la complexité.

public static class MappingExtensions 
    { 
     public static IMappingExpression<Node, NodeDto> MapNodeBase<Node, NodeDto>(
      this IMappingExpression<Node, NodeDto> mappingExpression) 
     { 
      // Add your additional automapper configuration here 
      return mappingExpression.ForMember(
       dest => dest.ChildNodes, 
       opt => opt.Ignore() 
      ); 
     } 
    } 

qui alors vous appelez ainsi:

Mapper.CreateMap<Node, NodeDto>() 
      .MapNodeBase() 
      .Include<Place, PlaceDto>() 
      .Include<Asset, AssetDto>(); 
2

Il y a une meilleure façon. Pour notre projet, nous avons créé le fichier mappings.xml avec la structure suivante.

<mappings> 
    <mapping name="EntityOne"> 
    <configuration name="Flat"> 
     <ignore name="ChildCollectionOne"/> 
     <ignore name="ChildCollectionTwo"/> 
     <ignore name="ChildCollectionThree"/> 
    </configuration> 
    <configuration name="Full"> 
     <include name="ChildCollectionOne" configuration="Flat" type="One"/> 
     <include name="ChildCollectionTwo" configuration="Flat" type="Two"/> 
     <include name="ChildCollectionThree" configuration="Flat" type="Three"/> 
    </configuration> 
    </mapping> 
</mappings> 

classe spéciale AutoMapperUtilis est utilisé pour l'analyse syntaxique xml sous forme de données et la configuration Automapper selon les règles données.

appel est:

AutoMapperUtil.Init(typeof(EntityOne),typeof(EntityOneDto), AutoMapperUtilLoadType.Flat); 

Après que toutes les applications nécessaires sont automatiquement chargés et ChildCollections spécifiés sont ignorés. Avec ces descriptions de mappages, nous pouvons choisir entre une configuration plate ou complète en fonction de notre cas d'utilisation. Nous utilisons AutoMapper pour le mappage entre les entités nHibernate et les Dto utilisées avec Ria Services, et nous sommes très satisfaits de cette solution.

+0

Exactement - ou utilisez des modèles T4 (intégrés à Visual Studio) –