La classe principale passa dbConn obj a tutti i suoi servizi, ho bisogno di cambiare il dbConn per uno dei suoi servizi. - suggerimento per il modello di progettazione

1

C'è questa classe principale

e ci sono diversi servizi (che usano la connessione db per recuperare i dati)

Questi servizi sono inizializzati nella classe principale le proprietà db sono ottenute dal file delle proprietà e quindi

dbconnection viene aperto chiamando un metodo dbOpen () scritto nella classe principale e l'oggetto di connessione risultante viene impostato sugli oggetti di servizio eseguendo l'iterazione attraverso l'elenco di servizi e chiamando il metodo setConnection sul servizio

note: that the services are instantiated in the main class and the main class is not a superclass for services.

Devo anche menzionare che esiste questo scenario di recycle db connection di cui solo la classe principale è a conoscenza.

/** connects to DB, optionally recycling existing connection), 
     * throws RuntimeException if unable to connect */ 
    private void connectDb(boolean recycle) {
        try {
            if (recycle) {
                log.status( log.getSB().append("Recycling DB Connection") );
                closeDb();
            }
            openDb();       
            for ( int i = 0 ; i < service.length ; i++ )
            {
                service[i].setConnection(db);
            }
        }

Uno dei servizi deve utilizzare un altro database, qual è il miglior modello di progettazione da utilizzare?

    
posta yannis 07.03.2012 - 17:56
fonte

2 risposte

0

Cosa accadrebbe se le classi di servizio avessero qualche tipo di attributo che indicasse il tipo di connessione di cui avevano bisogno e la classe principale esaminasse quell'attributo e passasse la connessione richiesta al servizio?

    
risposta data 07.03.2012 - 18:22
fonte
0

Raccomanderei di creare oggetti di servizio dopo aver stabilito la connessione al database e di fornire l'oggetto di connessione db come parametro a un costruttore di servizi.
E quando chiami connectDb(true) per ricominciare la connessione, fai qualcosa come:

private void connectDb(boolean recycle) {
   if (recycle) {
       // move this loop to closeDb() method:
       for (Service i : services) {
          i.closeConnection() // guarantee that all transactions are committed, etc.
       }
       closeDb();
   }
   openDb();
   // move the following loop to openDb() method 
   // or even better create ServiceFactory class that obtain appropriate connection from the main class before creating a service.
   for ( int i = 0 ; i < services.length ; i++ ) {
      // here you create your service classes as you have created them before:
      services[i] = new Service(db); 
      // the old service instances will be destroyed by system garbage collector...
   }

Questo approccio è più pulito e funzionerà bene (con piccoli adattamenti) se un giorno la tua applicazione diventerà multithreading e i servizi verranno eseguiti in parallelo.

    
risposta data 09.03.2012 - 09:41
fonte

Leggi altre domande sui tag