web-dev-qa-db-fra.com

AutoMapper 5.2 comment configurer

Quelle est la bonne façon de configurer AutoMapper pour une utilisation globale.

Je veux le configurer une fois, puis l'utiliser dans l'application.

j'ai le fort sentiment que c'est faux. en fait, je sais que c'est faux car cela appelle une nouvelle instance. Je veux une configuration globale et comment l'appellez-vous. Impossible de trouver un bon exemple!

c'est ce que j'ai: mais ce n'est pas ce que je veux

public static class AutoMapperConfig
{
      public static IMapper GetMapper()
      {
          var config = new MapperConfiguration(cfg => {
              cfg.CreateMap<R_Logo, LogoDto>();
              //lots more maps...?
          });

          IMapper mapper = config.CreateMapper();
          return mapper;
      }
}

puis utilisation:

  var imapper = AutoMapperConfig.GetMapper();
  var dest = imapper.Map<R_Logo, LogoDto>(logo);

MISE À JOUR basée sur: pinkfloydx33

Appelez cela une fois et la configuration est terminée.

public static class AutoMapperConfig
{
   public static void RegisterMappings()
   {
        AutoMapper.Mapper.Initialize(cfg => {
           cfg.CreateMap<R_Logo, LogoDto>();
            /* etc */
        });
    }
}
12
Seabizkit

Vous pouvez utiliser l'api du mappeur statique comme indiqué ici .

Par exemple, quelque part dans votre application, probablement au démarrage, vous configureriez le mappeur statique (global) en utilisant quelque chose comme:

AutoMapper.Mapper.Initialize(cfg => { 
   cfg.CreateMap<Type1, Type2>(); 
   /* etc */
});

Ensuite, chaque fois que vous devez utiliser votre mappeur configuré "globalement", vous y accédez via la propriété statique Mapper (qui est un IMapper):

Type1 objectOfType1 = new Type1();
var result = AutoMapper.Mapper.Map<Type2>(objectOfType1);

Vous disposez alors d'un mappeur qui a été configuré pour tous les types/configurations/profils que vous fournissez pour la durée de votre application sans avoir à configurer des instances de mappeur individuelles.

En bref, vous le configurez une fois (peut-être au démarrage de l'application). L'instance de mappeur statique (IMapper) est alors disponible n'importe où dans votre application en y accédant via AutoMapper.Mapper.

L'accès via cette propriété statique est ce que vous appelez "globalement" dans vos commentaires. Partout où vous en avez besoin, utilisez simplement AutoMapper.Mapper.Map(...) Tant que vous avez appelé Initialize une première fois.

Notez que si vous appelez Initialize plus d'une fois sur l'instance statique, chaque appel suivant écrase la configuration existante.

[~ # ~] avertissement [~ # ~] Dans une version précédente d'AutoMapper, le mappeur statique a été supprimé. Il a ensuite été ajouté et je ne sais pas s'ils garantissent qu'il restera dans les futures versions. La recommandation est d'utiliser vos propres instances configurées d'un mappeur. Vous pouvez le stocker dans une propriété statique quelque part si vous en avez besoin. Sinon, vous pouvez regarder dans les profils, etc. pour des moyens faciles de configurer votre mappeur afin que le fait d'avoir votre propre instance ne soit pas nécessairement un "tracas".

6
pinkfloydx33

Voici les étapes pour configurer l'automappeur dans asp.net core mvc.

1. Créez la classe de profil de mappage qui s'étend de Profile

 public class ClientMappingProfile : Profile
 {
     public ClientMappingProfile ()
     {
         CreateMap<R_Logo, LogoDto>().ReverseMap();
     }
 }

2. Créez la classe de configuration AutoMapper et ajoutez votre classe de profil de mappage ici.

public class AutoMapperConfiguration
{
   public MapperConfiguration Configure()
   {
        var config = new MapperConfiguration(cfg =>
        {
            cfg.AddProfile<ClientMappingProfile>();
        });
        return config;
    }
}

. Comment nous pouvons l'utiliser.

       var config = new AutoMapperConfiguration().Configure();
       var iMapper = config.CreateMapper();

       var dest = iMapper.Map<R_Logo, LogoDto>(logo);
14
Ahmar

Définissez-le dans votre fichier StartupConfig ou StartUp.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
       // Web API configuration and services    
        .....

        MappingDTOModelToModel.Configure();
    }
}

Configuration des mappages,

public static class MappingDTOModelToModel
{       
     private static void Configure()
     {
         Mapper.Initialize(cfg =>
         {
             cfg.CreateMap<R_Logo, LogoDto>()
                 .ForMember(x => x.ID,
                            m => m.MapFrom(a => a.ID))
                 .ForMember(x => x.FirstName,
                            m => m.MapFrom(a => a.FirstName)).ReverseMap();                    
         }
     }
 }

L'appeler dans une méthode,

public class MyService
{
    public void MyMethod(var model)
    {
        var myModel = Mapper.Map<LogoDto, R_Logo>(model);  
    }
}

J'espère que cela t'aides,

10
Vivek Singh

Notre solution à ce problème a été de créer d'abord une sélection d'attributs qui peuvent décorer une classe comme étant "mappable" (à, à partir de ou les deux). Vous pouvez ensuite initialiser l'AutoMapper dans un seul emplacement, généralement après l'initialisation de l'application et utiliser Reflection pour créer dynamiquement une carte pour chaque instance des classes décorées.

Voici un exemple:

var types = _myTypeFinder.Find(type =>
    type.IsDefined(typeof(AutoMapperAttribute)) ||
    type.IsDefined(typeof(AutoMapperFromAttribute)) ||
    type.IsDefined(typeof(AutoMapperToAttribute))
    );

Mapper.Initialize(cfg =>
{
    foreach (var type in types)
    {
        AutoMapperHelper.CreateMap(type, cfg);
    }
});
1
Kallum Tanton