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.
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
- À partir de
Snowfall.Web.Api
->Clic droit
sur le projet ->Manage NuGet Packages
- Faire une recherche pour
AutoMapper
- Installer la librairie dans le projet
Snowfall.Web.Api
::: 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.
- Sous le projet
Snowfall.Web.Api
,Clic droit
sur le projet ->Add
-> Directory - Nommez le répertoire
Configurations
- Sous le répertoire
Snowfall.Web.Api/Configurations
.Clic droit
->Add
->Class/Interface
- Nommez la classe
AutoMapperConfig
Snowfall.Web.Api/Configurations/AutoMapperConfig.csnamespace 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>();
}
}
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();
}
}
L'utilisation de ReverseMap()
indique que le mappage peut être fait dans les 2 directions:
Evenement
versEvenementDto
EvenementDto
versEvenement
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!
//...
// 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
:
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:
// 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);
}
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
!
À 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.