2016-02-12 3 views
21

Ich hatte in meinem Projekt eine globale Automapper-Konfiguration definiert, die es mir erlauben würde, in meinem Code zu verwenden. (Siehe meine Konfiguration unten.)Automapper sagt Mapper.Map ist veraltet, globale Zuordnungen?

Ich habe das NuGet-Paket aktualisiert und sehe die Meldung, dass Mapper.Map veraltet ist. Ich ging auf GitHub AutoMapper zurück und sehen Sie Beispiele wie folgt aus:

[Test] 
public void Example() 
{ 
    var config = new MapperConfiguration(cfg => 
    { 
     cfg.CreateMap<Source1, SubDest1>().FixRootDest(); 
     cfg.CreateMap<Source2, SubDest2>().FixRootDest(); 
    }); 

    config.AssertConfigurationIsValid(); 

    var mapper = config.CreateMapper(); 

    var subDest1 = mapper.Map<Source1, SubDest1>(new Source1 {SomeValue = "Value1"}); 
    var subDest2 = mapper.Map<Source2, SubDest2>(new Source2 {SomeOtherValue = "Value2"}); 

    subDest1.SomeValue.ShouldEqual("Value1"); 
    subDest2.SomeOtherValue.ShouldEqual("Value2"); 
} 

Werde ich habe eine Konfiguration in jeder Methode zu erstellen, die eine Zuordnung verwendet?

Meine aktuelle globale Konfiguration:

namespace PublicationSystem.App_Start 
{ 
    public class AutoMapperConfig 
    { 
     public static void CreateMaps() 
     { 
      CreateProjectMaps(); 
     } 

     private static void CreateProjectMaps() 
     { 
      Mapper.CreateMap<Project, ProjectCreate>(); 
      Mapper.CreateMap<Project, ProjectSelectable>(); 
      //... 
     } 
    } 
} 

UPDATE: Dank einiger Coaching von Scott Chamberlain ich eine Klasse wie folgt geschaffen:

public class MkpMapperProfile : AutoMapper.Profile 
    { 
     protected override void Configure() 
     { 
      this.CreateMap<Project, ProjectCreate>(); 

      this.CreateMap<Project, ProjectSelectable>(); 

      this.CreateMap<Project, ProjectDetails>(); 

      // Many Many other maps 
     } 
    } 

Ich denke, ich sollte habe die 'MapperConfiguration' in meiner BaseController-Klasse. Ich fing an, so etwas zu tun:

public partial class BaseController : Controller 
{ 

    private MapperConfiguration mapConfig; 

    public BaseController() 
    { 
     db = new MkpContext(); 
     SetMapperConfig(); 
    } 

    private void SetMapperConfig() 
    { 
     mapConfig = new MapperConfiguration(cfg => 
      { 
       cfg.AddProfile<MkpMapperProfile>(); 
      }); 
    } 

    public BaseController(MapperConfiguration config) 
    { 
     db = new MkpContext(); 
     this.mapConfig = config; 
    } 
} 

Bin ich auf dem richtigen Weg?

+1

Automapper entfernt sich von globalen statischen Funktionen. Dies ermöglicht Bibliotheken, die von verschiedenen Autoren geschrieben wurden, AutoMapper zu verwenden, ohne sich gegenseitig zu stören. –

+1

Ich bin mir nicht sicher, was das für mich bedeutet. Ich bekomme hier und da Informationen, aber es ergibt kein vollständiges Bild für mich. Ich habe gelesen: https://github.com/AutoMapper/AutoMapper/wiki/Migrating-from-static-API, aber es macht keinen Sinn. Muss ich in JEDEM ActionResult, das AutoMapper verwendet, eine Konfiguration definieren? Ich könnte es in einen Datenlayer verschieben ... Und meine App scheint nicht "MvcApplication.MapperConfiguration" zu haben. Wo ist das definiert? –

+0

Sie erstellen eine Klasse, die von 'Profile' abgeleitet ist, überschreiben die' Configure() 'Funktion, fügen dann Ihre' CreateProjectMaps' ein und ersetzen 'Mapper.' mit' this.' –

Antwort

35

So habe ich es gehandhabt.

Erstellen Sie Karten in einem Profil, kümmert sich die CreateMap Methode Profil zu verwenden, anstatt Mapper statische Methode mit dem gleichen Namen:

internal class MappingProfile : Profile 
{ 
    protected override void Configure() 
    { 
     CreateMap<Project, ProjectCreate>(); 
    } 
} 

Dann, wo Abhängigkeiten verdrahtet-up (ex: Global.asax oder Starten), erstellen Sie eine MapperConfiguration und verwenden Sie diese, um einen IMapper zu erstellen.

var mapperConfiguration = new MapperConfiguration(cfg => 
    { 
     cfg.AddProfile(new MappingProfile()); 
    }); 

Verwenden Sie dann die Konfiguration eines IMapper zu generieren:

var mapper = mapperConfiguration.CreateMapper(); 

Dann registrieren, die Mapper mit der Abhängigkeit Builder (ich verwende Autofac hier)

builder.RegisterInstance(mapper).As<IMapper>(); 

Jetzt, wo immer Sie benötigen, um Sachen zuzuordnen, erklären Sie eine Abhängigkeit von IMapper:

internal class ProjectService : IProjectService { 
    private readonly IMapper _mapper; 
    public ProjectService(IMapper mapper) { 
     _mapper = mapper; 
    } 
    public ProjectCreate Get(string key) { 
     var project = GetProjectSomehow(key); 
     return _mapper.Map<Project, ProjectCreate>(project); 
    } 
} 
+3

Beachten Sie, dass in AutoMapper 5.0 das MappingProfile-Confi nur im Konstruktor behandelt wird. Keine Notwendigkeit mehr zu überschreiben. –

2
+0

Diese Links existieren nicht mehr? –

+0

@AkshayRandive, danke, sie sind jetzt behoben. –

7

Dies ist neu in AutoMapper 4.2. Es gibt einen Blog-Beitrag von Jimmy Bogard dazu: Removing the static API from AutoMapper.Sie behauptet, dass

Die IMapper Schnittstelle viel leichter ist, und der zugrunde liegende Typ ist jetzt nur besorgt mit Karten ausgeführt wird, eine Menge der threading Probleme zu entfernen ...

Die neue Syntax: (klebte aus der Blog-Post)

var config = new MapperConfiguration(cfg => { 
    cfg.CreateMap<User, UserDto>(); 
}); 

Wenn Sie nur den "alten Weg" wollen, dies zu tun. Die neueste Version 4.2.1 hat etwas Tradition zurückgebracht. Verwenden Sie einfach

CreateMap<Project, ProjectCreate>(); 

statt

Mapper.CreateMap<Project, ProjectCreate>(); 

Der alte Code wird gut funktionieren.

1
Mapper.Initialize(cfg => { 
    cfg.CreateMap<Source, Dest>(); 
}); 
6

Ich benutze Version 5.2.0, Unterstützung zum Erstellen von Karten in Konstruktoren anstelle von Override konfigurieren.

public class MappingProfile : Profile 
{ 
    public MappingProfile() 
    { 
     CreateMap<Project, ProjectDto>(); 
    } 
} 

In Global.asax.cs Aufruf wie:

Mapper.Initialize(c=>c.AddProfile<MappingProfile>()); 

Hope this Hilfe.

+0

Wenn Sie Profile dynamisch hinzufügen müssen: Mapper.Initialize (c => c.AddProfiles (new string [] {"DLL_NAME"})); ' – JenonD