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?

Thomas.Benz
quelle

Antworten:

292

Egal, ich selbst habe eine Lösung gefunden:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
Thomas.Benz
quelle
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();
ebol2000
quelle
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; }
}
Pranay DevOps
quelle
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
Überprüfen Sie den neuen Stil :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu
Sehr neu im Stackoverflow. Sicher wird die Regeln folgen @TylerH
Pranay DevOps