196 votes

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

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

Note : Le nom de la propriété "Name" de la classe Employee n'est pas le même que celui de la propriété "FullName" de la classe EmployeeDto.

Et voici le code pour mapper l'objet Employee en EmployeeDto :

Mapper.CreateMap(); // ligne de code (***)
EmployeeDto dto = Mapper.Map(employee); 

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

383voto

Thomas.Benz Points 662

Pas de problème, j'ai moi-même trouvé une solution:

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

19voto

ebol2000 Points 23

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()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

Ensuite, vous construiriez le mappeur en utilisant le mapConfig:

var mapper = mapConfig.CreateMapper();

8voto

Pranay DevOps Points 81

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

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

Support des attributs

AddMemberConfiguration().AddName(); * Actuellement toujours activé

Recherche les instances de SourceToDestinationMapperAttribute pour les propriétés/les champs et appelle la fonction user defined isMatch pour trouver les correspondances de membres.

MapToAttribute en est un qui fera correspondre la propriété en fonction du nom fourni.

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

4voto

Wild Bill Points 1

Le nouveau style de mappage d'attributs via les annotations de données :

https://docs.automapper.org/en/v8.1.0/Attribute-mapping.html?highlight=annotation

   [AutoMap(typeof(Order))]
   public class OrderDto {
      // Cela équivaut à un CreateMap() 

Pour mapper le membre

   [SourceMember(nameof(Order.OrderTotal))]
   public decimal Total { get; set; }

Si vous voulez un mappage inverse, ajoutez cette propriété à

   [AutoMap(typeof(Order), ReverseMap = true )]
   public class OrderDto {
      // Cela équivaut à un CreateMap().ReverseMap()

3voto

Shiva Brahma Points 19

Étant donné que nous avons deux classes

public class LookupDetailsBO
    {
        public int ID { get; set; }

        public string Description { get; set; }

    }

et l'autre classe est

public class MaterialBO
    {
        [MapTo(nameof(LookupDetailsBO.ID))]
        public int MaterialId { get; set; }

        [MapTo(nameof(LookupDetailsBO.Description))]
        public string MaterialName { get; set; }

        public int LanguageId { get; set; }
    }

De cette façon, vous savez généralement à quelle propriété vous vous référez. et vous assurez-vous de respecter la convention de nommage, donc si vous avez changé le nom de la propriété dans la source. Le MapTo() affichera une erreur

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X