Al atravesar capas, es muy tedioso realizar asignaciones de derecha a izquierda como una manera de completar los modelos. Por ejemplo:Copia de modelos entre capas
employeeViewModel.FirstName = employeeModel.FirstName;
employeeViewModel.LastName = employeeModel.LastName;
...
Por lo tanto, podemos construir una ModelCopier que utiliza la reflexión para copiar modelos:
var employeeViewModel = ModelCopier.Copy<EmployeeViewModel>(employeeModel);
Esta técnica simplifica enormemente la tarea. Sin embargo, hay algunas cosas que son bastante inquietante sobre esto:
- Hemos perdido efectivamente la capacidad de rastrear los usos de las propiedades en los objetos de origen y destino. Por ejemplo, encontrar usos (en Resharper) de la propiedad FirstName no revela los casos de ModelCopier.
- Si cambiamos el nombre de una propiedad en la clase de origen o de destino, podemos causar involuntariamente excepciones de tiempo de ejecución ya que es posible que no nos demos cuenta de que debemos actualizar tanto la clase de origen como la de destino.
En un extremo del espectro, podemos usar el reflejo que es muy fácil, pero a costa de la mantenibilidad. El extremo opuesto del espectro es muy tedioso pero muy fácil de mantener.
Reflexión (Fácil y peligroso) < -----> asignación directa (tedioso y Mantenible)
Tengo curiosidad por si alguien ha encontrado un compromiso que ofrece la facilidad de uso de la reflexión de la copia con la mantenibilidad de la asignación directa.
Una solución que hemos entretenido fue crear un complemento que genere métodos de extensión que manejen la asignación de propiedades para cada caso. En otras palabras, crea una herramienta que manejará la parte tediosa.
EDIT:
Por favor, comprenda que esta cuestión no se trata de qué herramienta de mapeo de usar. Estoy tratando de comprender cómo podemos disfrutar de los beneficios del mapeo basado en la reflexión, al mismo tiempo que disfrutamos de los beneficios de la mantenibilidad proporcionados por la asignación directa (o un contrato de mapeo de propiedad).
@themarcuz - Estoy de acuerdo, un conjunto de pruebas unitarias detectaría el problema. Mientras discutíamos el tema, lo mencionamos y el principal detractor fue que depende de que la prueba de la unidad esté funcionando. Tal vez la mejor respuesta es asegurarse de que tengamos pruebas unitarias que prueben explícitamente la operación de mapeo. Todavía estaría bien si pudiéramos detectar el problema en tiempo de compilación. –
@Page Brooks: por definición, el compilador ejecuta el código que ha escrito. Entonces, la única forma de que lo haga es que el cheque que necesita es escribir el código (manualmente o con un complemento VS como lo indicó anteriormente). No hay otra opción: - desea verificar el código en tiempo de compilación -> escribe el código (que es lo que quiere evitar) - desea evitar escribir el código -> pierde la funcionalidad de verificación del compilador (pero usted no quiere esto también) Pero lo que tiene que lograr es evitar que alguna actualización desencadena un error en el tiempo de ejecución: mejorar el comportamiento de prueba de su equipo es la mejor manera, IMHO – themarcuz
Craig Lairman sugest para registrar cada 30 minutos ... pero digamos una hora ... y tienes que ejecutar toda la prueba antes del check-in. Así que no hay mucho espacio para ese tipo de errores. Sé que no es a prueba de mono como lo es el compilador, pero es la mejor solución – themarcuz