2016-11-23 7 views
3

meine aktuelle Aufgabe muss auf die Zuordnung zwischen verschiedenen Objekttypen achten und so erkannte ich die sehr schöne AutoMapper-Bibliothek.AutoMapper: Mapping Objekte mit Interface-Eigenschaften

Bisher einfach zu handhaben, aber diese verschiedenen Objekte enthalten komplexe Eigenschaften des Schnittstellentyps. Lassen Sie mich Ihnen ein Code-Snippet:

public inferface IInterface 
{ 
    string TextProperty { get; set;} 
} 

public class A : IInterface 
{ 
    string TextProperty { get; set; } 
} 

public class B : IInterface 
{ 
    string TextProperty { get; set; } 
} 


public inferface IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

public class ComplexA : IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

public class ComplexB : IComplexInterface 
{ 
    IInterface ComplexProperty { get; set; } 
} 

In meinem Fall ist es möglich, dass Klasse A Klasse zugeordnet ist B und umgekehrt.
Mapping von Typ A-B ist kein Problem von CreateMap<A, B>();
Mapping von Klasse ComplexA Klasse ComplexB löst eine Ausnahme konfigurieren:

Fehler-Mapping-Typen.

Mapping-Typen:

  • complexa -> ComplexB
  • NamespaceOfComplexA.ComplexA -> NamespaceOfComplexB.ComplexB

Typ Map-Konfiguration:

  • complexa -> ComplexB
  • NamespaceOfComplexA.ComplexA -> NamespaceOfComplexB.ComplexB

Eigentum:

  • ComplexProperty

Eine mögliche Lösung, die ich auf Stackoverflow bereits hier könnte eine Konfiguration wie folgt:

CreateMap<A, IInterface>().As<B>(); 
CreateMap<B, IInterface>().As<A>(); 

Aber in meinem Fall ist es nicht wor König.

Irgendwelche Vorschläge?

Antwort

0

Jetzt habe ich eine Lösung gefunden, die für mich funktioniert.

Ich benutze AutoMapper mit einem nicht generischen Ansatz und so konfigurieren ich über:

CreateMap(typeof(ComplexA), typeof(ComplexB)) 

Um Objekte mit komplexen Typen wie Schnittstellen zu betrachten oder auch abstrakte Klassen ist es möglich, eine eigene ValueResolver zu schreiben, die implementieren hat Schnittstelle:

IValueResolver<object, object, object> 

mit folgenden Methode:

public object Resolve(object source, object destination, object destMember, ResolutionContext context) 
{ 
//... 
} 

Um die Eigenschaften von Schnittstellen/abstrakten Klassen aufzulösen, können Sie Ihre Typen konfigurieren, indem Sie die Konfiguration mit der Methode ForMember (...) Und einen conrete ValueResolver für die bestimmte Eigenschaft wie folgt definieren:

CreateMap(typeof(ComplexA), typeof(ComplexB)).ForMember("ComplexProperty", x => x.ResolveUsing(new ValueResolver(/*...*/))); 

In meinem Fall war es die Lösung, die die Schnittstelle Eigenschaft auf eine konkrete Umsetzung meiner Klassendefinitionen abzubilden.

Ich hoffe, es ist nützlich.