es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lanza un error/advertencia cuando CreateMap ya está definido.

El otro día estuve luchando con una propiedad no mapeada usando AutoMapper.

Después de investigar la aplicación, resultó que ya existía una CreateMap<s, t=””> definida que estaba sobrescribiendo (o leyendo primero) la que estaba tratando de configurar.

La situación se ve así:

public MainProfile()
{
CreateMap<class1, class2=””>()
.ForMember(x => x.Property1, opt => opt.MapFrom(s => s.Property1Foo))
.ForMember(x => x.Property2, opt => opt.MapFrom(s => s.Property2Foo)); /¡Aquí está el problema!/
}

Y luego había otra clase que hace lo siguiente:

public SecondaryProfile()
{
CreateMap<class1, class2=””>()
.ForMember(x => x.Property1, opt => opt.MapFrom(s => s.Property1Foo));
}

En mi caso, cuando hice:

var class2Object = mapper.Map(class1Instance);

Se está utilizando la definición de SecondaryProfile.cs en lugar de MainProfile.cs, por lo que Property2 no se está mapeando.

Esto no te muestra ninguna advertencia, ningún error y también se compila sin problemas. Además, esto puede introducir un error difícil de encontrar, así que me pregunto cómo puedo evitar esta situación.

¿Hay alguna configuración que se pueda hacer para que AutoMapper te advierta sobre esto?</class1,></class1,></s,>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de evitar esta situación es dar a cada CreateMap un nombre único utilizando la clase Profile. Por ejemplo:

    public class MainProfile : Profile
    {
       public MainProfile()
       {
           CreateMap<class1, class2="">() //dar un nombre único
               .ForMember(x => x.Property1, opt => opt.MapFrom(s => s.Property1Foo))
               .ForMember(x => x.Property2, opt => opt.MapFrom(s => s.Property2Foo));
       }
    }
    
    public class SecondaryProfile : Profile
    {
       public SecondaryProfile()
       {
           CreateMap<class1, class2="">() //dar un nombre único
               .ForMember(x => x.Property1, opt => opt.MapFrom(s => s.Property1Foo));
       }
    }
    

    Luego, en tu código de inicio, puedes agregar los perfiles a tu configuración de la siguiente manera:

    var config = new MapperConfiguration(cfg =>
    {
       cfg.AddProfile<mainprofile>();
       cfg.AddProfile<secondaryprofile>();
    });
    var mapper = config.CreateMapper();
    

    Ahora, si intentas definir el mismo CreateMap más de una vez, AutoMapper lanzará una AutoMapperConfigurationException, que te advertirá del problema.</class1,></class1,>

Comments are closed.