Mauro stai calmo Smile, questo test non passa…
[TestMethod]
[TestCategory( "EmitMapper" )]
public void EmitMapper_using_two_mappers_with_same_config_and_same_mapper_manager_should_not_use_one_config_instance()
{
     var manager = new ObjectMapperManager();
     var aMapper = manager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig()
     );
     var anotherMapper = manager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig()
     );
     var aCfg = aMapper.MapperImpl.MappingConfigurator;
     var anotherCfg = anotherMapper.MapperImpl.MappingConfigurator;
     var eq = aCfg.Equals( anotherCfg );
     var refEq = Object.ReferenceEquals( aCfg, anotherCfg );
     eq.Should().Be.False();
     refEq.Should().Be.False();
}
e che diamine… Smile with tongue out, come è possibile?
MapperImpl.MappingConfigurator è l’istanza di “DefaultMapConfig” che viene passata all’ObjectsMapperManager in fase di creazione del mapper, facciamo due “new” come è possibile che due mapper diversi abbiano la stessa configurazione?
La prima domanda che potreste fare è: perché mai dovrei aver bisogno di due mapper per gli stessi tipi ma distinti?
Domanda più che lecita, in effetti quell’esempio è semplicemente mirato a evidenziare il problema, lo scenario è quello di strategie di mapping diverse per lo stesso tipo in base al contesto, quindi stesso mapper ma configurazioni diverse. Potrei avere il mapper registrato in un container per IoC taggato in qualche modo per far si che se sono in back-office vengo restituito il mapper configurato per il back-office, mentre se sono in front-office venga restituito quello per il front-office.
Semplice… EmitMapper si prende la libertà di stabilire che la configurazione è strutturalmente uguale e quindi ricicla quella del primo mapper per il secondo. Ora il comportamento ci può anche stare, anche se visto che faccio esplicitamente una “new” il riciclo non dovrebbe proprio avvenire, ma se state pesantemente lavorando sull’estendere la configurazione e non è più che ben chiaro questo meccanismo semplicemente impazzite…maledetto lui Confused smile.
Parlerò ampiamente più avanti, e molto male per giunta, della presunta estendibilità di EmitMapper, sta di fatto che il riciclo viene fatto internamente in un modo talmente assurdo che non avete mezzo di metterci mano se non in due modi alquanto bizzarri:
[TestMethod]
[TestCategory( "EmitMapper" )]
public void EmitMapper_mapping_using_two_mappers_with_same_config_but_different_mapper_manager_should_not_use_one_config_instance()
{
     var aManager = new ObjectMapperManager();
     var aMapper = aManager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig()
     );
     var anotherManager = new ObjectMapperManager();
     var anotherMapper = anotherManager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig()
     );
     var aCfg = aMapper.MapperImpl.MappingConfigurator;
     var anotherCfg = anotherMapper.MapperImpl.MappingConfigurator;
     var eq = aCfg.Equals( anotherCfg );
     var refEq = Object.ReferenceEquals( aCfg, anotherCfg );
     eq.Should().Be.False();
     refEq.Should().Be.False();
}
Avere due ObjectsMapperManager, cosa totalmente insensata, oppure banalmente:
[TestMethod]
[TestCategory( "EmitMapper" )]
public void EmitMapper_mapping_using_two_mappers_with_same_config_and_different_name_but_same_mapper_manager_should_not_use_one_config_instance()
{
     var manager = new ObjectMapperManager();
     var aMapper = manager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig().SetConfigName( "aMapper-unique-name" )
     );
     var anotherMapper = manager.GetMapper<ReferencedType, ReferencedTypeDto>
     (
         new DefaultMapConfig().SetConfigName( "anotherMapper-unique-name" )
     );
     var aCfg = aMapper.MapperImpl.MappingConfigurator;
     var anotherCfg = anotherMapper.MapperImpl.MappingConfigurator;
     var eq = aCfg.Equals( anotherCfg );
     var refEq = Object.ReferenceEquals( aCfg, anotherCfg );
     eq.Should().Be.False();
     refEq.Should().Be.False();
}
Dare un nome univoco alla configurazione…
.m