2016-08-21 40 views
5

Eşleme kodunu paylaşan birkaç ASP.Net uygulaması var, bu yüzden genel bir automapper init sınıfı oluşturdum.Initialize çağrıldıktan sonra AutoMapper'da bir haritalamayı nasıl ekleyebilirim?

Ancak, uygulamalarımdan birinde, yapılandırmaya eklenmesini istediğim belirli sınıflarım var.

Ben şu kod:

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

ve zaten başlatılmış ne yok etmeden bu eşsiz eşlemesi nasıl eklerim

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

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

?

cevap

7

Eğer AutoMapper 5.x birkaç kez başlatmayı sağlar Hızlı bir örnek ... Tamam çok güzel değil.

2

Bu, statik API yerine AutoMapper'ın sağladığı örnek API'yi kullanırsanız mümkün olabilir. This wiki page, ikisi arasındaki farkları detaylandırır.

Esasen yerine o tek haritalama ile tüm küresel mapper yapılandırmasını üzerine yazar sizin ek haritalama, yine AutoMapper.Mapper.Initialize(cfg => ...) çağırmak, kullanmakta örnek API ile başka mapper nesne oluşturmak gerekir: Of

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

Bu yeni mapper'i kullanabilmek için, ek eşleme yapılandırmanızı kullanarak nesneleri eşlerken özellikle var mappedModel = mapper.Map<CustomerInfoModel>(new CustomerModel()); gibi bir şey yapmanız gerekecektir. Sizin durumunuzda pratik olup olmadığını bilmiyorum, ama ihtiyacım olanı yapmanın tek yolu bu olduğuna inanıyorum.

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

fikri MapperConfiguration örneğinin yerine MapperConfigurationExpression saklamaktır);

0

Yapamazsınız, ancak Mapit'leri Init yönteminizden başlatmak yerine, bunu bir Mapper.Initialize() çağrısı içinde çağrılabilen bir işlev döndürmek için alabilirsiniz.

Yani, Init yöntemi şöyle görünür:

ekstra eşleştirmeleri istediğiniz uygulamasından sonra
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 ... 
}); 

veya bunu biraz azaltabilecek ...

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

Bu yardımcı olur umarım.

0

Automapper 5+

Bir Mapper gerektiren her mecliste

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

Sonra benim ana montaj bir Başlatıcı dersim var

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