web-dev-qa-db-fra.com

Comment configurer le mappeur automatique dans le projet de bibliothèque de classes?

J'utilise la cartographie automatique pour la première fois.

Je travaille sur l'application c # et je souhaite utiliser le mappeur automatique.

(Je veux juste savoir comment l'utiliser, donc je n'ai pas d'application asp.net ni d'application MVC.)

J'ai trois projets de bibliothèque de classe.

enter image description here

Je veux écrire le processus de transfert dans le projet de service.

Je veux donc savoir comment et où dois-je configurer le mappeur automatique?

32
bnil

Vous pouvez placer la configuration n'importe où:

public class AutoMapperConfiguration
{
    public static void Configure()
    {
        Mapper.Initialize(x =>
            {
                x.AddProfile<MyMappings>();              
            });
    }
}

 public class MyMappings : Profile
{
    public override string ProfileName
    {
        get { return "MyMappings"; }
    }

    protected override void Configure()
    {
    ......
    }

Mais il doit être appelé par l'application à l'aide des bibliothèques à un moment donné:

void Application_Start()
    {               
        AutoMapperConfiguration.Configure();
    }
26
severin

Donc, sur la base de la réponse de Bruno ici et le post de John Skeet sur les singletons J'ai trouvé la solution suivante pour que cela ne s'exécute qu'une seule fois et soit complètement isolé dans la bibliothèque de classe contrairement à la réponse acceptée qui repose sur le consommateur du bibliothèque pour configurer les mappages dans le projet parent:

public static class Mapping
{
    private static readonly Lazy<IMapper> Lazy = new Lazy<IMapper>(() =>
    {
        var config = new MapperConfiguration(cfg => {
            // This line ensures that internal properties are also mapped over.
            cfg.ShouldMapProperty = p => p.GetMethod.IsPublic || p.GetMethod.IsAssembly;
            cfg.AddProfile<MappingProfile>();
        });
        var mapper = config.CreateMapper();
        return mapper;
    });

    public static IMapper Mapper => Lazy.Value;
}

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Source, Destination>();
        // Additional mappings here...
    }
}

Ensuite, dans votre code où vous devez mapper un objet à un autre, vous pouvez simplement faire:

var destination = Mapping.Mapper.Map<Destination>(yourSourceInstance);

REMARQUE: ce code est basé sur AutoMapper 6.2 et il peut nécessiter quelques ajustements pour les anciennes versions d'AutoMapper.

21
Marko

Personne en dehors de votre bibliothèque ne doit configurer AutoMapper

Je vous recommande d'utiliser l'approche basée sur l'instance en utilisant un IMapper . De cette façon, personne en dehors de votre bibliothèque n'a à appeler de méthode de configuration. Vous pouvez définir un MapperConfiguration et créer le mappeur à partir de là tout dans la bibliothèque de classes.

var config = new MapperConfiguration(cfg => {
    cfg.AddProfile<AppProfile>();
    cfg.CreateMap<Source, Dest>();
});

IMapper mapper = config.CreateMapper();
// or
IMapper mapper = new Mapper(config);
var dest = mapper.Map<Source, Dest>(new Source());
5
Bruno Zell

La réponse de Marko est correcte.

Nous pouvons également passer par une solution simple ci-dessous.

 public static class ObjectMapper
{
    public static IMapper Mapper
    {
        get
        {
            return AutoMapper.Mapper.Instance;
        }
    }
    static ObjectMapper()
    {
        CreateMap();
    }
    private static void CreateMap()
    {
        AutoMapper.Mapper.Initialize(cfg =>
        {
            cfg.CreateMap<SourceClass, DestinationClass>();
        });
    }
}
public class SourceClass
{
    public string Name { get; set; }
}
public class DestinationClass
{
    public string Name { get; set; }
}
SourceClass c1 = new SourceClass() { Name = "Mr.Ram" };

DestinationClass c2 = ObjectMapper.Mapper.Map<DestinationClass>(c1);
1
Patel Vishal