2011-01-27 19 views
5

Escribo (con mi equipo) una aplicación GWT, que analiza y representa un lenguaje específico de dominio; por ejemplo, reproduce presentaciones multimedia con texto, video y controles de interfaz de usuario. Por lo tanto, la aplicación tiene un conjunto de componentes: uno para el modelo de retención, otro para la rutina de control (controlador) y, por supuesto, tenemos clases para Ver.¿Cómo hacer que tu aplicación GWT pueda conectarse?

Ahora tenemos un problema - hacen todos los plug-poder, en el sentido de:

  • debe haber un núcleo plug-in, que hacen que toda la materia común. Este bloque coer debe ser un archivo JavaScript (uno para cada permutación)

  • debe haber capacidad de extender clases básicas, escribir los personalizados - y compilarlo para separar archivo JS (uno para cada permutación)

Cada complemento debe registrarse (exportar sus clases, etc.) a la plataforma central, para que pueda ser utilizado.

Problemas:

  1. Cómo de compilación las cosas a medida por separado?
  2. Cómo carga complementos?

Para el segundo problema uno he encontrado http://code.google.com/p/gwt-exporter/, que exporta a clases GWT mundo exterior, para que pudieran ser invocados desde JS puros.

También tengo una idea para crear nuevo módulo de nuevo plugin, por lo que se compilará para separar archivos (primer problema).

¿Tiene alguna experiencia en la construcción de dicha arquitectura, tiene algunas mejores prácticas en este caso?

Respuesta

3

He experimentado con esta misma pregunta desde GWT 1.5 y cada vez que se me ocurre una solución más elegante, cambian el enlazador y lo rompen. La única forma en que se me ocurrió que funcionaría independientemente del diseño del enlazador es hacer exactamente lo que estás diciendo y crear un nuevo módulo para el plugin ever. A continuación, utilice el exportador de GWT para crear una clase abstracta que los complementos deben ampliar, que tendría un método abstracto que tomaría el núcleo del complemento que le pasó el núcleo y lo rellenaría. El problema con este método es que todos los módulos adicionales se deben agregar al DOM en la carga inicial de la página porque desde 2.0 el enlazador iFrame depende de un evento de carga de página, por lo que los módulos agregados dinámicamente no se cargarán completamente. Entonces, debido a esto, querrá tener el método de población exportada envuelto en runAsync para que no esté descargando módulos hasta que los use.

Editar:

Aquí es un ejemplo aproximada de lo que estoy hablando. Tenga en cuenta que no he hecho ningún GWT en un par de años y que puede haber una mejor manera de hacerlo ahora.

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 ... Gracias.Durante estas dos horas, desde que publico una pregunta, he hecho una solución. Como dijiste, he creado el módulo Core y la interfaz IPlugin, que todos los complementos deberían implementar. Luego he agregado al archivo html, me estoy quedando, la inicialización de ambos módulos. Aunque esta no es la solución final, creo que este es un buen comienzo. – ajukraine

+0

'A continuación, utilice el exportador de GWT para crear una clase abstracta que los complementos deben ampliar que tendría un método abstracto que tomaría el elemento raíz del complemento que le pasó el núcleo y lo rellenaría. '¿Puedes entrar en detalles sobre esto? ¿Estás diciendo que exportarías una clase java GWT a javascript (usando el exportador gwt), y luego el módulo plugin debería (tal vez desde un método nativo JSNI) extender e implementar la clase abstracta dada? –

+0

Habría algo así como un PluginManager que expondría un método de registro a través del exportador (esto es realmente muy simple a través de JSNI y puede no ser necesario agregar la dependencia del exportador GWT). AbstractPlugin también será un punto de entrada que se registrará con el PluginManager (a través de JSNI/Exporter). AbstractPlugin también expondrá un método de inyección que toma una ID de elemento para usar como elemento raíz para instanciar una instancia del complemento. Añadiré a mi respuesta. – LINEMAN78

Cuestiones relacionadas