2009-05-15 14 views
5

Me gusta separar limpiamente los objetos públicos de dominio (entonces, nHibernate no va a ayudar aquí) el uno del otro que termina forzándome a escribir una gran cantidad de código para mapear un objeto a otro. ¿Qué herramientas/plugins hay para tomar el tedio de tener que hacer manualmente hacer este mapeo en .NET? Siempre que lo busco en Google, piensa que quiero hacer ORM, que es , no lo que estoy buscando . ¡Gracias!Object to Object Mapping Utility

EDITAR 19: 33CST: OK, escribí una aplicación muy básica (código escrito muy rápidamente) que demuestra lo que estoy buscando. Me pregunto si hay un complemento VS que haga esto por mí.

VS2008 Solution

+0

Para el beneficio de esta pregunta, ¿por qué está buscando una solución de generación de código estático, que probablemente conducirá a pruebas frágiles, en lugar de una solución de infraestructura de nivel inferior como AutoMapper? – MotoWilliams

+0

Quizás sería apropiado usar un [idioma] (http://ruby-lang.org/) con un fuerte soporte de meta-programación? Herramienta correcta para el trabajo correcto, ¿eh? – stevenharman

Respuesta

6

Por lo tanto, aparentemente insatisfecho con una solución de tiempo de ejecución, he escrito una pequeña utilidad que creará las asignaciones en el código. Puede descargar la fuente a continuación y escribir mejor manejo de errores, etc. Apreciaría todas las modificaciones geniales que haga, esto fue hecho a toda prisa, pero funciona. Por favor, respete que el código se publique bajo el LGPL.

Object To Object Mapping Utility Source Code

Actualización 23-JUN-2009: Hice algunos cambios al código que lo limpió (un poco) y tambien tiene añadido la posibilidad de guardar una asignación a un archivo de forma que se puede modificar más adelante eso.

+0

Encontré esto útil, pero quería hacer algunos cambios. Lo he subido a https://github.com/Swoogan/otom. Solo una nota, no tienes una licencia o información de copyright en el archivo comprimido original. – Swoogan

+0

@Swoogan Wow! Lo escribí hace mucho tiempo. ¡Me alegra que lo haya encontrado útil! Gracias por el aviso. –

14

Es posible que desee dar a AutoMapper intentarlo. Suena como lo que estás buscando.

+0

+1 - excelente enlace, muchas gracias! ¡Esto podría salvar innumerables bloques de asignación de izquierda a derecha en mi código! :-) –

+0

De hecho lo miré antes de publicarlo, pero todavía parece que tiene que escribir el código: realmente quiero que se autogenere, incluso si eso significa que arrastro y suelte puntos entre Propiedades para contarle cómo mapa de objetos.Eso sería infinitamente más rápido que golpear el código repetitivo. –

+1

@wayne, mientras sus objetos sigan algunas convenciones de nombres, Automapper se da cuenta de la asignación automáticamente. De lo contrario, debe hacer un poco más de configuración por adelantado, pero sigue siendo una victoria. No estoy seguro de qué más querrías autogenerado? –

3

También hay un proyecto interesante llamado Otis. A continuación se muestra el ejemplo de mapeo * .otis.xml tomada de la página de documentación:

<?xml version="1.0" encoding="utf-8" ?> 
<otis-mapping xmlns="urn:otis-mapping-1.0"> 
<class name="Otis.Tests.UserDTO, Otis.Tests" source="Otis.Tests.Entity.User, Otis.Tests" > 
    <member name="Id" /> 
    <member name="Age" /> 
    <member name="UserName" expression="$UserName.ToUpper()" nullValue="[unknown]" /> 
    <member name="FullName" expression="[$FirstName + ' ' + $LastName]" /> 
    <member name="ProjectCount" expression="$Projects.Count" /> 
    <member name="Title" expression="$Gender" > 
     <map from="Gender.Male" to="Mr." />  <!-- projections --> 
     <map from="Gender.Female" to="Mrs." /> 
    </member> 
    <member name="Birthday" expression="$BirthDate" format="Born on {0:D}"/> 
    <member name="ProjectCount" expression="$Projects.Count" /> 
    <member name="AvgTaskDuration" expression="avg:$Projects/Tasks/Duration" /> 
    <member name="MaxTaskDuration" expression="max:$Projects/Tasks/Duration" />    
</class> 

para leer los archivos de asignación de la asamblea:

// configure the new Configuration object using metadata of types in the current assembly 
Configuration cfg = new Configuration();   // instantiate a new Configuration, one per application is needed 
cfg.AddAssembly(Assembly.GetExecutingAssembly()); // initialize it 

Hmm, ¿dónde he visto ¿antes de? ;)

+0

+1 parece muy interesante, también me gusta la idea de poder externalizar la asignación en un archivo de configuración XML si es necesario/apropiado –

+0

Otis está muerto ahora. Vea aquí http://code.google.com/p/otis-lib/issues/detail?id=15#c1 – MajesticRa

3

use ValueInjecter, con ella puede hacer un mapa de todo a cualquier cosa, p.

  • objeto < -> Objeto
  • objeto < -> Formulario/WebForm
  • DataReader -> Objeto

y tiene características interesantes como: aplanamiento y unflattening

+1

Sin embargo, todo el punto no es escribir código porque estas son asignaciones estáticas. La idea es que todo lo que está pasando es de asignación de derecha a izquierda, por lo que (en mi humilde opinión) no merece ningún reflejo, gimnasia de tiempo de ejecución, y todo. Golpea el gong de "optimización prematura" todo lo que quieras, pero hay una * gran * eficiencia al hacer cosas en tiempo de compilación frente a tiempo de ejecución. He visto bibliotecas como Dozer (para Java) simplemente masticar CPU para algo tan simple como las asignaciones de derecha a izquierda. –

+1

@Wayne Hartman No he tenido ningún problema con la eficiencia, utiliza TypeDescriptor y escribí la prueba donde se realizan 1 millón de asignaciones en 2 segundos, así que no creo que la velocidad/memoria/CPU sea un problema aquí. – Omu

Cuestiones relacionadas