2013-06-08 8 views
7

Ho due entità: Ordine & OrderDTO e sto usando automapper per mappare insieme.diverse regole di mappatura per gli stessi tipi di entità in automapper

Sulla base di alcune condizioni Voglio che questi soggetti siano mappato in modo diverso.

In effetti voglio due o più regole di mappatura diverse (CreateMap) per queste entità.

E quando si chiama la funzione Map, voglio dire al motore quale regola di mappatura usare.

Grazie a questa domanda: Using the instance version of CreateMap and Map with a WCF service? un approccio sta usando una diversa istanza di mapping in modo ciascuno può ha il proprio regole di mapping:

var configuration = new ConfigurationStore(new TypeMapFactory(), MapperRegistry.AllMappers()); 
var mapper = new MappingEngine(configuration); 
configuration.CreateMap<Dto.Ticket, Entities.Ticket>() 

Avete qualche soluzione migliore?

Come menzionato da Jimmy Bogard (Creatore di automapper) qui: Using Profiles in Automapper to map the same types with different logic:

È meglio la creazione di oggetti configurazione separata, e la creazione di un MappingEngine separato per ogni. La classe Mapper è semplicemente una facciata statica su ciascuno di questi, con una certa gestione del ciclo di vita.

Quale gestione del ciclo di vita è necessario eseguire?

+0

Sto cercando di capire la stessa cosa. Ho visto quella risposta ma non ho il modo in cui funziona. Spero che qualcuno possa aiutare. Saluti. – LeftyX

+0

@LeftyX: verifica la mia risposta. –

risposta

3

Ho finito per creare una nuova istanza di mapper e memorizzarli nella cache in un dizionario concorrente (statico) condiviso.

qui è il mio codice (vb.net):

mapper fabbrica:

Public Function CreateMapper() As IMapper Implements IMapperFactory.CreateMapper 
      Dim nestedConfig = New ConfigurationStore(New TypeMapFactory, MapperRegistry.Mappers) 
      Dim nestedMapper = New MappingEngine(nestedConfig) 
      Return New AutomapperMapper(nestedConfig, nestedMapper) 
End Function 

profili diversi per i diversi scenari:

Private Shared _mapperInstances As New Concurrent.ConcurrentDictionary(Of String, IMapper) 

Public Shared ReadOnly Property Profile(profileName As String) As IMapper 
      Get 
       Return _mapperInstances.GetOrAdd(profileName, Function() _mapperFactory.CreateMapper) 
      End Get 
End Property 

e la classe Mapper:

Friend Class AutomapperMapper 
     Implements IMapper 

     Private _configuration As ConfigurationStore 
     Private _mapper As MappingEngine 

     Public Sub New() 
      _configuration = AutoMapper.Mapper.Configuration 
      _mapper = AutoMapper.Mapper.Engine 
     End Sub 

     Public Sub New(configuration As ConfigurationStore, mapper As MappingEngine) 
      _configuration = configuration 
      _mapper = mapper 
     End Sub 

     Public Sub CreateMap(Of TSource, TDestination)() Implements IMapper.CreateMap 
      _configuration.CreateMap(Of TSource, TDestination)() 
     End Sub 

     Public Function Map(Of TSource, TDestination)(source As TSource, destination As TDestination) As TDestination Implements IMapper.Map 
      Return _mapper.Map(Of TSource, TDestination)(source, destination) 
     End Function 

     Public Function Map(Of TSource, TDestination)(source As TSource) As TDestination Implements IMapper.Map 
      Return _mapper.Map(Of TSource, TDestination)(source) 
     End Function 


    End Class 
1

I c Mi sono imbattuto nello stesso problema e ho riscontrato che AutoMapper è stato aggiornato a 4.2.0 un mese fa, che inizia con support instances mappers creato da diverse configurazioni e che le funzioni di mapping statico sono contrassegnate come obsolete. Quindi non abbiamo bisogno di implementare da soli da ora in poi!

+0

Grazie per l'avviso. Saluti. –