Automapper es un "mapeador objeto-objeto" para .Net, lo que significa copiar objetos de una clase a otra clase que representa lo mismo.
¿Por qué es esto útil alguna vez? ¿La duplicación de clases es útil / buen diseño?
Automapper es un "mapeador objeto-objeto" para .Net, lo que significa copiar objetos de una clase a otra clase que representa lo mismo.
¿Por qué es esto útil alguna vez? ¿La duplicación de clases es útil / buen diseño?
Respuestas:
Una búsqueda rápida en Google reveló este ejemplo:
http://www.codeproject.com/Articles/61629/AutoMapper
mostrando un uso perfectamente válido de AutoMapper que definitivamente no es un ejemplo para un diseño pobre. En una aplicación en capas, puede tener objetos en sus datos o en la capa empresarial, y a veces solo necesita un subconjunto de los atributos de esos objetos de datos, o algún tipo de vista en su capa de interfaz de usuario. Por lo tanto, crea un modelo de vista que contiene objetos con exactamente los atributos que necesita en su interfaz de usuario, no más, y usa AutoMapper para proporcionar el contenido de esos objetos con menos código repetitivo.
En tal situación, sus "objetos de vista" no son un duplicado de la clase original. Tienen diferentes métodos y quizás algunos atributos duplicados. Pero eso está bien siempre que use esos objetos de vista solo para fines de visualización de la interfaz de usuario y no comience a usarlos incorrectamente para la manipulación de datos u operaciones comerciales.
Otro tema que puede leer para comprenderlo mejor es el patrón de segregación de responsabilidad de consulta de comandos de Fowlers , en contraste con CRUD. Muestra situaciones en las que tienen sentido diferentes modelos de objetos para consultar datos y actualizarlos en una base de datos. Aquí, el mapeo de un modelo de objeto a otro también puede hacerse mediante una herramienta como AutoMapper.
fuente
Es una buena práctica tener una clase de modelo de vista separada para usar en la capa de IU en lugar de usar la misma clase que se usa en la capa de datos. Su UI / página web puede necesitar mostrar otros bits de información que no están estrictamente relacionados con la entidad de datos. Al crear esta clase adicional, te estás dando la libertad de modificar tu IU fácilmente a medida que los requisitos cambian con el tiempo.
En cuanto al uso de AutoMapper, personalmente lo evito por 3 razones:
Fallas silenciosas más comunes
Debido a que AutoMapper asigna automáticamente entre las propiedades, cambiar un nombre de propiedad en una clase y no en la otra hará que se omita la asignación de propiedades. El compilador no lo sabrá. A Automapper no le importará.
Falta de análisis estático.
Entonces se le ha dado una gran base de código para tratar. Hay un millón de clases con un millón de propiedades. Parece que no se usan o son duplicados. Esa herramienta "Buscar todas las referencias" en Visual Studio lo ayudará a ver dónde se usan las propiedades y ayudará a construir un mapa en su cabeza de cómo se cuelga toda la aplicación. Pero espere, no hay referencias explícitas a la mitad de las propiedades porque se está utilizando Automapper. Mi trabajo ahora es mucho más difícil.
Requisitos tardíos que aumentan la complejidad
Automapper está muy bien cuando todo lo que quiere hacer es copiar los valores de UNA clase a otra (como suele ser el caso al INICIO del desarrollo), pero ¿recuerda esos requisitos que cambian con el tiempo? ¿Qué sucede si ahora necesita obtener valores de otras partes de su aplicación, quizás específicos del usuario que inició sesión o algún otro estado contextual?
El patrón de AutoMapper de crear las asignaciones de clase uno a uno al inicio de la aplicación no se presta bien a este tipo de cambios específicos de contexto. Sí, probablemente hay formas de hacerlo funcionar, pero generalmente me parece más limpio, más simple y más expresivo escribir la lógica yo mismo.
En resumen, antes de buscar Automapper para ahorrarse 30 segundos de asignar manualmente una clase a otra, piense en esto.
Con esto en mente, pregúntese "¿AutoMapper es útil hoy y será mañana?"
fuente
En mi experiencia, cuando alguien se ha quejado de "demasiado repetitivo" y quiere usar AutoMapper, ha sido uno de los siguientes:
Sin embargo:
Si ha elegido un idioma estático, aproveche el idioma. Si está intentando eludir los controles en el lenguaje que ayudan a evitar errores debido al uso excesivo de API de reflexión y magia como AutoMapper, solo significa que ha elegido un lenguaje que no es satisfactorio para sus necesidades.
Además, el hecho de que Microsoft haya agregado características a C # no significa que sean un juego justo en todas las situaciones o que admitan las mejores prácticas. La reflexión y la palabra clave "dinámica", por ejemplo, deben usarse en casos en los que simplemente no puede lograr lo que necesita sin ellas. AutoMapper no es una solución para ningún caso de uso que no pueda resolverse sin él.
Entonces, ¿la duplicación de clases es un mal diseño? No necesariamente.
¿AutoMapper es una mala idea? Si, absolutamente.
El uso de AutoMapper indica deficiencias sistémicas en el proyecto. Si lo necesita, deténgase y piense en su diseño. Siempre encontrará un diseño mejor, más legible, más fácil de mantener y más libre de errores.
fuente
Aquí hay un problema más profundo: el hecho de que C # y Java insisten en que la mayoría / todos los tipos deben distinguirse por nombre en lugar de estructura: por ejemplo,
class MyPoint2D
yclass YourPoint2D
son tipos separados incluso si tienen las mismas definiciones exactas. Cuando el tipo que desea es "algo anónimo con unx
campo y uny
campo" (es decir, un registro ), no tiene suerte. Entonces, cuando quieras convertir unYourPoint2D
aMyPoint2D
, tienes tres opciones:this.x = that.x; this.y = that.y
La opción 1 es bastante fácil en pequeñas dosis, pero rápidamente se convierte en una tarea cuando la cantidad de tipos que necesita mapear es grande.
La opción 2 es menos que deseable porque ahora tiene que agregar un paso adicional a su proceso de compilación para generar el código y asegurarse de que todo el equipo reciba la nota. En el peor de los casos, también debe rodar su propio generador de códigos o sistema de plantillas.
Eso te deja con la reflexión. Puede hacerlo usted mismo o puede usar AutoMapper.
fuente
Automapper es una de esas bibliotecas / herramientas donde el emperador está literalmente corriendo desnudo. Cuando pasa el logo deslumbrante, se da cuenta de que no hace nada que no pueda hacer manualmente con mejores resultados.
Si bien no estoy completamente seguro de cómo insinúa a los miembros de mapeo automático, lo más probable es que implique una lógica de tiempo de ejecución adicional y una posible reflexión. Esto puede ser una penalización de rendimiento significativa a cambio de un ahorro de tiempo. El mapeo manual, por otro lado, la sugerencia se ejecuta mucho antes del tiempo de compilación.
En los casos en que AutoMapper no tiene idea, debe configurar la asignación con código y establecer banderas. Si va a molestarse en hacer todo el trabajo de configuración y código, debe preguntarse cuánto ahorra con el mapeo manual.
fuente