2009-05-15 16 views
5

Mi piace separare in modo pulito pubblico e dominio oggetti (così, ibernazione non aiuterà qui) l'uno dall'altro, il che finisce per costringermi a scrivere un sacco di codice per mappare un oggetto a un altro. Quali strumenti/plug-in sono disponibili per prendere la noia di dover fare manualmente questa mappatura in .NET? Ogni volta che Google questo, pensa che sto volendo fare ORM, che è non quello che sto cercando . Grazie!Utilità di mappatura oggetti su oggetti

EDIT 19: 33CST: OK, ho scritto un'applicazione molto semplice (codice scritto molto velocemente) che dimostra quello che sto cercando. Mi sto solo chiedendo se c'è un plugin VS che farà questo per me.

VS2008 Solution

+0

A vantaggio Di questa domanda, perché stai cercando una soluzione di generazione di codice statico, che probabilmente porterà a test fragili, invece di una soluzione di infrastruttura di livello inferiore come AutoMapper? – MotoWilliams

+0

Forse usare una [lingua] (http://ruby-lang.org/) con un forte supporto per la meta-programmazione sarebbe appropriato? Strumento giusto per il lavoro giusto, eh? – stevenharman

risposta

6

Quindi, apparentemente insoddisfatto di una soluzione runtime, ho scritto una piccola utility che creerà i mapping nel codice. Puoi scaricare la fonte qui sotto e scrivere una migliore gestione degli errori, ecc., Ecc. Apprezzerei qualsiasi modifica interessante che fai, è stata fatta in fretta, ma funziona. Si prega di rispettare il codice è stato rilasciato sotto il LGPL.

Object To Object Mapping Utility Source Code

AGGIORNAMENTO 23 giugno 2009: Ho fatto alcuni aggiornamenti al codice che ripulito tutto (un po ') ed anche ha aggiunto la possibilità di salvare una mappatura di un file in modo che in seguito sarà possibile modificare esso.

+0

Ho trovato questo utile, ma volevo apportare alcune modifiche. L'ho caricato su https://github.com/Swoogan/otom. Solo una nota, non hai una licenza o informazioni sul copyright nello zip originale. – Swoogan

+0

@Swoogan Wow! L'ho scritto molto tempo fa. Mi fa piacere che l'abbia trovato utile! Grazie per il testa a testa. –

14

Si potrebbe voler dare AutoMapper una prova. Sembra quello che stai cercando.

+0

+1 - link eccellente, grazie mille! Questo potrebbe salvare innumerevoli blocchi di incarichi left-right nel mio codice! :-) –

+0

L'ho effettivamente guardato prima di postare, ma sembra ancora che tu debba scrivere codice - voglio davvero che lo generi automaticamente, anche se questo significa che trascino i punti tra Proprietà per dirgli come mappa degli oggetti.Sarebbe infinitamente più veloce di battere il codice standard. –

+1

@wayne, finché gli oggetti seguono alcune convenzioni di denominazione, Automapper rileva automaticamente la mappatura. Altrimenti devi fare un po 'più di configurazione in anticipo, ma è comunque una vittoria. Non sono sicuro di cosa vorresti che venissero autogenerati di più? –

3

C'è anche un progetto interessante chiamato Otis. Di seguito è riportato l'esempio * mappatura .otis.xml preso dalla pagina di documentazione:

<?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> 

di leggere il file di mapping dal gruppo:

// 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, dove ho visto prima? ;)

+0

+1 sembra molto interessante anche a me - Mi piace anche l'idea di poter esternalizzare la mappatura in un file di configurazione XML, se necessario/appropriato –

+0

Otis è morto ora. Vedi qui http://code.google.com/p/otis-lib/issues/detail?id=15#c1 – MajesticRa

3

utilizzare ValueInjecter, con esso è possibile mappare qualsiasi cosa a qualsiasi cosa, ad es.

  • oggetto < -> object
  • oggetto < -> Modulo/WebForm
  • DataReader -> object

ed ha funzioni interessanti come: l'appiattimento e unflattening

+1

L'intero punto, tuttavia, non è scrivere codice perché si tratta di mapping statici. L'idea è che tutto ciò che sta accadendo è un compito da destra a sinistra, quindi (IMHO) non merita alcuna riflessione, ginnastica runtime, e così via. Sbaglia il gong 'premature optimization' tutto quello che vuoi, ma c'è * ottima * efficienza nel fare le cose al momento della compilazione rispetto al runtime. Ho visto librerie come Dozer (per Java) che masticano la CPU per qualcosa di semplice come un compito da destra a sinistra. –

+1

@Wayne Hartman Non ho avuto problemi con l'efficienza, utilizza TypeDescriptor e ho scritto test in cui sono stati eseguiti 1 milione mapping in 2 secondi, quindi non penso che la velocità/memoria/cpu sia un problema qui – Omu