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?
Réponses:
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
la source
Vous voudrez peut-être envisager d'utiliser MEF avec MVC. Cela vous donnerait la possibilité d'ajouter - emporter au besoin sans recompiler ou déployer. Comme d'habitude, Scott est un bon point de départ: http://www.hanselman.com/blog/ExtendingNerdDinnerAddingMEFAndPluginsToASPNETMVC.aspx
la source