2012-01-19 7 views
12

He estado utilizando AutoMapper durante unos meses con éxito, pero ahora he tropezado con un obstáculo. Lo que necesito (o creo que necesito) es un mapeo bidireccional. Esto es así cuando cargo un elemento de la base de datos para reproducirlo en la pantalla (objeto de dominio -> modelo de vista) y cuando los usuarios realizan cambios en dicho elemento y lo vuelven a asignar a mi objeto de dominio (ver modelo -> objeto de dominio).¿Qué hay de malo en el mapeo bidireccional?

Entiendo que simplemente podría crear una asignación en mi perfil para manejar el mapeo bidireccional, pero estaba leyendo here que no son necesarios los mapas bidireccionales. Muchas personas indican que hacerlo es una respuesta a no solucionar el problema mayor (cualquiera que sea).

Me pregunto por qué es esto un olor a código?

Respuesta

11

Cuando era un desarrollador junior, trabajé en un gran proyecto que básicamente hizo lo que usted está describiendo. No usamos el Automapper, pero creamos viewmodels que encapsulaban objetos de dominio, lo que básicamente significaba que obtenía los cambios de la vista directamente en los objetos del dominio. Simplemente persista en sus cambios y asegúrese de que estén donde usted quiere que estén (en la base de datos). Esa aplicación debería haber lanzado hace cuatro años, pero todavía están luchando.

¿Por qué es esto un olor? Bueno, estás perdiendo el rastro de cualquier intento de por qué estás cambiando cosas. Y la intención es algo realmente importante a medida que su aplicación crece y se vuelve más compleja. Es difícil aplicar nuevas reglas en su dominio porque es difícil ver exactamente qué operaciones son válidas para su dominio. Si haces que tu modelo de dominio sea automáticamente mapeable, también es muy anemic.

Como Jimmy señala, desea modelar su dominio después de los requisitos de su dominio, no de los requisitos de Automapper. Si Automapper fuera a trabajar directamente en su modelo, tendría que hacer ajustes, como hacer que los generadores de propiedad sean públicos, aunque eso podría no ser una buena idea desde la perspectiva del modelado de dominios.

Creo que el problema más grande es que un modelo de dominio que se puede automatizar directamente desde viewmodels no transmite la intención, ni el encapsulado de una manera satisfactoria. Si está creando una aplicación pequeña, entonces la arquitectura de estilo de registro/conjunto de datos podría no ser algo malo, pero si la solución es ampliada o compleja, tiene problemas mayores que el mapeo desde el modelo de vista al dominio.

En la aplicación actual en la que estoy trabajando, usamos automapper para mapear de dominio a dto y de dto a viewmodels. Cuando algo debe persistir, traducimos la operación en viewmodels en comandos explícitos que se ejecutan contra el dominio. Nunca recomendaría una arquitectura de tres capas en cualquier aplicación a gran escala (cliente delgado o grueso).

+0

Awesome answer. Gracias. – Nosila

+0

+1 Bien escrito. No podría estar más de acuerdo. –

+0

¿Qué pasa si no hay intención? Supongamos que desea asignar un objeto de dominio a un objeto de persistencia en el repositorio. La intención de cambio ya se ha expresado en el nivel de dominio. En este caso, creo que el mapeo bidireccional es válido. – Guillaume

Cuestiones relacionadas