LazyMapper
Quante volte abbiamo scritto codice simile a questo?
TextBoxNome.Text = utente.Nome;
DropDownListBoss.SelectedValue = utente.Boss.Id;
// ... altri 20
In molte applicazioni web, il databinding è una delle maggiori fonti di errori in produzione. Questo è dovuto non tanto alla complessità tecnica, quanto alla notevole quantità di codice richiesta e al fatto che questi errori non siano solitamente rilevati ne dal compilatore ne dai test automatici.
Da anni gli ambienti di sviluppo forniscono soluzioni più o meno automatizzate a questo problema, che solitamente consistono nel trascinare una tabella del db (o una classe) su un form e cliccare una o più volte sul tasto "avanti".
Alcuni framework (Monorail, Microsoft MVC) offrono nativamente queste funzionalità.
Queste soluzioni possano essere molto efficaci in alcuni contesti, e vale sicuramente la pena approfondirle.
Ho constatato però la loro tendenza ad introdurre vincoli più o meno forti sulle tecnologie da utilizzare (DataSet, Object/Sql DataSource, LinqToSql, ActiveRecord, ...) e a complicarci più del dovuto la vita nei casi in cui sia richiesta una gestione personalizzata del databinding.
Per queste ragioni, ho sviluppato e reso disponibile LazyMapper, una libreria minimale che aiuta nel mapping dei controlli asp.net con le corrispondenti proprietà degli oggetti di dominio.
Caratteristiche
Ecco le linee guida che ho seguito:
- Pochi vincoli tecnologici: la libreria lavora su pagine o user controls asp.net (2.0) e su semplici oggetti, quindi risulta particolarmente adatta all'uso con un domain model.
- Nessuna configurazione: niente file di mapping o attributi, ma solo convenzioni sui nomi dei controlli e un minimo di introspezione sui tipi delle proprietà (ad esempio, una proprietà numerica legata ad un textbox o ad un dropdown viene automaticamente convertita).
- Agilità: al momento LazyMapper gestisce casi "semplici".
Anche se verrà migliorata in futuro, l'idea non è quella di farla diventare un framework completo per il databinding, ma piuttosto quella di mantenerla agile e limitarsi a semplificare la gestione "manuale" di casistiche particolari mediante codice ad hoc o classi derivate. - Semplicità: si tratta di meno di 300 righe di codice.
Ambiente di sviluppo
.NET Framework 2.0/3.5, linguaggio C#.
Non sono state utilizzate librerie/tool di terze parti ad eccezione di NAnt per l'automazione della distribuzione e NUnit per i test.
Esempio di utilizzo
Con estrema fantasia, userò come esempio un oggetto User dotato di proprietà Id (int) e Name (string).
Per mettere in opera LazyMapper è necessario:
- Dare ai controlli il nome della proprietà preceduto da un prefisso (di default è "lm_" ma può essere modificato):
Id:
<asp:Label ID="lm_Id" runat="server" />
</br>
Name:
<asp:TextBox ID="lm_Name" runat="server" /> - Utilizzare i metodi FormToObject e ObjectToForm della classe LazyMapper per riempire i controlli del form con le proprietà di un oggetto e viceversa.
new LazyMapper().ObjectToForm(user, this);
// ...
new LazyMapper().FormToObject(user, this); - Non esiste un passo 3, abbiamo finito. :-)
Screenshot
Ecco una schermata di esempio, per avere un'idea dei tipi di controlli gestiti.
Documentazione
Todo. :-)
Per l'utilizzo della libreria, fare riferimento ai codici sorgenti: contengono un progetto web di prova con due pagine di esempio (una semplice e una leggermente più articolata).
Licenza
LazyMapper è liberamente utilizzabile (vedi licenza inclusa nella distribuzione).
Download
Sorgenti ed esempi: LazyMapper-1.1.0.150-src.zip md5
Sviluppi futuri
E' mia intenzione aggiungere funzionalità "quanto basta, ma non oltre".
Sto pensando di introdurre alcuni eventi nel mapper per permettere la modifica del comportamento predefinito senza ricorrere a classi derivate.
Perchè Lazy?
Perchè richiede poco sforzo per essere utilizzata, ed evita la scrittura di righe di codice (risparmiandoci magari qualche baco).

twitter
linkedIn
github