2014-06-23 3 views
9

Kann jemand empfehlen, wie bedingte Zuordnung in AutoMapper verwendet wird, um einen Wert im TARGET-Objekt von einem SOURCE-Objekt basierend auf einem vorhandenen TARGET-Eigenschaftswert zuzuordnen?C# AutoMapper Bedingtes Mapping basierend auf dem Zielwert

Also meine Quellenklasse ist:

public class UserDetails 
{ 
    public String Nickname { get; set; } 
} 

Meine Zielklasse ist:

public class ProfileViewModel 
{ 
    public Boolean NicknameIsVisible { get; set; 
    public String Nickname { get; set; } 
} 

ich den „Nickname“ Eigenschaftswert in dem TARGET setzen möge den „Nicknamen“ Eigenschaftswert übereinstimmen in der SOURCE nur, wenn die Zieleigenschaft "NicknameIsVisible" bereits auf TRUE gesetzt ist, ansonsten möchte ich den TARGET-Attributwert "Nickname" auf eine leere Zeichenfolge setzen.

Ich war so etwas wie dies versuchen (das wird nicht kompilieren) ...

Mapper.CreateMap<UserDetails, ProfileViewModel>() 
.ForMember(
      destination => destination.Nickname, 
      option => option. 
       .MapFrom(
        source => source.NicknameIsVisible ? 
        source.Nickname : 
        String.Empty) 
); 

aber „NicknameIsVisible“ ist keine Eigenschaft von meiner Quelle aber meiner TARGET.

BTW, Mein ProfileViewModel ist an drei Entitäten mit Owain Wragg Methode (http://consultingblogs.emc.com/owainwragg/archive/2010/12/22/automapper-mapping-from-multiple-objects.aspx) gebunden und es ist eine andere Entität, die den Wert der "NicknameIsVisible" -Eigenschaft gibt.

Bitte kann jemand vorschlagen die richtige Syntax für dieses Problem zu verwenden?

Antwort

2

devduder dem Beispiel verwenden ich jetzt den folgenden Code haben, die kompiliert:

.ForMember(
    destination => destination.Nickname, 
    option => 
    { 
     option.Condition(resolutionContext => 
      (resolutionContext.InstanceCache.First().Value as ProfileViewModel).NicknameIsVisible); 
     option.MapFrom(source => source.Nickname); 
    } 
); 

jedoch, obwohl es kompiliert und läuft durch sie nicht die destination.Nickname wird bevölkern mit etwas.

Edit: Ich hatte die Reihenfolge meiner Zuordnung zu ändern, um die Präferenzen Objekt

(die die Werte für die „NicknameIsVisible“ Eigenschaft hat zunächst abgebildet wurde, so wird der Wert zur Verfügung stand gegen testen!) so der Aufruf an meinem drei-Wege-Mapping war:

var profileViewModel = EntityMapper.Map<ProfileViewModel>(preferences, member, account); 

damit wird sichergestellt, dass das Vorlieben Objekt an das Ansichtsmodell erster kartiert wurde, dann die bedingte Mapping für das Konto Objekt könnte stattfinden, sobald die Werte festgelegt wurden.

Also das ist meine Lösung, aber ich kann meine eigene Antwort nicht abstimmen!

+0

Ich denke, es kann sein, weil die Eigenschaft nicht im Ziel festgelegt wurde, so kann es nicht verwendet werden. Ich werde wahrscheinlich meine Mapping-Reihenfolge ändern müssen, um das zu erreichen, was ich benötige. Ich werde mit meinen Ergebnissen zurückführen. – Dib

+1

Lassen Sie uns wissen, wie Sie gehen, würde mich interessieren, was Sie finden. – devduder

+0

Ok, werde ich tun. Hoffentlich werde ich heute Abend daran arbeiten. – Dib

14

Versuchen Sie folgendes:

Mapper.CreateMap<UserDetails, ProfileViewModel>() 
.ForMember(
     destination => destination.Nickname, 
     option => 
     { 
      option.Condition(rc => 
      { 
       var profileViewModel = (ProfileViewModel)rc.InstanceCache.First().Value; 
       return profileViewModel.NicknameIsVisible; 
      }); 

      option.MapFrom(source => source.Nickname); 
     } 
); 
+0

Vielen Dank. Ich werde das später versuchen und Sie wissen lassen. – Dib

+0

Ich bekomme Kompilierungsfehler mit Ihrem Beispiel. Ich habe es unten zu meiner Version unten geändert, um den Code zu kompilieren: – Dib