Làm thế nào để tạo một ứng dụng web mở rộng?


8

Làm thế nào bạn sẽ thực hiện một ứng dụng web mở rộng? Điều tôi đang nghĩ đến là một ứng dụng web tương tự Jenkins hoặc Hudson cung cấp hỗ trợ trình cắm. Mặc dù rõ ràng với tôi cách các plugin có thể được định vị và tải, tôi không biết làm thế nào chúng có thể được tích hợp trong kiến ​​trúc tổng thể. Tôi đặc biệt không chắc chắn về các điểm sau.

Làm cách nào một trình cắm thêm có thể thay đổi chế độ xem, ví dụ: thêm các yếu tố đầu vào vào một biểu mẫu?

Ý tưởng đầu tiên của tôi là một trình cắm thêm có thể đăng ký các phần / đoạn cho một hình thức nhất định.

Ví dụ: Trình cắm bản tin đăng ký một đoạn hộp kiểm bản tin điển hình sẽ được hiển thị trong chế độ xem đăng ký người dùng.

Làm thế nào một trình cắm có thể phản ứng với các yêu cầu đến?

Một lần nữa, cách tiếp cận trực tiếp sẽ là cung cấp cho người nghe một số yêu cầu hoặc hành động nhất định, ví dụ: yêu cầu POST cho / người dùng.

Làm thế nào một plugin có thể tồn tại dữ liệu?

Tôi cho rằng đây là một tình huống trong đó các giải pháp lưu trữ dữ liệu NoQuery sẽ vượt trội hơn so với các cơ sở dữ liệu quan hệ.

Tôi sẽ đánh giá cao bất kỳ ý kiến, ý tưởng và kinh nghiệm (thậm chí có thể có một mẫu thiết kế) mà bạn có liên quan đến các ứng dụng web có thể mở rộng.

Câu trả lời:


3

Câu hỏi của bạn chứa gần như tất cả các câu trả lời. Bạn đang ở trong sân bóng: tất cả các plugin và điểm mở rộng của chúng để đặt bối cảnh và khiến chúng làm những điều bạn muốn. Có nhiều cách để thiết kế hệ thống trình cắm. Cho người mới bắt đầu:

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

http://bloss.atlassian.com/developer/2011/03/plugin_arch architecture_epiT_i.html

Dưới đây là một ví dụ tầm thường để minh họa cách một hệ thống nhận biết plugin thô sơ sẽ hoạt động:

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

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.