2013-03-15 19 views
6

Ho bisogno di rifattorizzare un'applicazione Java EE perché il design attuale non è molto modulare, in effetti è piuttosto un disastro. C'è una facciata aziendale, ma l'applicazione è stata sviluppata da più persone e quindi il design originale è stato ignorato più volte. L'applicazione è attualmente in esecuzione su tomcat con JSF ma verrà presto trasferita su websphere. Ho già fatto alcune ricerche sui diversi modelli di progettazione per incapsulare la logica aziendale dalla vista e anche come rendere l'applicazione modulare in modo che sia facile aggiungervi più funzionalità perché l'applicazione verrà migliorata in futuro. Ho letto su OSGI ma penso che sarebbe un eccesso.Applicazione java ee modulare

L'applicazione è già suddivisa in livelli. Ma sono molto lontano dalla definizione delle API. Ho già ripulito l'applicazione un po '. Ora tutti i bean accedono alla logica del business attraverso i metodi della facciata aziendale. Ma la facciata aziendale è composta da circa 40 metodi che ritengo non siano molto belli.

3rd party modificare

Per esempio io ho queste classi del modello

  • ManageLdap con metodi come createAccount e deleteAccount
  • GroupManager che gestisce i gruppi LDAP

Nel facciata commerciale ho un incontro hod createAccount che

  • chiama la classe ManagerLdap di creare un account LDAP e
  • fa un po 'di registrazione e anche
  • chiamate GroupManager

Questo pseudo codice

package Model.ManageLdap 

public class ManageLdap 
{ 
    public ldapAccount createAccount() { } 

    public ldapAccount deleteAccount() { } 
} 

public class GroupManager 
{ 
    public bool addAccountToGroup(var account) { } 
} 

E in la facciata aziendale

package BusinessFacade.Foo 

public class SomeFoo 
{ 
    public ldapAccount createAccount() 
    { 
    var ldapAccount = new ManageLdap.createAccount(); 
    Logger.log("Account created"); 
    var accountWasAdded = GroupManager.addAccountToGroup(ldapAccount); 
    }  
} 

Ora, se voglio mettere funzionalità aggiuntive per l'applicazione, come la possibilità di creare un repository subversion per un utente

  • devo implementare una classe del modello per creare i pronti contro termine,
  • mettere un po ' metodi nella facciata aziendale e
  • creare un bean aggiuntivo a cui accedere dalla vista.

Ciò rende la facciata ancora più grande e confusa, ma a parte questo, questo non è quello che chiamo un design modulare.

Quindi, come posso separare la logica di business dalla vista senza avere una facciata aziendale enorme?

+0

Questo è stato discusso molte volte su SO. Dai un'occhiata a [questo] (http://stackoverflow.com/questions/647922/java-application-architecture-guide?rq=1) e [this] (http://stackoverflow.com/questions/286846/describe -the-architecture-you-use-for-java-web-applications? rq = 1) e molti altri. – techuser

+0

Questo potrebbe essere un buon argomento per [enterprise-architect] (http://stackoverflow.com/documentation/enterprise-architect) o [architettura per iniziare] (http://stackoverflow.com/documentation/architecture/7435/) . – surfmuggle

+0

@techuser [Guida all'architettura dell'applicazione Java] (http://stackoverflow.com/questions/647922/) o [Descrivi l'architettura per le applicazioni web java] (http://stackoverflow.com/questions/286846/) sembra essere per ampliare la domanda sulle opzioni. Dopo aver letto [miglior carrello di acquisto aziendale] (http://stackoverflow.com/a/6303154/) ho pensato che guardando il codice open source, ad es. [BroadleafCommerce] (https://github.com/BroadleafCommerce) potrebbe essere un buon inizio per ottenere idee su come organizzare il codice. – surfmuggle

risposta

3

Per primo tentativo per dividere l'applicazione in diversi strati, come:

  • DAO
  • Sevices
  • Security
  • Visualizza
  • Ecc

quindi estrarre alcune API da ciascuno dei livelli (come dao-api, service-api e così via i moduli pi dovrebbero avere un set di interfacce).

quindi creare un insieme di moduli (come service-api, service-impl, dao-api, dao-impl) e comportare qualche strumento di costruzione ( Gradle o maven) per la loro gestione.

Do non consentire a un modulo di implementazione di avere dipendenza da un altro modulo di implementazione (solo impl -> api o api -> api).

Ogni modulo - file jar separato.

Dopo tale refactoring sarà molto più difficile rompere il design dell'applicazione in futuro.

+0

Grazie per la tua risposta, ho modificato la mia domanda originale, spero che tu possa darmi qualche consiglio su questo. –

+0

se ogni modulo sarà separato con i file jar, quindi che ne sarà della distribuzione? –

+0

Potresti elaborare ciò che intendi con 'solo implementazione -> api o api -> api' significa che un'implementazione può essere basata su diversi apis (api o api) basati su un'altra API? – surfmuggle