33 votes

Mise en œuvre du MEF avec ASP.NET MVC ?

Je cherche à savoir si quelqu'un a une expérience ou des idées sur l'utilisation de MEF (Managed Extensible Framework, le nouveau cadre de plugins de Microsoft) avec ASP.NET MVC. J'ai besoin de créer un ASP.NET MVC standard, que j'ai déjà. Mais j'ai besoin d'offrir des fonctionnalités supplémentaires, c'est-à-dire des vues et des contrôleurs, etc, en fonction de l'ajout d'un plugin. Il n'a pas besoin d'être compilé dynamiquement, c'est-à-dire d'avoir un code source... mais une DLL que je mets dans le système...

Existe-t-il un moyen de charger dynamiquement une DLL au démarrage de l'application, puis de fusionner les VIEWS et CONTROLLERS avec le système principal ? Je ne sais pas si je suis sur la bonne voie ici.

Ensuite, je suppose que dans les vues "STANDARD" fournies avec l'application, je peux utiliser un "SI ALORS" pour savoir si un plugin est chargé et le fusionner avec un contrôle utilisateur.

Je parle à voix haute, mais je pense que vous comprenez où je veux en venir.

Des idées ?

23voto

Boris Callens Points 17660

Vous avez eu de la chance avec ça ? Je lisais este et je pense que c'est ce que vous cherchez.
J'ai exactement zéro xp avec MEF, mais cela semble prometteur. J'espère pouvoir grappiller quelques heures de temps libre à la maison pour expérimenter avec ça. Il serait très utile de créer une sorte de "framework" MVC modulaire de cette façon.

En ce qui concerne le projet sur lequel je travaille actuellement, j'ai le problème suivant : Plusieurs sites avec les mêmes vues, seulement d'autres fichiers CSS. Actuellement, je dois dupliquer les vues, ce qui pose un problème de maintenance.
J'espère pouvoir placer ces vues dans un endroit central en utilisant MEF.

4voto

João Passos Points 87

Vérifiez ceci :

http://www.fidelitydesign.net/?p=104

Modular ASP.NET MVC using the Managed Extensibility Framework (MEF), Part One par Matthew Abbott.

4voto

J Wynia Points 4679

Nous utilisons des tonnes de MEF dans ASP.NET MVC, bien que la plupart d'entre eux se trouvent à un niveau inférieur à celui du contrôleur, comme dans nos modules de niveau inférieur qui utilisent des plugins MEF pour vérifier les autorisations et valider les données.

Cependant, nous utilisons également une approche plus composable pour nos contrôleurs. Les vues sont plus délicates, mais nous avons en fait complètement éliminé l'utilisation de vues ASP.NET MVC ordinaires et stockons nos vues Razor sous forme de snippets dans une base de données. Nos contrôleurs demandent ensuite à un moteur de modèles une vue au moment de l'exécution et rendent ContentResult à la réponse au lieu de renvoyer View("Nom de la vue"), etc.

Nos plugins MEF ont tous des propriétés d'identification qui nous permettent d'effectuer un remplacement en cascade au moment de l'exécution pour déterminer quel plugin/classe doit être utilisé dans un but donné. L'exemple le plus simple à démontrer est celui d'une application qui a une base commune, mais qui est déployée dans plus de 50 implémentations qui ont chacune la possibilité de remplacer la fonctionnalité de base.

Ainsi, vous pourriez avoir quelque chose comme un IUserController qui inclut des méthodes pour "Login", "Logout", etc.

En plus de cette fonctionnalité réelle, nous ajouterions à l'interface une propriété GUID en lecture seule appelée "SiteId". Chaque implémentation coderait alors en dur le SiteId auquel elle est destinée. Pour l'implémentation "par défaut" dans le code principal, elle renverrait "Guid.Empty".

Ensuite, lorsque nous invoquons le MEF et que nous cherchons quelle implémentation de IUserController utiliser, nous faisons un ImportMany de toutes ces implémentations dans une liste, puis nous utilisons LINQ pour interroger les propriétés afin de déterminer laquelle utiliser :

var _currentUserController = _availableUserControllers.FirstOrDefault(
  c=>c.SiteId == AppSettings.SiteId);
if(_currentUserController == null){
    //There is no site-specific override
    _currentUserController = _availableUserControllers.FirstOrDefault(
      c=>c.SiteId == Guid.Empty);
}

Pour faire cela avec les contrôleurs, votre meilleure chance est de regarder certaines des implémentations des usines de contrôleurs basées sur le MEF qui existent sur le web.

Cependant, comme je l'ai dit, nous faisons presque tout cela à un niveau inférieur et nous demandons à nos modules ou aux contrôleurs de faire ce genre de recherche pour déterminer les plugins à exécuter.

1voto

Jabe Points 1158

C'est une hypothèse. Vous pourriez remplacer l'usine de contrôleurs par défaut par une usine qui utilise le MEF pour découvrir les éléments suivants IController s. Comme les vues sont découvertes par convention, vous ne devriez pas avoir à vous en soucier.

1voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X