Come creare un'applicazione web estensibile?

8

Come implementeresti un'applicazione web estensibile? Quello a cui sto pensando è un'applicazione web simile a Jenkins o Hudson che fornisce supporto plug-in. Mentre è ovvio per me come i plug-in possano essere localizzati e caricati, non so come possano essere integrati all'interno dell'architettura generale. Sono particolarmente incerto sui seguenti punti.

Come può un plug-in modificare la vista, ad es. aggiungi elementi di input a un modulo?

La mia prima idea sarebbe che un plug-in possa registrare partial / frammenti per un determinato modulo.

Esempio: Plug-in per la newsletter che registra un tipico frammento della casella di controllo della newsletter che verrà visualizzato nella vista di registrazione dell'utente.

Come può un plug-in reagire alle richieste in arrivo?

Ancora una volta, un approccio diretto sarebbe quello di fornire agli ascoltatori determinate richieste o azioni, ad es. Richiesta POST a / utente.

Come può un plug-in conservare i dati?

Suppongo che questa sia una situazione in cui le soluzioni di archiviazione dati NoSQL sarebbero superiori ai database relazionali.

Apprezzerei qualsiasi commento, idea ed esperienza (forse c'è anche un modello di design) che hai riguardo alle applicazioni web estendibili.

    
posta BenR 21.10.2011 - 11:28
fonte

1 risposta

3

La tua domanda contiene quasi tutte le risposte. Hai ragione nel ballpark: sono tutti i plug-in e i loro punti di estensione per impostare il contesto e fargli fare le cose che vuoi. Esistono molti modi per progettare i sistemi plug-in. Per i principianti:

link

link

Ecco un esempio banale per illustrare come funzionerebbe un rudimentale sistema basato su plugin:

public interface Plugin {

  void setEntityManager(EntityManager manager); // this is very course grained and liberal! A plugin would have access to whatever Entity Manager the container gives it. A plugin would then have a carte blanche to do whatever it needs: create, drop, insert, select, delete.

  View renderView(ViewContext context); // a plugin would render or return a view (whatever it is, could be a string in the simplest case) based on the context that the container passed to the plugin

  Action readEvent(Event event); // a plugin performs some Action based on an event as notified by a container

}


public class PluginContainer {

  private List<Plugin> plugins = new ArrayList<Plugin>();

  public void registerPlugins() {
    // loop through plugin descriptors obtained by your preferred mechanism
    // like introspecting libraries (JARs) in a configurable location

    // for each descriptor, load a Plugin dynamically and "register" it with a container
    Plugin p = ClassLoader.getSystemClassLoader().loadClass("com.my.PluginA").newInstance(); 
    p.setEntityManager(entityManager);
    plugins.add(p);
  }

  public void readEvent(AppEvent appEvent) {
    Event e = this.constructPluginSpecificEventFromAppEvent(); // optional
    for (Plugin p : this.plugins) {
      p.readEvent(e); // disregarding Action here
    }
  }
}

public class Application {

  private PluginContainer pContainer;

  private void buttonClicked(AppEvent appEvent) {
    this.showCoolDialog("Thank you for clicking a button!");
    // now let my plugins handle this
    // they can do whatever they want for this event
    // since they have access to EntityManager, they can work with a persistence storage as well
    this.pcContainer.readEvent(appEvent);
  }

}
    
risposta data 22.10.2011 - 21:46
fonte

Leggi altre domande sui tag