Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197

    [vb.net - analisi problema] pattern - passare connessione a classi "autonome"

    avrei bisogno di un consiglio su come "modellare" alcuni oggetti per un mio progetto

    semplifico la cosa
    immaginate un contesto del genere "utente" "ruolo" "attivita"
    dove un utente appartiene ad un ruolo ed ad un ruolo sono associate diverse attivita...


    se dovessi scrivere delle classi per rendere ad "oggetti" il problema dall'alto della mia ignoranza farei cosi:


    Una classe di tipo utente con 3 metodi: Add,Remove,Edit e proprieta tipo: Name, Age, Address ecc ecc

    stessa cosa per il ruolo; i soliti metodi per aggiungere, rimuovere modificare (chiaramente nel db) e le varie prorieta relative al ruolo
    una classe per l'attivita .... bla ,bla..


    quello che intendo fare sono delle classi che vivano di vita propria, cioe siano in grado di connettersi al db, effettuare operazioni sql sulle relative

    tabelle per poi liberare le risorse quando vengono distrutte, ora tutto questo dovrebbe essere OOP(sembra che ho scoperto l'acqua calda)

    il mio dubbio, per esempio, è come passare la connessione(l'oggetto OleDbConnection) alle classi..

    ho pensato di passarla tramite il construttore della classe o tramite una proprieta? cosi facendo pero dovrei passarlo ogni volta che istanzio una classe
    come posso fare per farlo una volta sola e fare in modo che le classi se la prendano(la connessione) da sole? Esiste un pattern del genere(un modo di

    affrontare il problama degli accessi al db comune tra diverse classi?)

    una cosa che simuli le vecchie variabili globali, ma mi sembra di aver capito abbastanza bene che in un mondo ad oggetti una variabile globale non ha molto

    senso mi sbaglio?
    qualcuno che ha gia affrontato questo problema puo darmi qualche dritta?

    il linguaggio che uso è vb.net anche se quello che mi occorre di sapere è la strategia di sviluppo da adottare

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2004
    Messaggi
    200

    Re: [vb.net - analisi problema] pattern - passare connessione a classi "autonome"

    [b]qualcuno che ha gia affrontato questo problema puo darmi qualche dritta?

    il linguaggio che uso è vb.net anche se quello che mi occorre di sapere è la strategia di sviluppo da adottare
    Perchè non usi il My.Settings di tipo "Application" per memorizzare la stringa di aceesoo al database?

  3. #3
    Non so se ho capito bene...
    Io solitamente suddivido in tre strati l'applicazione, lo strato Business dove in questo caso inserirei le classi utente, ruolo eccecc; lo strato Integrazione dove inserisco le procedure di accesso al DB (connessione, select, update eccecc); lo strato di presentazione dove ci sarà l'interfaccia grafica dell'applicazione.

    Poi procedo a collegare i vari strati tra loro con opportune classi...

    Nello strato Business ci sarà una classe "pippo" dove verrà instanziato "l'oggetto" dell'integrazione, in modo che abbia accesso alle procedure che realizzano le query sul database.
    Nello strato presentazione istanzierò un oggetto "pippo" in modo da poter accedere alle procedure che operano con il DB.

    PRESENTAZIONE-->BUSINESS-->INTEGRAZIONE

    Non è semplice da spiegare e sepero di aver individuato almeno il problema.




  4. #4
    Utente di HTML.it L'avatar di afrappe
    Registrato dal
    Jan 2002
    Messaggi
    1,197
    vediamo se ho capito ....
    hai nello strato business una classe utente che ha un metodo add
    che va a richiamare una serie di metodi presenti in un'altra classe posta nello strato dati

    praticamente lo strato data è una semplice di libreria di funzioni da richiamare all'occorrenza?

    strato business:
    codice:
    class Utente()
     
       dim myDataObj as new DataBase
        
        public sub Add()
          'chiamo un metodo presente in un oggetto dello strato data
          mydataObj.inserisciRecord("insert into tabella ...........")
        end sub
    
    
    
    end classs

    strato data
    codice:
    class DataBase()
       
       public sub InserisciRecord(sql as string)
           'esegue materialmente l'insert nel db
           mycommand.execute(sql)
       end sub
    
       ........
       ....
       ...
    end class

  5. #5
    Non proprio...ti metto un piccolo esempio, l'applicazione è una rubrica...

    BUSINESS:

    Generica classe con i suoi attributi, come potrebbe essere un Utente con i suoi attributi Nome Cognome, Età eccecc
    Codice PHP:
    Public Class Persona
        
    Private pId As Integer
        
    Private pCogome As String
        
    Private pNome As String
        
    Private pIndirizzo As String
        
    Private pTelefono As String
        
    Private pSesso As String

        
    Public Property Id() As Integer
            Get
                
    Return pId
            End Get
            Set
    (ByVal Value As Integer)
                
    pId Value

            End Set
        End Property

        
    Public Property Cognome() As String
            Get
                
    Return pCogome
            End Get
            Set
    (ByVal Value As String)
                
    pCogome Value
            End Set
        End Property 
    Classe che ricollega la Business con l'integrazione, io la chiamo MANAGER di solito

    Codice PHP:
    Public Class PersonaManager
        
    'dialoga con integrazione, l'ultimo punto di contatto
        
    Private pDao As PersonaDAOSQL

        
    Public Property DAO() As PersonaDAOSQL
            Get
                
    If IsNothing(pDaOThen
                    pDaO 
    = New PersonaDAOSQL
                End 
    If
                Return 
    pDao
            End Get
            Set
    (ByVal Value As PersonaDAOSQL)
                
    pDao Value
            End Set
        End Property

        
    Public Sub salvaPersona(ByVal p As Persona)
            
    DAO.addPersona(p)
        
    End Sub

        
    Public Sub eliminaPersona(ByVal p As Persona)
            
    DAO.delPersona(p)
        
    End Sub
    ................. 
    INTEGRAZIONE(accesso al database e varie operazioni su di esso)

    Codice PHP:
    Imports System.Data
    Imports System
    .Data.SqlClient

    Public Class PersonaDAOSQL
        
    'classe per implementare i metodi dell'interfaccia
        
    Implements IPersonaDAO

        
    'faccio una property per la connesione, in questo modo da una sola stringa posso sempre modificare ogni connessione
        Private pConn As SqlConnection

        Public Property Conn() As SqlConnection
            Get
                If IsNothing(pConn) Then
                    Dim sqlConnectionString As String
                    sqlConnectionString = "Server=localhost;Database=provanet;user id= rubricanet;password=rubricanet;"
                    pConn = New SqlConnection(sqlConnectionString)
                End If
                Return pConn
            End Get

            Set(ByVal Value As SqlConnection)
                pConn = Value
            End Set
        End Property

        Public Sub addPersona(ByVal p As Persona) Implements IPersonaDAO.addPersona

            Conn.Open()
            Dim sql As String = "insert into rubrica values (@Cognome, @Nome, @indirizzo, @telefono, @sesso)"
            Dim cmd As New SqlCommand(sql, Conn)

            Try

                cmd.Parameters.Add("@Cognome", p.Cognome)
                cmd.Parameters.Add("@Nome", p.Nome)
                cmd.Parameters.Add("@indirizzo", p.Indirizzo)
                cmd.Parameters.Add("@telefono", p.Telefono)
                cmd.Parameters.Add("@sesso", p.Sesso)
                cmd.ExecuteNonQuery() '
    metodo che spara il comando sql

            
    Catch ex As Exception
                Debug
    .WriteLine(ex.Message)

            Finally
                
    Conn.Close()

            
    End Try

        
    End Sub
    ...............seguono le altre procedure..................... 
    PRESENTAZIONE: in questo strato creando un oggetto manager potrò accedere direttamente all'integrazione, quindi allo strato più vicino al database.

    Codice PHP:
    .............................

    Private 
    pManager As PersonaManager

        
    Public Property Manager() As PersonaManager
            Get
                
    If IsNothing(pManagerThen
                    pManager 
    = New PersonaManager
                End 
    If
                Return 
    pManager

            End Get
            Set
    (ByVal Value As PersonaManager)
                
    pManager Value
            End Set
        End Property
    ........................................
    Private 
    Sub mnuElimina_Click(ByVal sender As System.ObjectByVal e As System.EventArgsHandles mnuElimina.Click
            Dim p 
    As Persona getPersonaSelezionata(lstViewRubrica.SelectedItems(0)) 'gli devo passare il primo ed unico elemento selezionabile della lista
            Dim ok As Integer = MessageBox.Show("Sei sicuro di voler eliminare il contatto " & Environment.NewLine & p.Cognome & " " & p.Nome & " ?", "Rubrica TT", MessageBoxButtons.YesNo)
            If ok = MsgBoxResult.Yes Then
                Manager.eliminaPersona(p)
                aggiornaGriglia()
            End If
            
        End Sub 
    Spero di non aver confuso troppo le cose...

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.