webentwicklung-frage-antwort-db.com.de

AutoMapper.Mapper.CreateMap <TSource, TDestination> () 'ist veraltet

Ich muss Klassen wie

class A
{
 public int id {get; set;}
}

class B
{
 public C c {get; set;}
}

class C
{
 public int id {get; set;}
 public string Name {get; set;}
}

Meine Anforderung ist es, die ID der Klasse A der ID der Klasse C zuzuordnen. Jetzt habe ich: Mapper.CreateMap (). ForMember (des => des.C.Id, src => src.MapFrom (x => x.id));

und es hat gut funktioniert.

Jetzt scheint Auto Mapper ihre Implementierung geändert zu haben. und ich bekomme eine Warnung wie folgt:

AutoMapper.Mapper.CreateMap () 'ist obsolet:' Karten, die dynamisch erstellt werden, werden in Version 5.0 entfernt. Verwenden Sie eine MapperConfiguration-Instanz, und speichern Sie sie bei Bedarf statisch oder Mapper.Initialize. Verwenden Sie CreateMapper, um eine Mapper-Instanz zu erstellen.

Ich muss einige Eigenschaften von Klassen zuordnen, die einen anderen Namen und eine andere Struktur haben. Jede Hilfe dazu.

13
Sharad

Vorher

  Mapper.CreateMap<Src, Dest>()
 .ForMember(d => d.UserName, opt => opt.MapFrom(/* ????? */));

Das Problem hierbei ist, dass Zuordnungsdefinitionen statisch sind, einmal definiert und während der gesamten Lebensdauer der Anwendung wiederverwendet werden. Vor 3.3 müssen Sie das Mapping für jede Anforderung mit dem fest codierten Wert neu definieren. Da die Mapping-Konfiguration an einem anderen Ort als unsere Mapping-Ausführung erstellt wird, benötigen wir einen Weg, um einen Laufzeitparameter in unsere Konfiguration einzuführen und ihn dann während der Ausführung anzugeben.

Dies geschieht in zwei Teilen: Die Mapping-Definition, in der wir einen Laufzeitparameter erstellen, und dann zur Ausführungszeit, wenn wir ihn angeben. Um die Mapping-Definition mit einem Laufzeitparameter zu erstellen, "fälschen" wir eine Schließung, die eine benannte lokale Variable enthält:

Mapper.Initialize(cfg => {

string userName = null;
cfg.CreateMap<Source, Dest>()
    .ForMember(d => d.UserName, 
        opt => opt.MapFrom(src => userName)
    );
});

Weitere Informationen siehe diese

Für eine oder mehrere Klassen

 cfg.CreateMissingTypeMaps = true;
 cfg.CreateMap<Source, Dest>()
    .ForMember(d => d.UserName, 
        opt => opt.MapFrom(src => userName)
    );

 cfg.CreateMap<AbcEditViewModel, Abc>();
 cfg.CreateMap<Abc, AbcEditViewModel>();
});

In der Mapping-Klasse

  IMapper mapper = config.CreateMapper();
  var source = new AbcEditViewModel();
  var dest = mapper.Map<AbcEditViewModel, Abct>(source);
23
Anik Saha

Ein anderer Weg, der etwas sauberer erscheint, ist das Erstellen einer MappingProfile-Klasse, die von der Profile-Klasse von AutoMapper erbt

public class MappingProfile:Profile
{
    public MappingProfile()
    {
        CreateMap<Source1, Destination1>();
        CreateMap<Source2, Destination2>();
        ...
    }
}

Dann initialisieren Sie das Mapping mit Mapper.Initialize(c => c.AddProfile<MappingProfile>()); in Ihrem Startcode

Auf diese Weise können Sie das Mapping an beliebiger Stelle durch Aufrufen verwenden

destination1Collection = source1Collection.Select(Mapper.Map<Source1, Destination1>);
0
Leonard Lay

Endlich fand ich die Auflösung. Ich machte: Mapper.Initialize{ Mapping field from source to destination }im App_start und fügte diese Datei zu global.asax -> Application_Start () -> GlobalConfiguration hinzu.

Ich muss eine weitere Zeile in Mapper.Initialize einfügen, die cfg.CreateMissingTypeMaps = true; ist.

Dieser Code funktioniert jetzt für die explizite Zuordnung, bei der zwei Klassen nicht die gleiche Struktur und Namen von Eigenschaften haben.

Abgesehen davon funktioniert der Code Mapper.map(source, destination) auch, wenn wir Eigenschaften von zwei Klassen mit derselben Struktur abbilden müssen, was zuvor nicht funktioniert hat.

Lassen Sie mich wissen, wenn jemand Probleme mit der Lösung hat. Vielen Dank für die obige Antwort.

0
Sharad