Comment spécifier une règle de mappage lorsque les noms de propriétés diffèrent

144

Je suis un débutant dans le framework Automapper. J'ai une classe de domaine et une classe DTO comme suit:

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

Remarque: Le nom de la propriété " Nom " de la Employeeclasse n'est pas le même que celui de la propriété " FullName " de la EmployeeDtoclasse.

Et voici le code auquel mapper l' Employeeobjet EmployeeDto:

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

Ma question est la suivante: si je veux mapper Employee(classe source) vers EmployeeDto(classe de destination), comment puis-je spécifier la règle de mappage? En d'autres termes, comment dois-je faire plus avec la ligne de code (***) ci-dessus?

Thomas.Benz
la source

Réponses:

292

Qu'à cela ne tienne, j'ai moi-même trouvé une solution:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
Thomas.Benz
la source
1
Y a-t-il un moyen de le spécifier globalement pour n'importe quelle classe, quelque chose comme préfixe / suffixe? Par exemple, j'ai un tas de classes pour une bibliothèque qui ont chacune la propriété "Localisations". Et je veux les mapper à des classes où la propriété correspondante est appelée "LocalizedName". Ma seule option est-elle d'ajouter ForMember à chaque configuration de mappage?
NickAb
2
il n'y a pas de méthode CreateMap dans la classe Mapper :(
Navid_pdp11
3
@ Navid_pdp11 oui il y en a. Vous devez avoir le mappeur de classe statique pas une instance
Jordy van Eijk
@JordyvanEijk Quelle version utilisez-vous qui a une méthode statique "CreateMap"? Dans 5.1.1.0, il n'y a rien de tel
Matt Thomas
6
@MattThomas Après avoir jeté un coup d'œil au github de l'automapper, je vois qu'à partir de la version 5.0 CreateMap est obsolète et ils disent que vous devez utiliser MapperConfiguration ou Mapper.Initialize.
Jordy van Eijk
7

Juste pour intégrer les commentaires ci-dessus dans une approche mise à jour en utilisant Automapper 8.1 + ...

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

Ensuite, vous construirez le mappeur en utilisant mapConfig:

var mapper = mapConfig.CreateMapper();
ebol2000
la source
2

Nous pouvons également spécifier sur les attributs de classe pour le mappage

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

Prise en charge des attributs

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Actuellement, est toujours allumé

Recherche des instances de SourceToDestinationMapperAttribute pour Properties / Fields et appelle la fonction isMatch définie par l'utilisateur pour trouver des correspondances de membres.

MapToAttribute est l'un d'entre eux qui correspondra à la propriété en fonction du nom fourni.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}
Pranay DevOps
la source
Lorsque vous citez du contenu d'un autre endroit mot pour mot, veillez à utiliser la mise en forme des guillemets en bloc pour indiquer clairement aux lecteurs que le contenu est copié.
TylerH
Vérifiez le nouveau style :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu
Très nouveau pour stackoverflow. Sure suivra les règles @TylerH
Pranay DevOps