home

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:

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:

  1. 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" />

  2. 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);

  3. Non esiste un passo 3, abbiamo finito. :-)

Screenshot

Ecco una schermata di esempio, per avere un'idea dei tipi di controlli gestiti.

screenshot

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).