2012-05-26 10 views
25

Estoy tratando de aprender a desarrollar una aplicación web (preferiblemente NodeJS/MongoDB, aunque utilicé PHP y Python anteriormente) que es altamente extensible y personalizable a través de complementos para habilitar funcionalidad.Arquitectura de complementos en aplicaciones web (ejemplos o fragmentos de código?)

Una opción posible es usar Wordpress con ganchos para complementos y widgets para enganchar, sin embargo, carece de la separación adecuada de la vista y el código lógico. Esa sigue siendo una opción para aprender. ¿Hay más opciones?

¿Tiene algún fragmento de código o aplicación de ejemplo que pueda aprender? El lenguaje o el marco no es tan importante, probablemente podría definir el concepto detrás de

+0

¿Qué tipo de funcionalidad desea ampliar con los complementos? Necesito algún tipo de ejemplo para entrar en esto. – GarethOwen

+0

1 ejemplo es como en WordPress, podría ampliar la funcionalidad a través de widgets y ganchos. Otro ejemplo podría ser Tumblr. Podría haber una publicación de texto básica, luego más tipos de publicaciones como Foto, Código, etc. –

+0

¿A quién anticipa que va a hacer extensiones? ¿Es un equipo interno, o es alguien en Internet? Es la aplicación web muy específica, por ej. un sistema de tarjeta de tiempo para autónomos, o es genérico, p. un sistema de gestión de contenido? –

Respuesta

47

Una buena arquitectura de complemento es difícil de lograr desde el principio, pero ofrece sus propias recompensas. Hace que el software sea flexible y fácil de mantener localizando la complejidad. La habilidad más importante que requiere es la capacidad de escribir loosely coupled code. Esto exige una comprensión muy firme del polimorfismo, Demeter's Law y el relacionado Hollywood principle.

le recomiendo que inicialmente obtener una buena familiaridad con los que, a continuación, los siguientes patrones de diseño, lo que reducirá la difícil significativamente:

  • Command Pattern: Da Plugin Módulos de un punto de entrada constante, que les permite ser fácilmente intercambiaron adentro y hacia fuera, un Web Based example from IBM.
  • Memento: Capture, mantenga y externalice el estado sin violar la encapsulación, permite que los complementos sean configurados por el contenedor.
  • Call Back: Permite que los módulos de complementos accedan a 'servicios' desde el contenedor/entorno.
  • Dependency Injection: una forma de aflojar el acoplamiento de los módulos de complementos de su entorno.
  • Abstract Factory Pattern: Instalar y crear instancias del complemento en el entorno.
  • Builder Pattern: Necesario para cualquier arquitectura de complemento no trivial en la que los módulos de complementos dependan entre sí.

Una vez que los conozca, estudie algunas de las implementaciones y arquitecturas existentes de Plugin Framework para ver cómo se han utilizado. Apache tiene varios en Struts, Geronimo custom server assemblies y Tomcat JNDI Resources; También el Eclipse plugin framework.

4

No tenemos una arquitectura de complementos como tal, pero explicaré cómo mantenemos nuestro código de cliente ligeramente acoplado, y tal vez te dará algunas ideas

Estamos usando asp.net. Entregamos una página main.aspx que primero incluye un archivo javascript mediador. Define un objeto global, llámalo mediador, que es el único objeto global que definimos.

El mediador expone una interfaz sencilla con la publicación y suscripción mensajes:

mediator.subscribe(messageName, callback); 
mediator.publish(messageName); 

vez que el archivo mediator.js, la página principal incluye una serie de otros archivos JavaScript, cada uno de los cuales consta de una función inmediata que registra su funcionalidad con el mediador. Más sobre este patrón se puede encontrar here, o ver una pregunta anterior de la mía here.

Podría seguir un enfoque similar: definir un solo objeto global (por ejemplo, pluginFramework) que ofrezca una interfaz para que los complementos puedan registrar su funcionalidad. Cuando construye la página html para entregar al cliente, primero incluya el archivo pluginFramework y luego incluya dinámicamente los archivos de plugin de JavaScript deseados, que podrían depender del usuario o del dispositivo (por ejemplo, diferentes complementos si el dispositivo está habilitado por contacto). Estos archivos de complemento agregarían su funcionalidad al pluginFramework con una función inmediata.

Aquí es un ejemplo de cómo permitir que los plugins para agregar funcionalidad a un menú en la interfaz de usuario:

pluginFramework.js:

var pluginFramework = (function() { 
    var menuItems = []; 
    function addMenuItemPrivate(itemName, callback) { 
     // e.g. add itemName and callback to menuItems 
    } 
    return { 
     addMenuItem: addMenuItemPrivate; 
    } 
})()); 

photoPlugin.js:

(function() { 
    function addPhoto() { 
     //... 
    } 
    pluginFramework.addMenuItem('add photo', addPhoto) 
})()); 

Hope esto fue de alguna manera útil!

3

Tu comentario sugiere que lo que estás construyendo es un multi-tenant architecture.

Este es un requisito complejo, y uno que suele ser bastante difícil de adaptar; depende en gran medida de dónde estás empezando.

En primer lugar, debe contar con una aplicación web decente; si está utilizando un marco MVC, tiene un punto de partida.

En segundo lugar, debe decidir dónde va a admitir las extensiones; Por ejemplo, ¿puede un cliente tener un aspecto completamente separado para su UI? Si es así, necesitas un marco de desarrollo. ¿Pueden los clientes cambiar todo, o simplemente conectar diferentes componentes en puntos clave (por ejemplo, un proveedor de pago personalizado o un esquema de autenticación personalizado). Es mucho más fácil admitir un conjunto limitado de puntos de extensión que diseñar un marco que permita que cualquier cosa se extienda.

A continuación, su estrategia de datos; hay un good article on multi tenancy on MSDN; está orientado a bases de datos relacionales, pero proporciona ideas que puede aplicar a Mongo.

Finalmente, tiene que encontrar una arquitectura de componentes que admita los puntos de extensión que necesita. Como se trata de una aplicación web, debe poder modificar el Modelo, la Vista, el Controlador y la persistencia; la mejor solución es usar la forma en que su marco MVC quiere funcionar, y poner la lógica "para inquilino x, hacer y; para inquilino z, hacer w" en la capa de controlador. Juega con esto, haz que funcione para algunos de los casos que necesites y luego averigua qué pasa con eso y soluciónalo.

0

Si usted mismo está haciendo la personalización del cliente, Django parece ideal para esto. Crea tu aplicación principal que maneje todas las funcionalidades básicas que deseas. Luego, para cada cosa separada lógicamente que necesita hacer/agregar, cree una nueva aplicación que puede conectar a la principal, simplemente agregando esa aplicación a sus aplicaciones instaladas en la configuración.

Esto maneja el despellejado (solo desplácese en una nueva plantilla base_site.html, haga que todos los demás hereden de ella), compatibilidad con múltiples bases de datos, complementos y le ofrece la capacidad de desarrollar e implementar rápidamente nuevos complementos/funciones.

Consulte merengue o pinax para obtener ejemplos más genéricos de lo que podría ser su sistema interno.

Cuestiones relacionadas