Questa potrebbe essere una domanda di base, ma mi chiedo se non ottengo il metodo AutoMapper.Mapper.CreateMap.AutoMapper.Mapper non contiene la definizione per CreateMap
Am I usando sbagliato riferimento automapper/pacchetto? Grazie
Questa potrebbe essere una domanda di base, ma mi chiedo se non ottengo il metodo AutoMapper.Mapper.CreateMap.AutoMapper.Mapper non contiene la definizione per CreateMap
Am I usando sbagliato riferimento automapper/pacchetto? Grazie
La versione statica del metodo CreateMap
era obsoleta in 4.2, quindi rimossa dall'API nella versione 5.0. Jimmy Bogard ne parla in modo più dettagliato in this blog post.
La nuova tecnica per la mappatura non è statica, come questo (il codice è dal post):
var config = new MapperConfiguration(cfg => {
cfg.CreateMap<Source, Dest>();
});
IMapper mapper = config.CreateMapper();
var source = new Source();
var dest = mapper.Map<Source, Dest>(source);
Ecco come funziona la società:
Mapper.Initialize(cfg =>
{
cfg.CreateMap<SupervisorEmployee, SupervisorViewModel>()
.ForMember
(dst => dst.Name, src => src.MapFrom<string>(e => SupervisorViewModel.MapName(e)))
.ForMember
(dst => dst.OfficePhone, src => src.MapFrom<string>(e => e.OfficePhone.FormatPhone(e.OfficePhoneIsForeign)))
.ForMember
(dst => dst.HomePhone, src => src.MapFrom<string>(e => e.HomePhone.FormatPhone(e.HomePhoneIsForeign)))
.ForMember
(dst => dst.MobilePhone, src => src.MapFrom<string>(e => e.MobilePhone.FormatPhone(e.MobilePhoneIsForeign)));
});
Ecco come ho usato AutoMapper nel mio codice.
Fase 1: scaricati automapper attraverso Nuget-packages.
versione è
<package id="AutoMapper" version="6.1.1" targetFramework="net452" />
Fase 1: Creato DTO classe
public class NotificationDTO
{
public DateTime DateTime { get; private set; }
public NotificationType Type { get; private set; }
public DateTime? OriginalDateTime { get; private set; }
public string OriginalVenue { get; private set; }
public ConcertDTO Concert { get; set; }
}
public class ConcertDTO
{
public int Id { get; set; }
public bool IsCancelled { get; private set; }
public DateTime DateTime { get; set; }
public string Venue { get; set; }
}
Fase 2: ha creato una classeAutoMapperProfile che eredita da Profilo
using AutoMapper;
using ConcertHub.DTOs;
namespace ConcertHub.Models
{
public class AutoMapperProfile : Profile
{
public AutoMapperProfile()
{
CreateMap<Concert, ConcertDTO>();
CreateMap<Notification, NotificationDTO>();
}
}
}
Fase 3: Registrato AutoMapperProfile nel metodo di applicazione Inizio Global.asax file di
protected void Application_Start()
{
AutoMapper.Mapper.Initialize(cfg => cfg.AddProfile<AutoMapperProfile>());
}
Infine il pezzo magia di codice nel controller Api
public IEnumerable<NotificationDTO> GetNewNotification()
{
var userId = User.Identity.GetUserId();
var notifications = _dbContext.UserNotifications
.Where(un => un.UserId == userId && !un.IsRead)
.Select(un => un.Notification)
.Include(n => n.Concert)
.ProjectTo<NotificationDTO>()//use Automapper.QueryableExtension namespace
.ToList();
return notifications;
}
spero che aiuta
Ottima e chiara spiegazione, grazie. –
Più facile da capire. Grazie. – Najeeb
Questo sembra il tutorial di Mosh da Pluralsight :-) – Casperonian
Grazie Will, chiedendo se è possibile consigliare come utilizzare il metodo .ForMember(), poiché non è possibile trovare la risposta esatta per le mie esigenze. – Sami
Grazie ho trovato la via come segue: potrebbe essere utile per gli altri var configStack = new MapperConfiguration ( cfg => {cfg.CreateMap(). ForMember (dest => dest.stackId, opts => opts.MapFrom (src => src.itemId));} ); –
Sami
Ho lo stesso problema, ho provato come mi hai suggerito ma mi dà un errore 'Non è stato possibile trovare il tipo o il nome dello spazio dei nomi 'MapperConfiguration' (ti manca una direttiva using o un riferimento di assembly?)' E anche lo stesso per ' IMapper' Puoi aiutarmi per favore. –