Architettura ed ereditarietà

mercoledì 19 novembre 2008 - 18.20

Teech Profilo | Expert

Stò sviluppando un programma che utilizza 2 DB diversi ed i dati sono distribuiti su entrambi i DB. Uno è gestito da un gestionale (quindi non posso implementarlo) e uno serve a me per gestire i miei dati. Nella fattispecie leggo dal gestionale delle anagrafiche di clienti e le integro con i dati di commessa presenti sul mio DB. Visto che svilupperò spesso delle applicazioni per questo gestionale mi stò creando delle strutture per poter riutilizzare il mio codice.

Attualmente ho creato un adapter che legge i dati dal gestionale (uso ADO.NET) e delle classi astratte personalizzate per gestire i dati: l'Adapter legge i dati e le classi vengono istanziate e popolate con i dati presi dal gestionale senza referenziare nulla ma attraverso la reflection e degli assembly che contengono le interfacce per comunicare.
Le interfacce sono le seguenti:
Public Interface ICliente ReadOnly Property Codice() As String ReadOnly Property RagioneSociale() As String '... ecc... End Interface Public Interface IClienti Property Connection() As SqlClient.SqlConnection Function GetClienti(ByVal filtro As IFiltroClienti) As List(Of ICliente) End Interface Public Interface IFiltroClienti Property Codice() As String Property RagioneSociale() As String '... ecc... End Interface
L'Adapter è fondamentalmente un DataTable tipizzato che ho creato a mano (codice molto semplificato):
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Dalla parte del mio programma ho delle classi specializzate che usano le interfacce per utilizzare i dati:
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Per istanziare le classi e metterci i dati uso i seguenti metodi (messi in un assembly separato) come di seguito riportato:
Public Class FactoryClienti Private _factory As IClienti Private Shared _assembly As Reflection.Assembly Sub New(ByVal assemblyname As String) Try If _assembly Is Nothing Then _assembly = Reflection.Assembly.LoadFrom(assemblyname) _factory = CType(_assembly.CreateInstance("AdapterClienti"), IClienti) Catch ex As Exception Throw ex End Try End Sub Public Function GetClienti(ByVal Filtro As IFiltroClienti) As List(Of ICliente) Dim l As New List(Of ICliente) Try l = _factory.GetClienti(Filtro) Catch ex As Exception Throw ex End Try Return l End Function End Class
Fino a qui tutto funziona a meraviglia e sono abbastanza soddisfatto... Ora il problema: devo estendere le mie classi Cliente perchè mi servono altri dati provenienti da altre tabelle e, come dicevo prima vorrei mantenere questa struttura inalterata in quanto mi servirà per progetti futuri... Ho iniziato a farlo innanzitutto creando una classe Adapter che eradita da quella già creata: facendo l'overrides del metodi InitQualcosa ho provveduto a passare i CommandText adeguati che mi "prelevano" dal DB anche altri dati (sul DB ho agito con dei Linked Server e ho creato delle Function adeguate alla mia situazione per mettere in relazine tabelle presenti su DB diversi).
Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra
Come potete aver notato ho usato una nuova interfaccia per i clienti con proprietà estese (non so se è corretto ma non mi è venuto in mente un sistema migliore): la nuova interfaccia è la seguente
Public Interface IClienteDB Inherits ICliente ReadOnly Property Commesse() As Integer ReadOnly Property CommesseAperte() As Integer ReadOnly Property CommesseChiuse() As Integer End Interface
Ora, più vado avanti è più mi rendo conto che per fare una estensione delle proprietà sono costretto a riscrivere pezzi di codice anche importanti, non ultimo il Factory che mi restituisce oggetti ICliente e non IClienteDB...

Avete consigli, dritte, suggerimenti per fare al meglio questa operazione (che sulla carta mi sembrava più semplice)?

Grazie soprattutto di aver avuto la pazienza di leggere tutto questo lungo post...

Ciao!!!

--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5