2012-02-17 24 views
17

Próbuję użyć Automappera do odwzorowania obiektów, problem jest jednym z obiektów, które próbuję odwzorować, ma przedrostek "Cust_" przed wszystkimi jego właściwościami, a jeden nie. Czy istnieje sposób na wykonanie tego mapowania?AutoMapper z prefiksem

Na przykład, że mam

class A 
{ 
     String FirstName { get; set; } 
     String LastName { get; set; } 
} 

class B 
{ 
     String Cust_FirstName { get; set; } 
     String Cust_LastName { get; set; } 
} 

Oczywiście to mapa nie będzie działać

AutoMapper.Mapper.CreateMap<A, B>(); 
b = AutoMapper.Mapper.Map<A, B>(a); 

Odpowiedz

22
Mapper.Initialize(cfg => 
{ 
    cfg.RecognizeDestinationPrefixes("Cust_"); 
    cfg.CreateMap<A, B>(); 
}); 

A a = new A() {FirstName = "Cliff", LastName = "Mayson"}; 
B b = Mapper.Map<A, B>(a); 

//b.Cust_FirstName is "Cliff" 
//b.Cust_LastName is "Mayson" 

lub alternatywnie:

Mapper.Configuration.RecognizeDestinationPrefixes("Cust_"); 
Mapper.CreateMap<A, B>(); 
... 
B b = Mapper.Map<A, B>(a); 
... 
+2

Cheers obie metody działają idealnie. Chociaż obie metody nie wydają się być specyficzne dla rzeczywistej mapy od A do B, ale w rzeczywistości wpłyną na inne mapowania, powiedzmy od A do C –

+0

@CliffMayson, ale nie sądzę, że jest to problematyczne, szczególnie w przypadku, gdy masz wiele klasy docelowe zgodne z tą samą konwencją. W przypadku, gdy naprawdę potrzebujesz osobnych konfiguracji, np. Gdzie potrzebujesz mieć inną logikę do mapowania tych samych dwóch klas, zawsze możesz utworzyć dedykowany 'MappingEngine's z ich własnymi konfiguracjami. HTH. –

0

Dokumentacja zawiera artykuł na temat Recognizing pre/postfixes

Czasami właściwości źródłowe/docelowe będą miały wspólne przedrostki/postfiksy, które spowodują konieczność zrobienia wiązki niestandardowych mapowań członków, ponieważ nazwy nie pasują do siebie. Aby rozwiązać ten problem, można rozpoznać przed/postfixes:

public class Source { 
    public int frmValue { get; set; } 
    public int frmValue2 { get; set; } 
} 
public class Dest { 
    public int Value { get; set; } 
    public int Value2 { get; set; } 
} 
Mapper.Initialize(cfg => { 
    cfg.RecognizePrefix("frm"); 
    cfg.CreateMap<Source, Dest>(); 
}); 

Mapper.AssertConfigurationIsValid(); Domyślnie AutoMapper uznaje prefiks „Get”, jeśli trzeba usunąć przedrostek:

Mapper.Initialize(cfg => { 
    cfg.ClearPrefixes(); 
    cfg.RecognizePrefixes("tmp"); 
});