2010-10-22 85 views
5

Mi pregunta puede ser tonta, pero estoy bastante seguro de que echo de menos una parte muy importante del problema. Tengo que hacer una asignación de objeto a objeto (entre las clases de dominio utilizadas en el proyecto C# y las clases que se envían a clientes flash).¿Cuáles son las ventajas de usar Automapper?

Mi primera opción fue Automapper. Pero he tenido algunos problemas con él (propiedades anidadas, no definido constructor sin paramterless). Resulta que no es tan fácil mapear un tipo realmente complejo con Automapper.

Entonces mi pregunta es: ¿Por qué no aplicar métodos como:

ClassA GetClassAByClassB(ClassB pObj) 

    { 
    ClassA objA = new ClassA(); 
    objA.Prop1 = pObj.Prop1; 
    objA.NestedType.Prop2 = pObj.Prop2; 
    //....Some more..... 
    return objA; 
    } 

Tiene exactamente el mismo nivel de flexibilidad, como mapeo realizado utilizando AutoMapper. Aún debe indicar qué propiedad del objeto de origen se copia en qué propiedades del objeto de destino. Simplemente haz esto usando '=' y no con la expresión lambda.

Pero si cambia algo en sus clases de dominio, tiene que cambiar esta parte de "mapeo" de todos modos. Entonces, ¿qué es lo principal que debería convencerme de usar Automapper (como dije al principio, estoy bastante seguro de que me estoy perdiendo algo importante).

Respuesta

3

Porque con AutoMapper que no lo hace tienen que poner en práctica esos métodos ;-)

Su enfoque requiere escribir mucho

classA.propA = classB.propA; 
classA.propB = classB.propB; 
classA.propC = classB.propC; 
classA.propD = classB.propD; 
classA.propE = classB.propE; 

AutoMapper utiliza las convenciones de la figura hacia sí mismo. Además, no tiene que preocuparse por pObj == null (su código arrojará NulLReferenceException en este caso).

También puede definir conversiones en su mapa (es decir, cadena a DateTime).

Mapper.CreateMap<User, UserModel>().ForMember(d => d.LastLogin, c => c.MapFrom<DateTime?>(u => u.Credential.LastLogin)); 

AutoMapper también admite propiedades anidadas.

Leer más aquí: AutoMapper Introduction and Samples

+0

¿Qué pasa con las propiedades que no tienen los mismos nombres? ¿Y propiedades anidadas? Creo que debería cambiar las convenciones, pero a veces la propiedad de un lado es 'PositionX' y del otro lado simplemente 'X'. (solo un ejemplo: las propiedades anmes pueden ser bastante impredecibles). Entonces, ¿no es como si no debería usar Automapper en mi caso? – Katalonis

+0

@Katalonis - Luego configura el asignador de forma segura con lambdas. Se agregó una muestra de código y un enlace. –

1

El único beneficio que AutoMapper dice tener es la cartografía por convención. Aquí es una cita de "AutoMapper Introduction and Samples"

"En esto radica la belleza de AutoMapper. Cuando las clases se alinean a sí mismos de forma convencional, la configuración de mapeo puede ser tan simple"

Este beneficio tiene un costo. Renombrar o cambiar tanto el objetivo como la propiedad de origen romperá la asignación e introducirá errores en tiempo de ejecución en lugar de compilar errores.

Si no puede confiar en la asignación de convenciones, AutoMapper pierde su ventaja. En este caso, prefiero escribir una función de fábrica como la siguiente.

public static ClassA MapToClassA(this ClassB b) 
{ 
    return new ClassA() 
    { 
     propA = b.propA; 
     propB = b.propB; 
     propC = b.propC; 
    } 
} 

allí tendría que construir el objeto de destino como

var classA = classB.MapToClassA(); 

en lugar de

var classA = Mapper.Map<ClassB, ClassA>(classB) 

Personalmente, preferiría fábrica funciona incluso cuando el mapeo de la convención es posible por su carácter explícito, la legibilidad y depuración de amistad. Buena suerte al tratar de averiguar, en el segundo caso, cómo se asigna ClassB a ClassA, si se carga el perfil de asignación, o por qué hay una excepción cuando se llama a la función Map <>(), o por qué algunas de las propiedades se les ha asignado un valor incorrecto

Cuestiones relacionadas