2016-02-05 18 views
11

Sto aggiornando un mio progetto per utilizzare AutoMapper 4.2 e sto eseguendo delle modifiche. Mentre I sembra aver risolto detti cambiamenti, non sono completamente convinto di averlo fatto nel modo più appropriato.AutoMapper 4.2 e Ninject 3.2

Nel vecchio codice, ho una classe NinjectConfiguration e una classe AutoMapperConfiguration caricate da WebActivator. Nella nuova versione del AutoMapperConfiguration gocce fuori e io invece un esempio MapperConfiguration direttamente nella classe NinjectConfiguration in cui le associazioni stanno accadendo, in questo modo:

private static void RegisterServices(
    IKernel kernel) { 
    var profiles = AssemblyHelper.GetTypesInheriting<Profile>(Assembly.Load("???.Mappings")).Select(Activator.CreateInstance).Cast<Profile>(); 
    var config = new MapperConfiguration(
     c => { 
      foreach (var profile in profiles) { 
       c.AddProfile(profile); 
      } 
     }); 

    kernel.Bind<MapperConfiguration>().ToMethod(
     c => 
      config).InSingletonScope(); 

    kernel.Bind<IMapper>().ToMethod(
     c => 
      config.CreateMapper()).InRequestScope(); 

    RegisterModules(kernel); 
} 

Quindi, è questo il modo appropriato di legare automapper 4.2 utilizzando Ninject? Sembra che funzioni fino ad ora, ma voglio essere sicuro.

risposta

14

Prima che l'interfaccia IMapper non esistesse nella libreria, era necessario implementare l'interfaccia e la classe di seguito e collegarli come un modello singleton.

public interface IMapper 
{ 
    T Map<T>(object objectToMap); 
} 

public class AutoMapperAdapter : IMapper 
{ 
    public T Map<T>(object objectToMap) 
    { 
     //Mapper.Map is a static method of the library! 
     return Mapper.Map<T>(objectToMap); 
    } 
} 

Ora è sufficiente legare l'interfaccia IMapper di biblioteca per singola istanza di mapperConfiguration.CreateMapper()

Il problema con il vostro codice di tho, è necessario utilizzare una singola istanza (o come dice Ninject, una costante) si legano .

// A reminder 
var config = new MapperConfiguration(
    c => { 
     foreach (var profile in profiles) { 
      c.AddProfile(profile); 
     } 
    }); 
// Solution starts here 
var mapper = config.CreateMapper(); 
kernel.Bind<IMapper>().ToConstant(mapper); 
+0

Quindi piuttosto che 'InRequestScope()' dovrebbe 'InSingletonScope()'? Altrimenti le associazioni sono ok? – Gup3rSuR4c

+0

@Alex Scusa l'esempio del codice dimenticato, aggiunto. –

+0

Ottimo, questo ha risolto il mio problema. –