lunedì 8 settembre 2008

Gestire SQLDataProvider troppo grandi

A chi si trova a sviluppare moduli particolarmente complessi sarà sicuramente capitato di dover gestire file SQLDataProvider, contenenti le logiche di interrogazione della base dati, con una quantità di righe notevole (io ad esempio ho superato le 5000 righe). Ciò comporta lentezza nello sviluppo per due motivi. Da una parte Visual Studio impiega un tempo enorme nelle operazioni di code highlighting e di individuazione di metodi, proprietà e quant'altro. Dall'altra parte i tempi di compilazione aumentano in funzione delle dimensioni dei file.

Per ovviare a questi inconvenienti c'è un modo abbastanza semplice. La struttura del layer dati di DNN prevede una interfaccia, DataProvider.vb, e una classe che la implementa, SQLDataProvider.vb, che contiene le logiche di comunicazione con il database. All'interno del controller (o dei contreller, in base a come viene strutturato il modulo) viengono richiamati i metodi della classe implementativa, e istanziata la classe SQLDataProvider, tramite il metodo DataProvider.Instance().NumeMetodo().

Per separare in più parti il DataProvider basta dunque duplicarlo e dividerlo per aree funzionali. Ad esempio posso prevedere lo stesso livello di separazione che viene adottato per le classi di controller. Dunque so ho un controller dedicato alle funzionalità anagrafiche e uno alle funzionalita generali posso creare due DataProvider, e quindi due SQLDataProvider, che contengono rispettivamente i metodi per gestire a DB le anagrafiche e le funzioni generiche.

Di seguito un esempio di struttura con più DataProvider.


App_Code
........ MyApp
................ DataProvider.vb
................ DataProviderAnagrafiche.vb
................ SQLDataProvider.vb
................ SQLDataProviderAnagrafiche.vb



All'interno dei metodi della classe controller sarà quindi necessario fare la chiamata per istanziare la classe SQLDataProviderAnagrafiche in questo modo:



Public Function getObjAnagrafica(ByVal idAnagrafica As Long) As Components.Anagrafica
Return CType(CBO.FillObject(DataProviderAnagrafica.Instance().getObjAnagrafica(idAnagrafica ), GetType(Components.Anagrafica)), Components.Anagrafica)
End Function

Nessun commento: