Comment rendre un site ASP.NET MVC modulaire


14

Je suis dans la phase de planification d'un système intranet pour les employés à construire avec ASP.NET MVC 4. Nous aimerions que le site soit composé de "modules" distincts, chacun offrant une fonctionnalité différente: messagerie, modifications de la paie, etc. J'aimerais que ces modules puissent être activés ou désactivés au moment de la compilation. La page d'accueil affichera une sorte de navigation qui sera liée à chaque module chargé.

C'est facile jusqu'à présent, mais je ne veux pas que la fonction de navigation connaisse au préalable les modules. En d'autres termes, je veux que les modules soient dynamiquement détectables; Je veux pouvoir écrire le code d'un nouveau module, puis ajouter un lien vers la barre de navigation sans changement de code ailleurs dans la source. Chaque module devrait avoir un moyen de s'enregistrer auprès de la barre de navigation, et - plus important encore - cela devrait être fait pour chaque module lors de son chargement.

Je crois que cela empêche d'utiliser les zones de MVC, car celles-ci sont conçues pour le cas où la disposition du site est connue à l'avance. MEF semble être approprié, bien que les gens semblent avoir eu un succès mitigé en combinant MEF avec MVC. Le MEF est-il vraiment le chemin à parcourir ici ou existe-t-il un meilleur moyen d'accomplir ce dont j'ai besoin?


Bonne question, j'ai l'impression que votre solution tournera probablement autour de la réflexion. Vous pouvez toujours utiliser des zones lorsque vous créez vos éléments, mais votre méthode de création du menu devra utiliser la réflexion pour obtenir tous vos types (pour vous éviter de changer de code). Qu'en est-il s'ils implémentent tous la même interface IModule interface. Vous pouvez ensuite trouver tous les héritiers de l'interface pour obtenir tous les modules dont vous avez besoin de lien, problème est alors comment allez - vous exactement à associer cela avec un lien sans aucune données supplémentaires? Hmm l'intrigue s'épaissit ...
mattytommo

1
Il me semble que vous souhaitez créer un CMS, sauf qu'au lieu de faire l'administration du CMS à partir du CMS, vous voulez que ce soit fait au moment de la construction. Ce qui m'amène à la question, pourquoi voulez-vous que cela soit fait au moment de la construction?
James P. Wright

@ JamesP.Wright Eh bien, la raison pour laquelle je voulais le faire au moment de la construction était simplement parce que cela semblait être plus simple que d'exposer cette fonctionnalité via une page sur le site. (De plus, l'ensemble des modules utilisés changera assez rarement pour que la surcharge supplémentaire de ce type de sélection dynamique ne soit pas nécessaire.) Mais vraiment, plus important que la sélection de modules au moment de la construction est la capacité de l'application à trouver les modules dans la première place, qui est plus le sens de ma question.
bdesham

nopCommerce ( nopcommerce.com/documentation.aspx ) est en partie un bon exemple de ce que vous voulez. Jetez un oeil sur la façon d'écrire un plugin et leur approche pour DI.
Rui Marques

À des fins de recherche, j'étais curieux de savoir quel était le «succès mitigé» de la combinaison de MEF avec MVC. Puisque codeplex est de nos jours "Vivant dans les archives", le lien fourni par l'OP ne fonctionne plus. Pour épargner du temps à quelqu'un d'autre: recherchez avec ctrl + f 'MEF2 avec MVC4 via Microsoft.Composition' sur l'onglet de discussion sur archive.codeplex.com/?p=mef ;)
Kevin

Réponses:


4

J'aurais d'abord une classe centralisée qui est utilisée pour l'application pour enregistrer les modules compilés avec un constructeur statique et une liste de membres statiques des modules qui étaient dans le système. Les modules auraient une propriété statique indiquant s'il s'agit d'un élément de menu ou non et dans quel ordre il devrait apparaître dans le menu.

Chaque module aurait son propre constructeur statique qui se noterait dans la classe centralisée qui garde la trace des modules.

Pensez à ce système plus comme un système d'horloge où les employés entrent et pointent. Ensuite, au moment de la paie, nous savons que tous les employés sont payés en fonction de la date d'arrivée, etc.

La réflexion peut également être utilisée si vous avez un contrat d'interface sur les modules dont ils doivent hériter et qui lui lie les informations de méta-propriété.

J'ai travaillé pour Warner Brothers Music et fait un système de traitement de musique interne pour différents formats d'encodage. J'ai créé un modèle de plugin générique pour l'encodage avec réflexion qui utilise l'héritage afin qu'il puisse être transtypé avec réflexion pour obtenir les méta-propriétés de base de la classe. Je n'ai cependant pas essayé d'utiliser une classe centralisée statique. Juste une sorte de pensée au hasard comme une autre façon d'essayer pour le plaisir.

J'ajouterais également que j'ai utilisé MVC au service de plusieurs clients avec une exigence de base mais également des fonctionnalités améliorées similaires à ce que vous essayez de faire. Au lieu de cela, j'ai converti le MVC en utilisant App_Code plutôt que d'exiger une compilation. Il est plus facile de pousser des fichiers de cette façon sans avoir besoin d'une compilation centralisée.

Vous pouvez tirer parti de JIT avec un simple FTP ou GIT push plutôt que d'avoir besoin de compiler localement et de pousser des DLL autour.

Voici un lien vers cet article sur le débordement de pile


Cela ressemble à ce que j'imaginais. Le seul problème est, comment puis-je charger les modules en premier lieu? Par quel mécanisme dois-je dire à chacun de s'inscrire auprès de la classe centrale? C'est là que le MEF semblait convenir.
bdesham

MEF c'est mieux. Je donnais des idées sans y réfléchir, mais j'aurais utilisé MEF étant donné cette option si elle était sortie quand j'ai fait ces projets. Cela semble être une bonne idée. Je ne vois pas pourquoi vous ne pouvez pas combiner MEF et MVC.
Jason Sebring

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.