J'aime beaucoup de réponses, en particulier celle de @saineshwar. J'utilise .net Core 3.0 avec AutoMapper 9.0, donc je pense qu'il est temps de mettre à jour sa réponse.
Ce qui a fonctionné pour moi était dans Startup.ConfigureServices (...) enregistrez le service de cette manière:
services.AddAutoMapper(cfg => cfg.AddProfile<MappingProfile>(),
AppDomain.CurrentDomain.GetAssemblies());
Je pense que le reste de la réponse @saineshwar reste parfait. Mais si quelqu'un est intéressé, mon code de contrôleur est:
[HttpGet("{id}")]
public async Task<ActionResult> GetIic(int id)
{
// _context is a DB provider
var Iic = await _context.Find(id).ConfigureAwait(false);
if (Iic == null)
{
return NotFound();
}
var map = _mapper.Map<IicVM>(Iic);
return Ok(map);
}
Et ma classe de cartographie:
public class MappingProfile : Profile
{
public MappingProfile()
{
CreateMap<Iic, IicVM>()
.ForMember(dest => dest.DepartmentName, o => o.MapFrom(src => src.Department.Name))
.ForMember(dest => dest.PortfolioTypeName, o => o.MapFrom(src => src.PortfolioType.Name));
//.ReverseMap();
}
}
----- ÉDITER -----
Après avoir lu les documents liés dans les commentaires de Lucian Bargaoanu, je pense qu'il vaut mieux changer un peu cette réponse.
Le sans paramètre services.AddAutoMapper()
(qui avait la réponse @saineshwar) ne fonctionne plus (du moins pour moi). Mais si vous utilisez l'assembly NuGet AutoMapper.Extensions.Microsoft.DependencyInjection, le framework est capable d'inspecter toutes les classes qui étendent AutoMapper.Profile (comme la mienne, MappingProfile).
Donc, dans mon cas, lorsque la classe appartient au même assembly d'exécution, l'enregistrement du service peut être raccourci services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(une approche plus élégante pourrait être une extension sans paramètre avec ce codage).
Merci, Lucian!