Abbiamo introdotto le problematiche e lo scenario, ma non abbiamo parlato delle soluzione. Cominciamo con il vedere cosa vogliamo dal punto di vista del client:
mapperManager.GetMapper<SpecialCategory, SpecialCategoryDto>
(
     new MappingConfiguration()
         .OnListItemMapping<Category, CategoryDto>( e =>
         {
             if( e.Source is SpecialCategory )
             {
                 e.Destination = specialCategoryMapper.Map( ( SpecialCategory )e.Source );
                 e.Handled = true;
             }
         } )
         .OnListItemMapping<SpecialReferencedType>( e =>
         {
             e.Destination = specialReferencedTypeMapper.Map( ( SpecialReferencedType )e.Source );
             e.Handled = true;
         } )
         .DeepMap()
         .ConvertUsing<Category, Int32>( ei => ei == null ? -1 : ei.Id ) );
Vi ricordate lo scenario? bene, cosa risolviamo con la nostra configurazione? due possibili casistiche:
  • OnListItemMapping: ci permette di intercettare il processo di mapping in modalità wide-scoped, quindi devo esplicitare i tipi noti ad EmitMapper e non gli eventuali tipi derivati, degli elementi di una list esposta dal nostro modello e decidere se ci interessa prendere in carico il processo di mapping;
  • OnListItemMapping: ci permette di intercettare il processo di mapping in modalità narrow-scoped, quindi posso esplicitare un qualsiasi tipo e se l’item che si sta convertendo è di quel tipo specifico l’interceptor verrà invocato, degli elementi di una list esposta dal nostro modello e decidere se ci interessa prendere in carico il processo di mapping;
Non sto qui a dilungarmi su come sono state risolte le problematiche, i sorgenti sono su Radical e le cicche americane sprecate per combattere le idiosincrasie di EmitMapper sono veramente tante… Smile with tongue out
.m