2016-08-21 56 views
5

我有幾個共享映射代碼的ASP.Net應用程序,所以我創建了一個通用的automapper init類。如何在調用Initialize後在AutoMapper中添加映射?

但是,在我的一個應用程序中,我有一些特定的類要添加到配置中。

我有以下代碼:

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

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

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

如何添加這種獨特的映射,不破壞什麼已經被初始化?

回答

7

快速樣品,使您可以初始化AutoMapper 5.x的幾次...... 確定它不是很漂亮;)

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

的想法是,而不是存儲MapperConfiguration實例的MapperConfigurationExpression。

2

如果您使用AutoMapper提供的實例API而不是靜態API,則應該可以這樣做。 This wiki page詳細介紹了兩者之間的差異。的

本質,而不是再次調用AutoMapper.Mapper.Initialize(cfg => ...)爲您額外的映射,這將覆蓋與單一映射整個全球映射配置,則需要使用創建與實例API另一個映射對象:

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

中當然,爲了使用這個新的映射器,當使用其他映射配置映射對象時,您將不得不執行諸如var mappedModel = mapper.Map<CustomerInfoModel>(new CustomerModel());之類的操作。不管你的情況是否實用,我都不知道,但我相信這是做你需要的唯一方法。

0

你不能,但不是初始化你的Init方法中的映射,你可以讓它返回一個可以在Mapper.Initialize()調用中調用的函數。

所以,你的初始化方法是這樣的:

public static Action<IMapperConfigurationExpression> Init() 
{ 
    return (cfg) => { 
     ... A whole bunch of mappings here ... 
    }; 
} 
從您的應用程序

然後你想要額外的映射:

var mappingsFunc = MyClass.Init(); 

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

,或者你可以減少它一點點...

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

希望這會有所幫助。

0

Automapper 5+

我的主要組件,每個需要一個映射器裝配有一個初始化器類

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

然後

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