2009-12-09 7 views
15

J'ai utilisé le conteneur IoC de Windsor pour mon application Web afin de résoudre l'implémentation de la couche d'accès aux données que l'application doit utiliser.MEF: Où dois-je mettre le CompositionContainer?

L'interface utilisateur de l'application Web sera composée de pages et chaque page se compose de petites unités appelées portlets. (Leur concept est quelque peu similaire aux widgets.) Ces soi-disant portlets sont essentiellement des contrôles web et peuvent être configurés en runtime pour chaque page de façon individuelle.

L'application sera livrée avec certains de ces intégrés, mais je voudrais permettre de l'étendre facilement.

J'ai compris que ce mécanisme est exactement ce à quoi est destiné le MEF. J'ai donc décidé d'implémenter le système de telle manière qu'il découvre les portlets en utilisant MEF. Puis, j'ai réalisé qu'il pouvait aussi faire ce que j'utilise actuellement pour Windsor, alors j'ai décidé de laisser tomber Windsor en faveur de MEF.

De toute évidence, je vais devoir utiliser DirectoryCatalog, qui analyse les fichiers .dll dans le dossier bin de l'application et retourne tout ce dont j'ai besoin. J'ai également lu des tutoriels, des exemples et toutes les questions concernant MEF dans StackOverflow. Je me suis dit que le moyen le plus simple d'utiliser MEF est le PartInitializer que Glenn Block a mentionné dans ses tutoriels, mais j'ai réalisé que ce n'est pas dans MEF. En fait, c'est dans le code que j'ai téléchargé à partir de CodePlex, mais dans un assembly séparé, et seulement dans la source, pas sous forme binaire. (Cela signifie-t-il que cela ne fait pas partie du MEF?) A quoi cela sert-il de le mettre dans un projet séparé?) Ensuite, j'ai réalisé que c'était pour Silverlight, donc ça ne m'aide pas vraiment. (Ou devrais-je juste compiler cela avec .NET 3.5, ou l'inclure dans mon projet, et je suis bon à aller?)

Donc maintenant j'ai un problème qui est le suivant: où devrais-je mettre le CompositionContainer dans ma demande?

Il y a une autre chose que je voudrais considérer: devrais-je utiliser seulement un CompositionContainer dans la vie de l'application, ou je ferais mieux de créer un conteneur pour chaque fois que j'en ai besoin?

Répondre

11

Bonnes questions.

En général en termes de questions sur l'endroit où placer le récipient, je recommande les postes suivants: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

Dans MEF sur le Web, des applications basées sur le Web sont un peu Tricker en raison de la demande/la nature de réponse et les problèmes d'évolutivité. Pour le Web, vous voudrez probablement avoir une hiérarchie de conteneurs, une racine pour l'application qui est partagée, ainsi que des contianers enfants par requête. Les conteneurs pour enfants devraient vivre et mourir avec la demande afin de conserver les ressources. Le conteneur partagé contient des services partagés par tous les appelants.

Vous pouvez consulter ces articles pour plus de mieux comprendre comment faire:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

En ce qui PartInitializer, j'éviter d'utiliser quelque chose comme ça à moins que vous devez. ASP.NET fournit des crochets suffisants dans le pipeline via les gestionnaires HTTP, les modules et autres pour laisser automatiquement composer à la création.

Le seul endroit que je verrais en utilisant PI sur le web serait probablement dans un contrôle utilisateur personnalisé. PI fait partie de Silverlight 4 et n'est pas disponible dans la boîte pour .NET 4.0.J'ai créé une version utilisable pour .NET 4.0 que vous pouvez trouver ici: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH Glenn