2012-10-25 19 views
17

Mam trochę kodu podobnego do tego, co poniżej. Zasadniczo reprezentuje pobieranie danych z usługi WWW i przekształcanie ich w obiekty po stronie klienta.Skonfiguruj program AutoMapper, aby odwzorować konkretne typy, ale zezwól na interfejsy w definicji mojej klasy

void Main() 
{ 
    Mapper.CreateMap<SomethingFromWebService, Something>();  
    Mapper.CreateMap<HasSomethingFromWebService, HasSomething>(); 
    // Service side 
    var hasSomethingFromWeb = new HasSomethingFromWebService(); 
    hasSomethingFromWeb.Something = new SomethingFromWebService 
      { Name = "Whilly B. Goode" }; 
    // Client Side     
    HasSomething hasSomething=Mapper.Map<HasSomething>(hasSomethingFromWeb); 
}  
// Client side objects 
public interface ISomething 
{ 
    string Name {get; set;} 
}  
public class Something : ISomething 
{ 
    public string Name {get; set;} 
}  
public class HasSomething 
{ 
    public ISomething Something {get; set;} 
}  
// Server side objects 
public class SomethingFromWebService 
{ 
    public string Name {get; set;} 
}  
public class HasSomethingFromWebService 
{ 
    public SomethingFromWebService Something {get; set;} 
} 

Mam problem jest, że chcę używać interfejsów w moich zajęciach (HasSomething.ISomething w tym przypadku), ale muszę mieć mapę AutoMapper do konkretnych typów. (Jeśli nie mapować do konkretnych typów następnie AutoMapper stworzy proxy dla mnie to powoduje inne problemy w moim app.).

Powyższy kod daje mi ten błąd:

Missing type map configuration or unsupported mapping.

Mapping types: SomethingFromWebService -> ISomething
UserQuery+SomethingFromWebService -> UserQuery+ISomething

Więc moje pytanie jak mogę odwzorować konkretny typ i nadal korzystać z interfejsów w mojej klasie?

UWAGA: Próbowałem dodanie tego mapowania:

Mapper.CreateMap<SomethingFromWebService, ISomething>(); 

Ale wtedy obiekt nie jest zwrócony typu Something zwraca wygenerowany Proxy używając ISomething jako szablonu.

Odpowiedz

28

Więc wymyśliłem coś, co wydaje się działać.

Jeśli dodać te dwa mapowania:

Mapper.CreateMap<SomethingFromWebService, Something>(); 
Mapper.CreateMap<SomethingFromWebService, ISomething>().As<Something>(); 

to działa jak chcę.

Nie mogłem znaleźć żadnej dokumentacji dotyczącej metody "As" (spróbuj google'ować do tego! :), ale wygląda na to, że jest to przekierowanie mapowania.

Na przykład: dla tego odwzorowania (ISomething) rozwiąż go: As a Something.

+1

Dziękuję za to, bardzo mi to pomogło. O ile się nie mylę, potrzebujesz tylko drugiego mapowania. Sądzę, że drugie mapowanie musi uczynić pierwszego zbędnego? –

+2

Nie, nadal potrzebujesz pierwszego odwzorowania dla konkretnego typu, w przeciwnym razie AutoMapper nie wiedziałby, jak odwzorować coś z SomethingFromWebService na coś – TheWho

+1

Wielkie dzięki za to! Mam problemy przez 2 godziny i to rozwiązuje mój problem! – Speuline