2012-10-25 5 views
17

Ich habe etwas Code, der dem Folgenden ähnlich ist. Im Grunde bedeutet es, Daten von einem Web-Service zu erhalten und in client-seitige Objekte umzuwandeln.Konfigurieren AutoMapper auf konkrete Typen zuordnen, aber Schnittstellen in der Definition meiner Klasse

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

Das Problem, das ich habe ist, dass ich Interfaces in meinen Klassen (HasSomething.ISomething in diesem Fall) verwenden möchten, aber ich brauche AutoMapper Karte zu konkreten Typen haben. (Wenn ich den Plan nicht Typen auf Beton dann AutoMapper Proxies für mich erstellen, die anderen Probleme in meiner Anwendung verursacht..)

Der obige Code gibt mir diese Fehlermeldung:

Missing type map configuration or unsupported mapping.

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

Also meine Frage ist, wie kann ich auf einen konkreten Typ abbilden und trotzdem Schnittstellen in meiner Klasse verwenden?

HINWEIS: Ich habe versucht, das Hinzufügen dieser Abbildung:

Mapper.CreateMap<SomethingFromWebService, ISomething>(); 

Aber dann das Objekt zurückgegeben wird, ist nicht vom Typ Something es gibt einen generierte Proxy ISomething als Vorlage verwendet wird.

Antwort

28

Also dachte ich etwas, das zu funktionieren scheint.

Wenn ich diese beiden Abbildungen hinzufügen:

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

dann funktioniert es, wie ich will.

Ich konnte keine Dokumentation über die 'As' Methode finden (googeln Sie dafür! :), aber es scheint eine Mapping-Umleitung zu sein.

Beispiel: Für diese Zuordnung (ISomething) lösen Sie As eine Something.

+1

Dank dafür hat mir das sehr geholfen. Wenn ich mich nicht täusche, brauchen Sie nur das zweite Mapping. Ich denke, das zweite Mapping muss das erste überflüssig machen? –

+2

Nein, Sie benötigen immer noch das erste Mapping für den konkreten Typ, sonst würde AutoMapper nicht wissen, wie man von SomethingFromWebService zu etwas mappt. – TheWho

+1

Vielen Dank dafür! Ich kämpfe jetzt seit 2 Stunden, und es behebt mein Problem! – Speuline

Verwandte Themen