Bagaimana cara membuat aplikasi web yang dapat diperpanjang?

8

Bagaimana Anda menerapkan aplikasi web yang dapat diperpanjang? Yang saya pikirkan adalah aplikasi web yang mirip dengan Jenkins atau Hudson yang menyediakan dukungan plug-in. Meskipun jelas bagi saya bagaimana plug-in dapat ditemukan dan dimuat, saya tidak tahu bagaimana plug-in dapat diintegrasikan dalam arsitektur keseluruhan. Saya terutama tidak yakin tentang poin-poin berikut.

Bagaimana plug-in dapat mengubah tampilan, misalnya menambahkan elemen input ke formulir?

Gagasan pertama saya adalah plug-in dapat mendaftarkan sebagian / fragmen untuk formulir tertentu.

Contoh: Plug-in nawala yang mendaftarkan fragmen kotak centang nawala yang akan ditampilkan dalam tampilan pendaftaran pengguna.

Bagaimana plug-in bereaksi terhadap permintaan yang masuk?

Sekali lagi, pendekatan langsung adalah menyediakan pendengar untuk permintaan atau tindakan tertentu, misalnya permintaan POST kepada / pengguna.

Bagaimana plug-in bisa bertahan data?

Saya berasumsi ini adalah situasi di mana solusi penyimpanan data NoSQL akan lebih unggul dari database relasional.

Saya akan sangat menghargai komentar, ide dan pengalaman (mungkin bahkan ada pola desain) yang Anda miliki mengenai aplikasi web yang dapat diperpanjang.

BenR
sumber

Jawaban:

3

Pertanyaan Anda berisi hampir semua jawaban. Anda benar di stadion baseball: itu semua plug-in dan titik ekstensi mereka untuk mengatur konteks dan membuat mereka melakukan hal-hal yang Anda inginkan. Ada banyak cara untuk merancang sistem plug-in. Sebagai permulaan:

http://people.clarkson.edu/~dhou/courses/EE564-s07/plugin.pdf

http://blogs.atlassian.com/developer/2011/03/plugin_architecture_episode_i.html

Berikut adalah contoh sepele untuk menggambarkan bagaimana sistem plugin-aware dasar bekerja:

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);
  }

}
Yuriy Zubarev
sumber