Derniers tips / Mémos
Modélise nativement « exactement l'un de ces types », avec un switch exhaustif vérifié par le compilateur.
Fin des state machines générées par le compilateur : moins d'allocations et des stack traces enfin lisibles.
Recherche sémantique directement dans SQL Server 2025, sans base vectorielle séparée, en LINQ typé.
Framework UI cross-platform pour .NET : Windows, macOS, Linux, iOS, Android et WebAssembly.
Découvrez les nouvelles APIs asynchrones pour la compression ZIP et les améliorations de performance dans .NET 10
AutoMapper : mapping automatique d'objets en .NET
AutoMapper simplifie la transformation d'objets en gérant automatiquement le mapping entre classes similaires.
Installation
dotnet add package AutoMapperConfiguration
Déclarez vos profils et enregistrez le mapper au démarrage pour une utilisation via injection de dépendances.
var config = new MapperConfiguration(cfg => {
cfg.AddProfile(new UserProfile());
});
IMapper mapper = config.CreateMapper();
services.AddSingleton(mapper);Configuration manuelle
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new UserProfile());
});
IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);Un profil simple
public class UserEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime BirthDate { get; set; }
}
public class UserDto
{
public int Id { get; set; }
// FullName: concatenation of FirstName + LastName
public string FullName { get; set; }
// Age: calculated from BirthDate
public int Age { get; set; }
}public class UserProfile : Profile
{
public UserProfile()
{
CreateMap<UserEntity, UserDto>()
.ForMember(dest => dest.FullName,
opt => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"))
.ForMember(dest => dest.Age,
opt => opt.MapFrom(src => DateTime.Today.Year - src.BirthDate.Year));
}
}Usage
var userEntity = new UserEntity { Id = 1, FirstName = "Jean", LastName = "Dupont", BirthDate = new DateTime(1990,5,20) };
UserDto dto = _mapper.Map<UserDto>(userEntity);
// dto.FullName == "Jean Dupont"
// dto.Age == (int)(...)
// dto.Id == 1Mapping bidirectionnel
CreateMap<UserDto, UserEntity>()
.ForMember(dest => dest.FirstName,
opt => opt.MapFrom(src => src.FullName.Split(' ')[0]))
.ForMember(dest => dest.LastName,
opt => opt.MapFrom(src => src.FullName.Split(' ')[1]));Note : si le format de FullName change, mets à jour les profils ou extrait la logique dans une méthode partagée.
Mapper des collections
Tu peux mapper des listes sans boucle explicite :
List<UserDto> dtos = _mapper.Map<List<UserDto>>(entities);