2016-02-05 13 views
11

Aktualizuję swój projekt, aby korzystać z AutoMapper 4.2, i mam problemy z przełamaniem zmian. Podczas gdy I wydaje się, że rozwiązał te zmiany, nie jestem całkowicie przekonany, że zrobiłem to w najbardziej odpowiedni sposób.AutoMapper 4.2 i Ninject 3.2

W starym kodzie mam klasę NinjectConfiguration i AutoMapperConfiguration, z których każda jest ładowana przez program WebActivator. W nowej wersji AutoMapperConfiguration odpada, a ja zamiast przykład MapperConfiguration bezpośrednio w klasie NinjectConfiguration gdzie Wiązania są dzieje tak:

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

Tak, jest to właściwy sposób wiązania AutoMapper 4,2 użyciu Ninject? Wydaje się, że działa do tej pory, ale chcę się tylko upewnić.

Odpowiedz

14

Wcześniej, niż interfejs IMapper nie istniał w bibliotece, więc trzeba było zaimplementować interfejs i klasę poniżej i powiązać je jako wzorzec 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); 
    } 
} 

Teraz po prostu związać interfejs IMapper biblioteki do jednej instancji mapperConfiguration.CreateMapper()

problem z kodem Tho, należy użyć jednej instancji (lub jak mówi Ninject, stały) wiążą .

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

Więc zamiast "InRequestScope()" powinien on "InSingletonScope()"? W przeciwnym razie wiązania są w porządku? – Gup3rSuR4c

+0

@Alex Przepraszamy, zapomniałem przykładowy kod, dodaliśmy go. –

+0

Świetnie, to rozwiązało mój problem. –