web-dev-qa-db-fra.com

AutoMapper.Mapper.CreateMap <TSource, TDestination> () 'est obsolète

Je dois des cours comme

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

Mon exigence est de mapper id de classe A à id de classe C . Ce que je faisais jusqu’à présent était: Mapper.CreateMap (). ForMember (des => des.C.Id, src => src.MapFrom (x => x.id));

et ça fonctionnait bien.

Il semble maintenant que le mappeur automatique a changé leur implémentation. et je reçois un avertissement comme ci-dessous:

AutoMapper.Mapper.CreateMap () 'est obsolète:' La création dynamique de cartes sera supprimée dans la version 5.0. Utilisez une instance MapperConfiguration et stockez-la de manière statique si nécessaire, ou Mapper.Initialize. Utilisez CreateMapper pour créer une instance de mappeur.

J'ai besoin de mapper des propriétés de classes qui ont un nom et une structure différents. Toute aide sur ceci.

13
Sharad

Précédemment

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

Le problème ici est que les définitions de mappage sont statiques, définies une fois et réutilisées tout au long de la vie de l’application. Avant la version 3.3, vous auriez besoin de redéfinir le mappage à chaque demande, avec la valeur codée en dur. Et comme la configuration du mappage est créée dans un emplacement distinct de celui de notre exécution, nous avons besoin d'un moyen d'introduire un paramètre d'exécution dans notre configuration, puis de le fournir lors de l'exécution.

Ceci est accompli en deux parties: la définition de mappage où nous créons un paramètre d'exécution, puis au moment de l'exécution lorsque nous le fournissons. Pour créer la définition de mappage avec un paramètre d'exécution, nous «simulons» une fermeture qui inclut une variable locale nommée:

Mapper.Initialize(cfg => {

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

Pour plus d'informations voir ceci

Pour un ou plusieurs cours

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

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

En classe de cartographie

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

Une autre façon qui semble un peu plus propre consiste à créer une classe MappingProfile qui hérite de la classe Profile de AutoMapper.

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

Ensuite, vous initialisez le mappage avec Mapper.Initialize(c => c.AddProfile<MappingProfile>()); dans votre code de démarrage

Cela vous permettra d'utiliser le mappage n'importe où en appelant

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

Finalement j'ai trouvé la résolution. Je faisais: Mapper.Initialize{ Mapping field from source to destination }dans App_start et en ajoutant ce fichier à global.asax -> Application_Start () -> GlobalConfiguration.

J'ai besoin d'ajouter une ligne supplémentaire dans mon mappeur.Initialiser qui est cfg.CreateMissingTypeMaps = true;

Maintenant, ce code fonctionnera pour le mappage explicite où deux classes n'ont pas la même structure et les mêmes noms de propriétés.

En dehors de cela, si nous avons besoin de mapper les propriétés de deux classes avec la même structure, le code Mapper.map(source, destination) fonctionnera également, ce qui ne fonctionnait pas auparavant.

Faites-moi savoir si quelqu'un a de la difficulté avec la solution. Merci à tous pour la réponse ci-dessus.

0
Sharad