Come dicevo ho fatto alcuni refactoring e posso mostrare intanto qualche riga di codice per far capire la semplicità che porta questo progetto:
_bm = BindManagerItalianExt.MakeItalianBindManager<Gara>(GaraEntry);
_bm.Add(DataGara, "Data").Required(true);
_bm.Add(Luogo).Required(true);
_bm.Add(TourAssociato).DbMethods<Tour>();
Cosa fa questo pezzo di codice? Parecchio devo dire (sennò dove sta il bello?).
Innanzitutto notare come NON uso la key new per creare una nuova istanza. In realtà uso (come si può intuire) una classe statica predisposta per contenere vari inizializzatori come per esempio il MakeItalianBindManager che non fa altro che pre-impostare una serie di convenzioni per l'italiano (vedi messaggi di errore-template personalizzati, string formatting e quant'altro).
Il primo Add prende come primo parametro DataGara che è un TextBoxDate (ovvero un TextBox personalizzato per gestire le date) mentre il secondo indica il nome del membro destinatario di Gara per l'istanza GaraEntry (comincia a essere più chiaro? :D)
Il secondo Add Luogo invece usa una convenzione: Luogo è una textbox il cui id e nome è Luogo...il membro quindi collegato sarà Gara.Luogo (niente di più facile).
Avete notato i .Required(true)? semplicemente è una funzione in stile Fluent per permettermi di usare il chaining programming e fa in modo di creare al volo un validator A FIANCO del controllo già inserito nella web form: BASTA BASTA BASTA inserire decine di righe di bloating-code in cui si specifica questa o quella restrizione: NON fa parte dell'aspetto grafico e' parte integrante della LOGICA.
OVVIAMENTE posso settare anche un validator custom o ancora meglio inserire una regular expression perchè venga generato un validator apposito :D
Ultima riga interessante:
TourAssociato è una dropDownList e puttacaso il suo ID è uguale al nome membro di una proprietà su entità di tipo Tour.
DbMethods non è altri che una extension che setta le MIE funzioni per il recupero di entità attraverso Nhibernate.
La mia idea è che se ho una dropdown che mi mostra la lista di una certa serie di entità allora il suo value sarà il POID dell'entità e nel text ci sarà un testo riconoscibile: NIENTE e dico NIENTE uso di viewstate o altri giri satanici :P
Questo vuol dire che quando ricevo la REQUEST ricevo un numero e NON una entità -> quindi devo eseguire una certa CONVERSIONE dalla request all'entità:
Request["IDtour"] <> GaraEntry.TourAssociato
Ecco allora DbMethods:
public static AbsItemToBind DbMethods<T>(this AbsItemToBind item) where T : DomainObject<Int32>
{
item.FuncLoadSubEntity = x => DbUt.LazyLoad<T>(x);
item.FuncGetIdFromSubEntity = x => ((T)x).IdBp;
return item;
}
Notare il LazyLoad -> non è altri che un helper method per ISession.Get<T> di Nhibernate così da non dover caricare TUTTA l'istanza che non mi interessa: mi interessa salvare intanto il riferimento (o ancora meglio l'associazione).
Notare quanta roba è venuta fuori da 4 semplici e chiare righe di codice :D (e la storia continua eh..) :D