Aller au contenu principal

24-3 AutoMapper

Une librairie très populaire dans l'univers .NET est AutoMapper.

Cette librairie permet de faire automatiquement la tâche fastidieuse qu'on vient de faire manuellement, soit le mappage de deux objets similaires. Par objets similaires, on entend des objets qui ont des propriétés partagées.

À propos d'AutoMapper

Le mappage entre objets peut être une tâche répétitive et sujette aux erreurs, car il nécessite de copier des propriétés d'un objet à un autre. AutoMapper facilite cette opération en automatisant ce processus et en réduisant la quantité de code nécessaire pour accomplir cette tâche.

Voici quelques fonctionnalités offertes par AutoMapper:

  • Configuration: AutoMapper nécessite une configuration initiale pour comprendre comment mapper les objets. Cette configuration définit généralement les mappages entre les classes source et cible. On peut configurer les mappages en utilisant la méthode CreateMap<TSource, TDestination>().
  • Mappage: Une fois la configuration définie, on peut utiliser la méthode Map<TSource, TDestination>(source) pour mapper un objet source vers un objet cible. AutoMapper crée une instance de l'objet cible et copie les propriétés de l'objet source en fonction des règles définies dans la configuration.
  • Conversion: AutoMapper permet de définir des conversions personnalisées entre les types. Cela est utile lorsqu'on doit effectuer des transformations spécifiques sur les données avant de les mapper vers l'objet cible.
  • Résolution de propriétés: Parfois, les propriétés des objets source et cible ne correspondent pas directement. AutoMapper offre la possibilité de personnaliser la résolution des propriétés pour gérer ces cas.

Au final, AutoMapper améliore la lisibilité et la maintenabilité en réduisant la duplication et la complexité du code associé au mappage entre objets.

Installer AutoMapper

  1. À partir de Snowfall.Web.Api -> Clic droit sur le projet -> Manage NuGet Packages
  2. Faire une recherche pour AutoMapper
  3. Installer la librairie dans le projet Snowfall.Web.Api Imgur ::: Votre numéro de version sera différent de la capture d'écran :::

Configurer AutoMapper

La seconde étape consiste à configurer AutoMapper et indiquer à la librairie les objets pour lesquels nous voulons procéder à un mappage.

  1. Sous le projet Snowfall.Web.Api, Clic droit sur le projet -> Add -> Directory
  2. Nommez le répertoire Configurations
  3. Sous le répertoire Snowfall.Web.Api/Configurations. Clic droit -> Add -> Class/Interface
  4. Nommez la classe AutoMapperConfig
    Snowfall.Web.Api/Configurations/AutoMapperConfig.cs
    namespace Snowfall.Web.Api.Configurations;

    public class AutoMapperConfig
    {

    }

Concept de Profile

Il est techniquement possible de définir plusieurs configurations de mappage et c'est le concept de Profile de AutoMapper. Dans notre cas, nous ne créerons qu'un seul profil.

Tout de même, la classe doit hériter de la classe Profile.

//hgihlight-next-line
public class AutoMapperConfig : Profile
{

}

Créer la fonction de mappage

On définit ensuite dans le constructeur de la classe nos règles de mappage.

Dans le cas qui nous occupe, on veut mapper un Evenement à un EvenementDto:

public class AutoMapperConfig : Profile
{
public AutoMapperConfig()
{
CreateMap<Evenement, EvenementDto>();
}
}
info

La fonction CreateMap indique le mappage à effectuer et la direction. Le premier paramètre est la source (Evenement) et le deuxième la cible (EvenementDto).

Le mappage est unidirectionnel. Ainsi, on fait le mappage avec cette définition d'un Evenement vers un EvenementDto. L'inverse n'est pas possible dans cette formule.

Effectuer un mappage bidirectionnel

Pour effectuer un mappage bidirectionnel (supporté dans les deux sens), on peut définir le mappage dans le sens inverse de cette façon:

public class AutoMapperConfig : Profile
{
public AutoMapperConfig()
{
CreateMap<Evenement, EvenementDto>();
CreateMap<EvenementDto, Evenement>();
}
}

Cependant, c'est assez redondant! C'est pourquoi AutoMapper offre un raccourci pour cette situation:

public class AutoMapperConfig : Profile
{
public AutoMapperConfig()
{
CreateMap<Evenement, EvenementDto>().ReverseMap();
}
}
astuce

L'utilisation de ReverseMap() indique que le mappage peut être fait dans les 2 directions:

  • Evenement vers EvenementDto
  • EvenementDto vers Evenement

Ajouter AutoMapper aux Services

Vous commencez à avoir l'habitude, on ajoute AutoMapper aux services de l'application pour qu'il soit disponbile pour l'injection de dépendances!

Snowfall.Web.Api/Program.cs
//...

// AutoMapper
builder.Services.AddAutoMapper(typeof(AutoMapperConfig));

//...

Utiliser AutoMapper

Pour utiliser AutoMapper, dans un contrôleur par exemple, on doit injecter la dépendance via le contrôleur.

On peut injecter le mapper de AutoMapper via IMapper:

Snowfall.Web.Api/Controllers/EvenementsController.cs
public class EvenementsController : ControllerBase
{
private readonly IEvenementService _evenementService;
private readonly IMapper _mapper;

public EvenementsController(
IEvenementService evenementService,
IMapper mapper)
{
_evenementService = evenementService;
_mapper = mapper;
}

//...

Finalement, on map un objet de la façon suivante:

Snowfall.Web.Api/Controllers/EvenementsController.cs
// GET /api/evenements
[HttpGet]
public async Task<IActionResult> Index()
{
List<Evenement> evenements = await _evenementService.GetAll();

List<EvenementDto> evenementDtos = _mapper.Map<List<EvenementDto>>(evenements);

return Ok(evenementDtos);
}

Imgur

info

On a demandé de convertir evenements en une liste de EvenementDto et le mappage se fait automatiquement.

À noter que le nom des propriétés doit être identique pour que le tout fonctionne, autrement on doit définir des règles particulières.

Il n'est évidemment pas obligatoire d'avoir une correspondance 1:1 entre les objets, seules les propriétés conjointes seront renseignées.

Voilà, L'API retourne maintenant une liste de EvenementDto!

astuce

À noter qu'on pourrait utiliser le même concept dans le projet Mvc lorsqu'on crée un ViewModel à partir d'un Model et vice versa.

Imgur