Mi piacciono molte risposte, in particolare quella di @saineshwar. Sto usando .net Core 3.0 con AutoMapper 9.0, quindi sento che è ora di aggiornare la sua risposta.
Ciò che ha funzionato per me è stato in Startup.ConfigureServices (...) registrare il servizio in questo modo:
services.AddAutoMapper(cfg => cfg.AddProfile<MappingProfile>(),
AppDomain.CurrentDomain.GetAssemblies());
Penso che il resto della risposta di @saineshwar sia perfetto. Ma se qualcuno è interessato il mio codice controller è:
[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);
}
E la mia classe di mappatura:
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();
}
}
----- MODIFICARE -----
Dopo aver letto i documenti collegati nei commenti di Lucian Bargaoanu, penso che sia meglio cambiare un po 'questa risposta.
Il parametro senza parametri services.AddAutoMapper()
(con la risposta @saineshwar) non funziona più (almeno per me). Ma se si utilizza l'assemblaggio NuGet AutoMapper.Extensions.Microsoft.DependencyInjection, il framework è in grado di ispezionare tutte le classi che estendono AutoMapper.Profile (come il mio, MappingProfile).
Quindi, nel mio caso, in cui la classe appartiene allo stesso assembly in esecuzione, la registrazione del servizio può essere abbreviata in services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(Un approccio più elegante potrebbe essere un'estensione senza parametri con questa codifica).
Grazie, Lucian!