2016-07-05 65 views

risposta

62

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); 
+0

Grazie Will, chiedendo se è possibile consigliare come utilizzare il metodo .ForMember(), poiché non è possibile trovare la risposta esatta per le mie esigenze. – Sami

+4

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

+0

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. –

13

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))); 
     }); 
17

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

+0

Ottima e chiara spiegazione, grazie. –

+0

Più facile da capire. Grazie. – Najeeb

+1

Questo sembra il tutorial di Mosh da Pluralsight :-) – Casperonian