Penso di esserci riuscito... Ti chiedo solo se secondo te ho fatto in modo corretto mettendo quello che ho fatto partendo dal principio.
Ho creato delle interfacce
Public Interface ICliente
ReadOnly Property Codice() As String
ReadOnly Property RagioneSociale() As String
ReadOnly Property Indirizzo() As String
ReadOnly Property PartitaIVA() As String
'... ecc...
End Interface
Public Interface IClienti
Function GetClienti() As List(Of MyCommon.ICliente)
'...ecc...
End Interface
Nel layer database ho creato un adapter che implementa le interfacce create (ok ho usato un Datatable tipizzato, lo ammetto, ma per ora sono già contento così) ed in particolare senza entrare nel merito del funzionamento ho implementato l'interfaccia IClienti come di seguito indicato:
Ho quindi creato una classe Factory:
A questo punto ho implementato le mie classi reali
Public Class Cliente
Private _cliente As MyCommon.ICliente
Public Sub New(ByVal cli As MyCommon.ICliente)
_cliente = cli
End Sub
Public ReadOnly Property Codice() As String
Get
Return _cliente.Codice.ToString.Trim
End Get
End Property
Public ReadOnly Property RagioneSociale() As String
Get
Return _cliente.RagioneSociale.ToString.Trim
End Get
End Property
'... ecc...
End Class
Public Class Clienti
Inherits CollectionBase
Private _adapter As List(Of MyCommon.ICliente)
Sub New()
Try
_adapter = (New MyCommon.MyFactoryClienti).GetClienti '<---QUI USO IL FACTORY
Catch ex As Exception
Throw ex
End Try
Popola()
End Sub
Private Sub Popola()
For Each cl As MyCommon.ICliente In _adapter
Me.List.Add(New Cliente(CType(cl, MyCommon.ICliente)))
Next
End Sub
'... ecc...
End Class
In ultimo, per completezza, uso le classi reali per visualizzare/elaborare i dati sulla form
Public Class MyForm
Dim bs As BindingSource
Private Sub MyForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Try
Dim cc As Clienti = New Clienti
bs = New BindingSource
bs.DataSource = cc
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
dgv.DataSource = bs
End Sub
'... ecc...
End Class
Credo, in questo modo, di aver dato il massimo grado di astrazione possibile fra il Data Access Layer e il Business Object Layer utilizzando il pattern Abstract Factory.
Ora le immancabili domande:
- Ha senso creare un'interfaccia per la classe factory? Non nego di averci provato e non esserci riuscito, ma poi ho abbandonato perchè non credo sia fondamentale
- Usando la Reflection (ho iniziato a studiarla in questi giorni per risolvere questa cosa) come posso sapere quale Classe devo istanziare se nel mio assembly se ce ne sono più di una (ora uso una costante)? Sarebbe correto sapere quale classe implementa l'interfaccia (sempre che solo una la implementi). Come è possibile rendere più dinamico questo passaggio.
- E' correto creare un singolo Factory per tutti i tipi di oggetto o è meglio creare un factory per ogni tipo di oggetto (Avrò anche gli oggetti Articoli, Operatori, ecc...). Direi di no, però andrei a "complicare" il codice ed avendo i factory nel "Framework" della mia applicazione potrebbe quasi essere fattibile.
Scusami tanto se ne approfitto ma ho capito più nelle ultime 48 ore che negli ultimi 48 giorni... (P.S.: ho già provveduto ad acquistare manuali sui Pattern e su LINQ e stò provando a capire la Reflection).
Ciao!!!
--------------
Maurizio Brini
--------------
Nessuna impresa è mai stata compiuta da un uomo ragionevole