2010-07-26 17 views
5

Ho uno scenario in cui vorrei ignorare alcune proprietà delle classi definite nella classe base.Problema con l'ignoranza della proprietà della classe di base nelle mappature delle classi child utilizzando Automapper

Ho una prima mappatura del genere

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

Poi ho adattato più come questo per ignorare una delle proprietà definito nella classe base NodeDto

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

Tuttavia quando provo a tracciare, Da Place to PlaceDto o Asset a AssetDto, la proprietà ChildNodes non viene ignorata. Così ho finito per fare soething come questo

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()); 

Dal momento che ho un sacco di classi figlie per NodeDto, il processo di cui sopra è ingombrante, e vorrei sapere se v'è un approccio migliore?

Grazie Nabeel

risposta

2

dispiace ma, no, non c'è altro modo, è così che automapper funziona

5

diventa ancora più pesante se si decide poi che si desidera ignorare non solo 1, ma 2, 3 o forse ancora più proprietà dalla classe base. Potrebbe non aiutarti molto in questo caso e sono sicuro che per 9 mesi probabilmente hai già trovato una soluzione, ma a beneficio di chiunque altro inciampi in questa domanda un metodo di estensione potrebbe ridurre parte della complessità.

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() 
      ); 
     } 
    } 

Che si quindi chiamare così:

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

C'è un modo migliore. Per il nostro progetto abbiamo creato il file mappings.xml con la seguente struttura.

<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> 

Categoria speciale AutoMapperUtilis viene utilizzata per l'analisi sotto forma di dati XML e la configurazione Automapper secondo le regole.

Call è:

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

Dopo che i mapping di tutto richiesti vengono caricati automaticamente, e ChildCollections specificati vengono ignorati.

Con queste descrizioni di mapping è possibile scegliere tra la configurazione Flat o Full a seconda del nostro Use Case. Utilizziamo AutoMapper per la mappatura tra le entità nHibernate e Dto`s utilizzate con i servizi Ria e siamo molto contenti di questa soluzione.

+0

Esattamente - o utilizzare i modelli T4 (integrati in Visual Studio) –

Problemi correlati