c# automapper automapper-2

c# - AutoMapper usando el constructor incorrecto



nopcommerce themes (1)

Solo necesitas agregar un reparto explícito a

Func<ResolutionContext, TypeOne>

Aquí está el código:

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing( (Func<ResolutionContext, TypeOne>) (r => new TypeOne()));

La versión actual de AutoMapper funciona como se describe a continuación:

  1. Ordena los constructores de tipo de destino por conteo de parámetros

    destTypeInfo.GetConstructors().OrderByDescending(ci => ci.GetParameters().Length);

  2. Toma al primer constructor los parámetros que coinciden con las propiedades de origen (sin ninguna comprobación de valor nulo). En su caso es constructor con dos parámetros.

Hoy actualicé una aplicación que funciona completamente con AutoMapper v1.1 para usar AutoMapper v2.1 y me encuentro con algunos problemas que nunca encontré con la versión anterior.

Este es un ejemplo de mi asignación de código de Dto a objeto de dominio

public class TypeOne { public TypeOne() { } public TypeOne(TypeTwo two) { //throw ex if two is null } public TypeOne(TypeTwo two, TypeThree three) { //throw ex if two or three are null } public TypeTwo Two {get; private set;} public TypeThree Three {get; private set;} } public class TypeOneDto { public TypeOneDto() { } public TypeTwoDto Two {get; set;} public TypeThreeDto Three {get; set;} }

...

Mapper.CreateMap<TypeThreeDto, TypeThree>(); Mapper.CreateMap<TypeTwoDto, TypeTwo>(); Mapper.CreateMap<TypeOneDto, TypeOne>(); var typeOne = Mapper.Map<TypeOne>(typeOneDto);

Sin embargo, el primer problema que encontré con v2.1 fue que AutoMapper intentaba usar el constructor con 2 argumentos cuando uno de los argumentos era nulo y debería usar el constructor 1 argumento.

Entonces traté de usar

Mapper.CreateMap<TypeOneDto, TypeOne>().ConstructUsing(x => new TypeOne());

Pero seguí recibiendo un error de ''Invocación ambigua'' que no pude resolver.

Entonces intenté

Mapper.CreateMap<TypeOneDto, TypeOne>().ConvertUsing(x => new TypeOne());

y eso creó con éxito el objeto TypeOne usando el constructor sin parámetros, pero luego falló al establecer las propiedades del establecedor privado.

Busqué ayuda en el sitio web de AutoMapper y descargué el código fuente para verlo bien, pero no llegué muy lejos con la poca documentación y no hubo muchas pruebas unitarias para la construcción.

¿Hay algo obvio que me esté perdiendo y que debería cambiar con v2.1? Me sorprende que haya cambiado tanto desde v1.1.