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):
Dalla parte del mio programma ho delle classi specializzate che usano le interfacce per utilizzare i dati:
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).
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