Festlegen der Zuordnungsregel, wenn sich die Namen der Eigenschaften unterscheiden


144

Ich bin ein Neuling im Automapper-Framework. Ich habe eine Domänenklasse und eine DTO-Klasse wie folgt:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

Hinweis: Der Name der Eigenschaft " Name " der EmployeeKlasse stimmt nicht mit dem der Eigenschaft " FullName " der EmployeeDtoKlasse überein .

Und hier ist der Code, dem Sie das EmployeeObjekt zuordnen können EmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

Meine Frage lautet: Wenn ich Employee(Quellklasse) EmployeeDto(Zielklasse) zuordnen möchte , wie kann ich die Zuordnungsregel angeben? Mit anderen Worten, wie soll ich mit der obigen Codezeile (***) mehr tun?

Antworten:


292

Egal, ich selbst habe eine Lösung gefunden:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
Gibt es eine Möglichkeit, es global für eine Klasse anzugeben, so etwas wie ein Präfix / Suffix? Zum Beispiel habe ich eine Reihe von Klassen für eine Bibliothek, die jeweils die Eigenschaft "Lokalisierungen" haben. Und ich möchte sie Klassen zuordnen, in denen die entsprechende Eigenschaft "LocalizedName" heißt. Ist meine einzige Option, ForMember zu jeder Mapping-Konfiguration hinzuzufügen?
NickAb

2
Es gibt keine CreateMap-Methode in der Mapper-Klasse :(
Navid_pdp11

3
@ Navid_pdp11 ja das gibt es. Sie müssen die statische Klasse Mapper keine Instanz haben
Jordy van Eijk

@JordyvanEijk Welche Version verwenden Sie mit einer statischen "CreateMap" -Methode? In 5.1.1.0 gibt es so etwas nicht
Matt Thomas

6
@MattThomas Nachdem ich mir den Github von Automapper angesehen habe, sehe ich, dass CreateMap ab Version 5.0 veraltet ist und Sie die MapperConfiguration oder Mapper.Initialize verwenden müssen.
Jordy van Eijk

7

Nur um die obigen Kommentare in einen aktualisierten Ansatz mit Automapper 8.1 + ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

Dann würden Sie den Mapper mit der mapConfig erstellen:

var mapper = mapConfig.CreateMapper();

2

Wir können auch Klassenattribute für die Zuordnung angeben

Von https://docs.automapper.org/en/stable/Conventions.html#attribute-support

Attributunterstützung

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Derzeit ist immer eingeschaltet

Sucht nach Instanzen von SourceToDestinationMapperAttribute für Eigenschaften / Felder und ruft die benutzerdefinierte Funktion isMatch auf, um Übereinstimmungen mit Mitgliedern zu finden.

MapToAttribute ist eine davon, die anhand des angegebenen Namens mit der Eigenschaft übereinstimmt.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

Wenn Sie Inhalte von einem anderen Ort wörtlich zitieren, stellen Sie sicher, dass Sie die Blockzitatformatierung verwenden, um den Lesern klar zu machen, dass der Inhalt kopiert wird.
TylerH


Sehr neu im Stackoverflow. Sicher wird die Regeln folgen @TylerH
Pranay DevOps
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.