Une Architecture de Plugin dans les Applications Web (Exemples ou des Extraits de Code?)
Je suis en train d'apprendre à développer une application web (de préférence NodeJS/MongoDB, bien que j'ai utilisé PHP et Python avant) qui est très extensible et personnalisable via des plugins à activer /désactiver la fonctionnalité.
Une option possible est d'utiliser WordPress avec des crochets pour les plugins et widgets pour accrocher dans, cependant son manque de bonne séparation de vue et la logique du code. Qui reste à être une option à étudier. Existe-il d'autres options?
Avez-vous des extraits de code ou un exemple d'application, je peux apprendre? De langue ou de cadre n'est pas si important, je pourrais probablement faire à peu près le concept derrière
- quel genre de fonctionnalités par vous souhaitez prolonger avec les plugins? J'ai besoin d'une sorte d'exemple pour obtenir en cette.
- 1 exemple, c'est comme dans WordPress, j'ai pu étendre les fonctionnalités via des widgets et des crochets. Un autre exemple pourrait être un Tumblr. Il pourrait être le texte de base de la poste, puis de plus en plus de post types, comme la Photo, Code, etc
- Qui comptez-vous faire des extensions? Est-il un interne de l'équipe, ou est-il quelqu'un sur internet? Est la web app très spécifique - par exemple, une carte de temps de système pour les pigistes - ou est-il générique, par exemple un système de gestion de contenu?
- dans un projet en cours, je vois que la base de l'application est développée, puis adaptées aux besoins des divers clients. Il en résulte de nombreuses fonctionnalités et est difficile à maintenir. Je pense qu'une meilleure approche serait de disposer d'un ensemble de fonctionnalités de base qui peuvent être personnalisés, si l'option activer/désactiver la fonctionnalité ou à l'extension de
Vous devez vous connecter pour publier un commentaire.
Une bonne architecture de plugin est difficile à réaliser à partir de zéro, mais offre à ses propres récompenses. Il rend le logiciel flexible et simple à entretenir par la localisation de la complexité. Le premier des compétences qu'il exige, c'est la capacité à écrire faiblement couplé code. Cela exige une très bonne compréhension du polymorphisme, La Loi de Demeter et les Hollywood principe.
Je vous recommande d'abord d'acquérir une bonne connaissance de ceux, ensuite, les modèles de conception, ce qui permettra de réduire la difficile considérablement :
Une fois que vous saisir de ceux de l'étude de certains Plugin existant Cadre de mise en œuvre et les architectures de voir comment ils ont été utilisés. Apache avoir plusieurs dans Struts, Geronimo assemblage de serveur personnalisé et Tomcat Ressources JNDI; Aussi le Plugin Eclipse cadre.
Nous n'avons pas eu une architecture de plugin en tant que tel, mais je vais vous expliquer comment nous gardons notre client code faiblement couplés, et peut-être que ça vous donnera quelques idées.
Nous utilisons asp.net. Nous livrons un principal.page aspx qui comprend d'abord un médiateur fichier javascript. Il définit un objet global - appelons-le médiateur - qui est le seul objet qui nous définissent.
Le médiateur expose une interface simple avec publier et s'abonner messages:
Après l'mediator.js fichier, la page principale comprend un certain nombre d'autres fichiers javaScript, dont chacune se compose d'une fonction qui enregistre ses fonctionnalités avec le médiateur.
Plus sur ce modèle peut être trouvé ici, ou de voir une précédente question de la mienne ici.
Vous pourriez suivre une approche similaire - la définition d'un objet global (dire pluginFramework) qui offre une interface pour les plugins pour enregistrer leur fonctionnalité. Lorsque vous générez le code html de la page à livrer au client, tout d'abord inclure la pluginFramework fichier, puis l'inclure de manière dynamique souhaitée JavaScript plugin fichiers, qui pourraient dépendre de l'utilisateur ou de l'appareil (par exemple, les différentes extensions si l'appareil est tactile activé?). Ces fichiers de plugin permettrait d'ajouter à leur fonctionnalité à la pluginFramework avec une mise en fonction immédiate.
Voici un exemple de comment permettre à des plugins pour ajouter des fonctionnalités à un menu dans l'INTERFACE utilisateur:
pluginFramework.js:
photoPlugin.js:
Espère que cela a été en quelque sorte utile!
Votre commentaire suggère que ce que vous êtes en train de construire est un architecture multi-clients.
C'est une exigence complexe - et qu'il est généralement assez difficile à rétro-fit; elle dépend en grande partie sur l'endroit où vous vous trouvez.
Tout d'abord, vous devez avoir un décemment compte de l'application web en premier lieu; si vous utilisez un framework MVC, vous avez un point de départ.
Deuxièmement, vous devez décider où vous allez prendre en charge les extensions; pour instace, un client peut avoir une complète séparée de la peau pour leur INTERFACE? Si oui, vous avez besoin d'un dépouillement cadre. Les clients peuvent-ils tout changer, ou tout simplement de brancher des composants différents à des moments clés (par exemple, une coutume fournisseur de services de paiement, ou d'un schéma d'authentification personnalisé). C'est beaucoup plus facile de soutenir un ensemble limité de points d'extension que de concevoir un cadre qui permet à n'importe quoi pour être étendu.
Ensuite, votre stratégie en matière de données; il y a un bon article sur le multi de location sur MSDN; il est orienté à des bases de données relationnelles, mais fournit des idées que vous pouvez appliquer à Mongo.
Enfin, vous avez à venir avec un composant de l'architecture qui prend en charge les points d'extension dont vous avez besoin. Comme vous avez affaire à une application web, vous devez être en mesure de modifier le Modèle, Vue, Contrôleur et de la persévérance; la meilleure solution est d'utiliser le chemin de votre framework MVC veut travailler, et de mettre le "pour le locataire x, n'y; pour le locataire z, ne w" de la logique dans la couche contrôleur. Jouer avec cela, de le faire fonctionner pour certains des cas que vous avez besoin, et ensuite travailler sur ce qui est mal à propos de qui et de le corriger.
Si vous vous faites de la client personnalisation, Django sons idéal pour cela. Créer votre application de base qui gère toutes les fonctionnalités de base que vous souhaitez. Ensuite, pour chaque logiquement séparées chose que vous devez faire/plugin créer une nouvelle application que vous pouvez brancher à votre principal, en ajoutant simplement de l'application à vos apps installées dans les paramètres.
Cette poignées de dépouillement (juste plop dans une nouvelle base_site.html modèle, tous vos autres héritent de celui-ci), de multiples support de base de données, les plugins, et vous donne la possibilité de vite se développer et de déployer de nouveaux plugins/fonctionnalités.
Voir merengue ou pinax pour plus générique des exemples de ce que votre système interne pourrait être.