2016-08-21 13 views
5

Mam kilka aplikacji ASP.Net, które współużytkują kod odwzorowania, dlatego utworzyłem ogólną klasę init automapper.Jak mogę dodać mapowanie w AutoMapper po wywołaniu Initialize?

Jednak w jednej z moich aplikacji mam pewne określone klasy, które chcę dodać do konfiguracji.

Mam następujący kod:

public class AutoMapperMappings 
{ 
    public static void Init() 
    { 
     AutoMapper.Mapper.Initialize(cfg => 
     { 
      ... A whole bunch of mappings here ... 
     } 
    } 
} 

i

// Call into the global mapping class 
AutoMapperMappings.Init(); 

// This erases everything 
AutoMapper.Mapper.Initialize(cfg => cfg.CreateMap<CustomerModel, CustomerInfoModel>()); 

Jak mogę dodać ten wyjątkowy mapowanie bez niszczenia tego, co jest już zainicjowany?

Odpowiedz

7

Szybkie próbki, które pozwala zainicjować AutoMapper 5.x kilkakrotnie ... Ok to nie jest bardzo ładny;)

public static class MapperInitializer 
{ 
    /// <summary> 
    /// Initialize mapper 
    /// </summary> 
    public static void Init() 
    { 
     // Static mapper 
     Mapper.Initialize(Configuration); 

     // ...Or instance mapper 
     var mapperConfiguration = new MapperConfiguration(Configuration); 
     var mapper = mapperConfiguration.CreateMapper(); 
     // ... 
    } 

    /// <summary> 
    /// Mapper configuration 
    /// </summary> 
    public static MapperConfigurationExpression Configuration { get; } = new MapperConfigurationExpression(); 
} 

// First config 
MapperInitializer.Configuration.CreateMap(...); 
MapperInitializer.Init(); // or not 

//... 
MapperInitializer.Configuration.CreateMap(...); 
MapperInitializer.Init(); 

Chodzi o to, aby zapisać MapperConfigurationExpression zamiast instancji MapperConfiguration.

2

Powinno to być możliwe, jeśli użyjesz API instancji udostępnionego przez AutoMapper zamiast statycznego API. This wiki page wyszczególnia różnice między nimi.

Zasadniczo zamiast dzwonić AutoMapper.Mapper.Initialize(cfg => ...) ponownie za dodatkową mapowania, która nadpisuje cały konfigurację globalną odwzorowujący z tego jednego mapowania, musisz utworzyć inny obiekt odwzorowujący z instancją przy użyciu API:

var config = new MapperConfiguration(cfg => 
    cfg.CreateMap<CustomerModel, CustomerInfoModel>() 
); 
var mapper = config.CreateMapper(); 

Of Oczywiście, aby korzystać z tego nowego programu odwzorowującego, będziesz musiał zrobić coś takiego jak var mappedModel = mapper.Map<CustomerInfoModel>(new CustomerModel());, szczególnie podczas mapowania obiektów przy użyciu dodatkowej konfiguracji odwzorowania. Niezależnie od tego, czy jest to praktyczne w twoim przypadku, nie wiem, ale uważam, że jest to jedyny sposób na zrobienie tego, czego potrzebujesz.

0

Nie można, ale zamiast zainicjować odwzorowania z metody Init, można uzyskać to, aby zwróciła funkcję, która może być wywołana wewnątrz wywołania Mapper.Initialize().

Więc metoda Init wygląda następująco:

public static Action<IMapperConfigurationExpression> Init() 
{ 
    return (cfg) => { 
     ... A whole bunch of mappings here ... 
    }; 
} 

Następnie z aplikacji, gdzie chcesz dodatkowe mapowania:

var mappingsFunc = MyClass.Init(); 

Mapper.Initialize((cfg) => { 
    mappingsFunc(cfg); 
    ... Extra mappings here ... 
}); 

lub można je zmniejszyć trochę ...

Mapper.Initialize((cfg) => { 
    MyClass.Init()(cfg); 
    ... Extra mappings here ... 
}); 

Mam nadzieję, że to pomoże.

0

Automapper 5+

Mam klasy initialiser w moim głównym zespołem

public static class Mapping 
{ 
    public static void Initialize() 
    { 
     // Or marker types for assemblies: 
     Mapper.Initialize(cfg => 
      cfg.AddProfiles(new[] { 
       typeof(MapperFromImportedAssemblyA), 
       typeof(MapperFromImportedAssemblyB), 
       typeof(MapperFromImportedAssemblyC) 
      }) 
      ); 
    } 
} 

Następnie w każdym zespole, który wymaga Mapper

public class MapperFromImportedAssemblyA : Profile 
{ 
    public MapperFromImportedAssemblyA() 
    { 
     // Use CreateMap here (Profile methods are the same as configuration methods) 
    } 
} 
Powiązane problemy