2011-01-27 15 views
5

Sto scrivendo (con il mio team) un'applicazione GWT, che analizza e rappresenta un linguaggio specifico del dominio - ad esempio, riproduce la presentazione multimediale con controlli di testo, video e UI. Quindi l'applicazione ha un insieme di componenti: quelli - per contenere il modello, quelli - per le routine di controllo (controller) e ovviamente abbiamo le classi per View.Come rendere la tua applicazione GWT plug-in?

Ora abbiamo un problema - lo rendono tutti i plug-in grado, nel senso di:

  • dovrebbe essere uno nucleo plug-in, che rendono tutta roba comune. Questo blocco coer deve essere un file JavaScript (uno per ogni permutazione)

  • dovrebbe essere la capacità di estendere classi di base, scrivere quelli personalizzati - e compilarlo per separare il file JS (uno per ogni permutazione)

Ogni plugin deve registrare (esporta le sue classi ecc.) Sulla piattaforma principale, in modo che possa essere utilizzato.

Problemi:

  1. Come Compila il la roba personalizzato separatamente?
  2. Come caricare plug-in?

Per il secondo uno problema ho trovato http://code.google.com/p/gwt-exporter/, che esporta le classi GWT al mondo esterno, in modo che potessero essere invocate da JS puri.

Inoltre ho un'idea per creare nuovo modulo per nuovo plugin, quindi sarà compilato per separare il file (primo problema).

Hai un'esperienza di costruzione di tale architettura, hai delle buone pratiche in questo caso?

risposta

3

Ho sperimentato questa stessa domanda da GWT 1.5 e ogni volta che trovo una soluzione più elegante, cambiano il linker e lo interrompono. L'unico modo in cui ho trovato che funzionasse indipendentemente dal design del linker è quello di fare esattamente quello di cui si sta parlando e creare un nuovo modulo per sempre plug-in. Quindi utilizzare GWT esportatore per creare una classe astratta che i plugin devono estendere che avrebbe un metodo astratto che avrebbe preso l'elemento principale del plugin passato al core e popolato. Il problema con questo metodo è che tutti i moduli plug-in devono essere aggiunti al DOM sul caricamento iniziale della pagina perché dal 2.0 il linker iFrame si basa su un evento di caricamento della pagina in modo che i moduli aggiunti dinamicamente non vengano caricati completamente. Quindi, per questo motivo, si desidera che il metodo della popolazione esportata sia racchiuso in runAsync in modo da non scaricare i moduli finché non li si utilizza.

Edit:

Ecco un esempio di massima di quello che sto parlando. Si prega di essere consapevoli del fatto che non ho fatto alcun GWT in un paio di anni e potrebbe esserci un modo migliore per farlo ora.

public final class PluginManager 
{ 
    public static final PluginManager INSTANCE = new PluginManager(); 

    private PluginManager() 
    { 
    } 

    private static native void loadPlugin(AbstractPlugin plugin) 
    /*-{ 
     if (!$wnd.Plugins) { 
      $wnd.Plugins = {}; 
     } 
     var name = [email protected]::getName()(); 
     $wnd.Plugins[name] = $entry([email protected]::load(Ljava/lang/String;)); 
    }-*/; 

    private static native void unloadPlugin(AbstractPlugin plugin) 
    /*-{ 
     if ($wnd.Plugins) { 
      var name = [email protected]::getName()(); 
      delete $wnd.Plugins[name]; 
     } 
    }-*/; 

    private static native JsArrayString getPlugins() 
    /*-{ 
     if ($wnd.Plugins) { 
      return Object.keys($wnd.Plugins); 
     } 
     return undefined; 
    }-*/; 

    public static abstract class AbstractPlugin implements EntryPoint 
    { 
     @Override 
     public final void onModuleLoad() 
     { 
      PluginManager.INSTANCE.loadPlugin(this); 
     } 

     protected final void unload() 
     { 
      PluginManager.INSTANCE.unloadPlugin(this); 
     } 

     protected abstract String getName(); 

     protected abstract void load(String rootPanelId); 
    } 
} 
+0

Oh ... Grazie.Per queste due ore, da quando ho posto una domanda, ho fatto qualche soluzione. Come hai detto, ho creato il modulo Core e l'interfaccia IPlugin, che tutti i plugin dovrebbero implementare. Poi ho aggiunto al file html, sto tagliando, l'inizializzazione di entrambi i moduli. Anche se questa non è la soluzione finale, penso che questo sia un buon inizio. – ajukraine

+0

'Quindi utilizzare GEX esportatore per creare una classe astratta che i plugin devono estendere che avrebbe un metodo astratto che avrebbe preso l'elemento principale del plugin passato al core e popolarlo. "Puoi per favore entrare nei dettagli su questo? stai dicendo che avresti esportato una classe java GWT in javascript (usando gwt exporter), e quindi il modulo plugin dovrebbe (forse da un metodo nativo JSNI) estendere e implementare la classe astratta data? –

+0

Ci sarebbe qualcosa come un PluginManager che esporrà un metodo di registrazione attraverso l'esportatore (questo è in realtà molto semplice tramite JSNI e potrebbe non essere necessario aggiungere la dipendenza di GWT Exporter). AbstractPlugin sarà anche un punto di ingresso che si registrerà con il PluginManager (tramite JSNI/Exporter). AbstractPlugin esporrà anche un metodo inject che accetta un ID elemento da utilizzare come elemento root per istanziare un'istanza del plugin. Aggiungerò alla mia risposta – LINEMAN78

Problemi correlati