2016-02-05 9 views
11

Ich bin Aktualisierung ein Projekt von mir AutoMapper 4.2, zu verwenden, und ich laufe in brechen Änderungen. Während ich scheine gelöst zu haben, sagte Veränderungen, ich bin nicht ganz überzeugt, ich habe in der am besten geeigneten Art und Weise erfolgen, so. Im alten Code habe ich eine NinjectConfiguration und eine AutoMapperConfiguration Klasse, die jeweils von WebActivator geladen werden. In der neuen Version fällt die AutoMapperConfiguration und ich Instanz stattdessen ein MapperConfiguration direkt in der NinjectConfiguration Klasse, wo die Bindungen geschehen, etwa so:AutoMapper 4.2 und Ninject 3.2

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

Also, das ist der richtige Weg AutoMapper 4.2 mit Ninject der Bindung? Es scheint so weit zu funktionieren, aber ich will nur sichergehen.

Antwort

14

In bevor IMapper Schnittstelle hat in der Bibliothek nicht vorhanden, so dass Sie unter Schnittstelle und Klasse zu implementieren hatte und band sie als Singletonmuster.

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

Jetzt können Sie einfach Bibliothek IMapper Schnittstelle an einzelne Instanz mapperConfiguration.CreateMapper binden()

Das Problem mit Ihrem Code tho, sollten Sie eine einzelne Instanz (oder wie Ninject sagt, eine konstante) binden .

// 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

Also lieber als 'InRequestScope()' sollte es 'InSingletonScope()'? Sonst sind die Bindungen ok? – Gup3rSuR4c

+0

@ Alex Leider vergessen Codebeispiel hinzugefügt es. –

+0

Großartig, das hat mein Problem gelöst. –