6

Sto pianificando di utilizzare Automapper con la soluzione ASP.NET MVC e Unity DI. Il video pubblicato su automapper su come utilizzare è molto vecchio e non mostra come il mapper può essere usato con l'iniezione di dipendenza. La maggior parte degli esempi su stackoverflow utilizza anche il metodo Mapper.CreateMap() che ora è deprecato.Come utilizzare Automapper con l'unità dependency injection?

La guida automapper dice

Una volta che avete i vostri tipi è possibile creare una mappa per i due tipi utilizzando un'istanza MapperConfiguration e CreateMap. È necessaria solo un'istanza MapperConfiguration in genere per AppDomain e dovrebbe essere creata durante l'avvio.

var config = new MapperConfiguration(cfg => cfg.CreateMap<Order, OrderDto>()); 

quindi presumo sopra riga di codice andrà in avvio dell'applicazione, come global.asax

Per eseguire una mappatura, creare un IMapper utilizzare il metodo CreateMapper.

var mapper = config.CreateMapper(); 
OrderDto dto = mapper.Map<OrderDto>(order); 

La riga precedente entrerà nel controller. Tuttavia non sto capendo da dove proviene questa variabile config? Come faccio ad iniettare IMapper nel controller?

+0

È necessario configurare il contenitore per mappare tra "IMapper" e l'istanza del programma di analisi. Quindi dovresti dichiarare una dipendenza su 'IMapper' dal controller (accettando un' IMapper' nel costruttore). –

+0

alcun esempio? Quindi ci sarà 'new MapperConfiguration() 'per ogni entità che ho bisogno di mappare? L'esempio sarebbe davvero di aiuto – LP13

risposta

11

In primo luogo, creare una MapperConfiguration e da esso un IMapper che ha tutti i tipi di configurati in questo modo:

var config = new MapperConfiguration(cfg => 
{ 
    //Create all maps here 
    cfg.CreateMap<Order, OrderDto>(); 

    cfg.CreateMap<MyHappyEntity, MyHappyEntityDto>(); 

    //... 
}); 

IMapper mapper = config.CreateMapper(); 

Poi, registrare l'istanza mapper con il contenitore di unità in questo modo:

container.RegisterInstance(mapper); 

Quindi, qualsiasi controller (o servizio) che desideri utilizzare il programma di mappatura può dichiarare tale dipendenza dal costruttore in questo modo:

public class MyHappyController 
{ 
    private readonly IMapper mapper; 

    public MyHappyController(IMapper mapper) 
    { 
     this.mapper = mapper; 
    } 

    //Use the mapper field in your methods 
} 

Supponendo di aver impostato correttamente il contenitore con il framework MVC, il controllore dovrebbe essere costruibile senza problemi.