2016-04-18 21 views
0

Ich habe ein Projekt, wo ich Autoadapter 2.2.1 verwendet habe. Ich habe ein Upgrade auf 4.2.1 durchgeführt und bin komplett kaputt. Ich habe versucht, this zu folgen, indem ich alle Verweise auf Mapper.CreateMap<Source, Target>() zu Mapper.Initialize(cfg => { cfg.CreateMap<Source, Target>()}) änderte. Ich bin jetzt gebrochen schlecht und ich kann nicht scheinen, es zu tun.Ich bekomme "System.Reflection.ReflectionTypeLoadException wurde von Benutzer-Code-Ausnahme mit Unable, um einen oder mehrere der angeforderten Typen kann nicht behandelt. Abrufen der LoaderExceptions-Eigenschaft für mehr Informationen ", Nachricht. Was vermisse ich. Code sieht wie folgt aus:Migrieren zu Automapper 4.2.1 von Automapper 2.2.1

AutomapperTypeAdapterFactory

public class AutomapperTypeAdapterFactory : ITypeAdapterFactory 
{ 
    public AutomapperTypeAdapterFactory() 
    { 
     //scan all assemblies finding Automapper Profile 
     var profiles = AppDomain.CurrentDomain 
           .GetAssemblies() 
           .SelectMany(a => a.GetTypes()) 
           .Where(t => t.BaseType == typeof(Profile)); 

     Mapper.Initialize(cfg => 
     { 
      foreach (var item in profiles) 
      { 
       if (item.FullName != "AutoMapper.SelfProfiler`2") 
        cfg.AddProfile(Activator.CreateInstance(item) as Profile); 
      } 
     }); 
    } 

    public ITypeAdapter Create() => new AutomapperTypeAdapter(); 
} 

Abteilung Profil

public class DepartmentProfile : Profile 
{ 
    protected override void Configure() 
    { 
     Mapper.Initialize(cfg => 
     { 
      cfg.CreateMap<Department, DepartmentDto>(); 
     }); 
    } 
} 

UnityContainer

public static class Container 
{ 
    static IUnityContainer _container = new UnityContainer(); 

    static Container() 
    { 
     var typeAdapterFactory = _container.Resolve<ITypeAdapterFactory>(); 
     TypeAdapterFactory.SetCurrent(typeAdapterFactory); 
    } 
    //other container resolutions.... 
} 

Antwort

0

In Projekten, in denen ich weg von der statischen Konfiguration bewegt habe ich definiert haben einige Zuordnungsprofile (in der Regel ein Profil pro Anwendungsschicht):

public class MappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Source, Destination>(); 
    } 
} 

ich dann konfigurieren meine IoC (SimpleInjector, in meinem Fall), um alle Profile zu finden und sie zu einer einzigen, einheitlichen Konfiguration hinzuzufügen. Ich melde mich dann die MapperConfiguration in meinem Behälter, sowie die IMapper Objekt aus dem gleichen erstellt:

public void ConfigureSimpleInjector(IAppBuilder app) 
    { 
     var container = new Container(); 
     container.Options.DefaultScopedLifestyle = new WebRequestLifestyle(); 

     container.RegisterAutoMapper(); 

     container.RegisterMvcControllers(Assembly.GetExecutingAssembly()); 

     container.RegisterMvcIntegratedFilterProvider(); 

     container.Verify(); 

     DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
    } 


public static Container RegisterAutoMapper(this Container container) 
    { 
     var profiles = typeof(AutoMapperRegistry).Assembly.GetTypes().Where(t => typeof(Profile).IsAssignableFrom(t)).Select(t => (Profile)Activator.CreateInstance(t)); 

     var config = new MapperConfiguration(cfg => 
     { 
      foreach (var profile in profiles) 
      { 
       cfg.AddProfile(profile); 
      } 
     }); 

     container.Register<MapperConfiguration>(() => config); 
     container.Register<IMapper>(() => container.GetInstance<MapperConfiguration>().CreateMapper()); 

     return container; 
    } 
} 

Ich kann dann DI verwenden für IMapper (oder Sie können es speichern statisch), sowie die MapperConfiguration für den Einsatz in LINQ-Projektionen.

+0

Ist Ihr 'public static Container RegisterAutoMapper (dieser Container container)' in einer Klasse enthalten, die von der Registry erbt? oder wo ist ** AutoMapperRegistry ** in 'var profiles = typeof (AutoMapperRegistry) .Assembly.GetTypes() ...' von? @James – mkaris

+0

Es ist in einer Klasse namens 'AutoMapperRegistry' Ja, obwohl diese Klasse nur verwendet wird einen gewissen Spielraum für die Suche nach 'Profil'-Typen in den Assemblys meiner Anwendung. Sie könnten stattdessen so etwas verwenden: 'Assembly.GetExecutingAssembly(). GetTypes() ...' – James

+0

Ich verwende die Einheit, aber ich kann nicht darüber nachdenken, wie dies in die Einheit 'container.Register (() => config); container.Register (() => container.GetInstance (). CreateMapper()); ' – mkaris