LazyLoading, collection e il VirtualMode
In questo caso parliamo di qualcosa che è ancora in una versione più che embrionale... è quasi tutto ancora nella mia testa... o meglio ben dettagliato sul fido OneNote.
Il problema è questo:
IMyEntity entity = whatEverDataProvider.GetMyEntity();
IMyCollection list = entity.Children;
Int32 count = list.Count;
if( count > 100 )
{
foreach( var child in list )
{
//Do something with child
}
}
e voi direte... ma dove sta il problema? sta sta... ;-) supponiamo che la collection "Children" sia caricata in modalità lazy e che, nell'esempio, contenga 90 elementi: bene stiamo caricando 90 "item" solo per fare un confronto con il Count di questi elementi. E giustamente voi potreste ribadire: si certo... bravo, fai un metodo GetCount() sul data provider...
IMyEntity entity = whatEverDataProvider.GetMyEntity();
Int32 count = whatEverDataProvider.GetChildrenCount( entity );
...etc
+1 sono perfettamente d'accordo, ma lo sviluppatore è pigro e se trova una proprietà Count usa quella anche se le policy, le regole, gli accordi o le litigate dicono diversamente... quindi mi sono chiesto, pensando al deferred loading di linq, ma perchè non introdurre questo concetto in una collection custom? e quindi avere la collection istanziata, ma vuota e solo ed esclusivamente al primo tentativo di lettura, ad esempio un GetEnumerator(), caricare effettivamente i dati; se poi siamo veramente smart potremmo implementare delle logiche per ad esempio ritornare il solo "Count" all'atto della richiesta.
A questo punto la domanda sicuramente è: ma perchè ti vuoi fare del male da solo e non usi un ORM? me lo sono chiesto anche io... e mi sono risposto:
- Il cliente non ne vuole sapere. Si lo so non è una scusa valida ;-);
- Il team in questo momento, compreso il sottoscritto, ha miseri skill su NH e il lavoro è già abbastanza complesso di suo senza introdurre altre problematiche;
- Abbiamo requisiti che la "mia fonte" dice non essere esaudibili con NH;
- varie ed eventuali...;