Oggi mi sono svegliato modellatore di applicazioni enterprice e mi sono subito messo sul domain, ma mentre implementavo l’interfaccia IClonable per le mie entity pensavo a come sarebbe stato bello non dover scrivere 30 righe di codice per ogni classe da clonare :D.
Per evitare di scrivere 30 righe su ogni classe ne ho scritte 100 utilizzando la reflection (la parte del framework che più odio), realizzando un metodo che creava una nuova istanza dell’oggetto passato, si passava tutte le proprietà e le inseriva nel nuovo oggetto. La stessa identica procedura che facevo io a mano, ora la faceva il mio metodo, con in più il vantaggio di non avere errori di battitura.
Beh che dire fantastico!!!
Ma il mio odio per la reflection è telmente tanto (forse perchè non ci capisco niente, forse perchè è lenta) ho cercato un’altra soluzione, ossia l’idea di serializzare la classe e deserializzarla in una nuova instanza.
User utente = new User();
utente.Id = Guid.NewGuid();
utente.FirstName = "Ugo";
utente.LastName = "Lattanzi";
BinaryFormatter bFormatter = new BinaryFormatter();
MemoryStream stream = new MemoryStream();
bFormatter.Serialize(stream, utente);
stream.Seek(0, SeekOrigin.Begin);
User clone = (User)bFormatter.Deserialize(stream);
Da qui a realizzare una classe che tramite i generics possa venir buona con tutte le classi è piuttosto semplice in più con il vantaggio di evitare i cast.
onestamente anche se non uso molta reflection quando la devo usare, l'ultima cosa che mi preoccupa sono le performance.
visto che alla fine quello che pesa sulle performance dell'applicazione è ben altro.
e poi non so credo che alla fine serializzare deserializzare grandi oggeti posso risultare più lento della reflection. ma non ho le provoe
ciao marco
non ho le prove
Neanche io, ma sicuramente come codice è più corto (quindi già lo preferisco) e poi meglio ancora la soluzione di Cradle di usare MemberwiseClone per una shallow copy, non la sapevo grazie Crad
Fatto buone ferie in montagna??? Ricaricato???
Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.






Stampa
Download 

All'interno dell'oggetto puoi utilizzare il metodo MemberwiseClone per effettuare una shallow copy. Ciò che fai tu invece è una deep copy che, al contrario di ciò che si possa pensare, in genere fa più male che bene (oltre che farti allegramente saltare tutti i lazy load del mondo).
Continua »»» | Rispondi »»»