MEF contre toute Cio
Regardant de Microsoft Managed Extensibility Framework (MEF) et les différents conteneurs IoC (comme l'Unité), je suis à défaut de les voir quand utiliser un type de solution sur l'autre. Plus précisément, il semble que le MEF gère la plupart du Cio motifs de type et qu'un conteneur IoC comme l'Unité ne serait pas nécessaire.
Idéalement, j'aimerais voir un bon cas d'utilisation où un conteneur IoC serait utilisé à la place de, ou en plus, le MEF.
- Liés à la question here
Vous devez vous connecter pour publier un commentaire.
Lorsque cuit, la principale différence est que le Cio conteneurs sont généralement plus utile avec dépendances statiques (connue au moment de la compilation), et le MEF est généralement plus utile avec les dépendances dynamiques (connu seulement au moment de l'exécution).
En tant que tels, ils sont à la fois la composition des moteurs, mais l'accent est très différent pour chaque modèle. Les décisions de conception ainsi varier énormément, comme MEF est optimisé autour de la découverte de régions inconnues, plutôt que sur les enregistrements de parties connues.
Pensez-y de cette façon: si vous le développement de votre application entière, un conteneur IoC est probablement le meilleur. Si vous écrivez pour l'extensibilité, tels que la 3e partie les développeurs seront extension de votre système, le MEF est probablement le meilleur.
Également, l'article de @Pavel Nikolov réponse fournit du grand de la direction (c'est écrit par Glenn Bloc, MEF directeur de programme).
J'ai été en utilisant le MEF pour un certain temps et que le facteur clé pour quand on l'utilise à la place de la COI produits, c'est que nous avons régulièrement des 3-5 implémentations de l'interface assis dans notre répertoire de plugins à un moment donné. Lequel de ces implémentations doit être utilisé est en fait quelque chose qui ne peut être décidé au moment de l'exécution.
MEF est bon à vous laisser faire. Généralement, le CIO est orientée vers la prise bien sûr, vous pourriez échanger, pour un cononical exemple, un IUserRepository basé sur ORM Produit 1 pour ORM Produit 2 à un certain moment dans l'avenir. Cependant, la plupart des CIO solutions de supposer qu'il n'y aura qu'un seul IUserRepository en vigueur à un moment donné.
Si, toutefois, vous devez choisir l'une basée sur les données d'entrée pour une demande de page, CIO conteneurs sont généralement à une perte.
Comme un exemple, nous faisons de notre vérification de l'autorisation et à la validation par le MEF plugins pour une grosse application web, j'ai travaillé pendant un certain temps. À l'aide de la MEF, nous pouvons considérer au moment de l'enregistrement CreatedOn de date et d'aller creuser pour la validation plugin qui était en vigueur lors de la création du dossier et lancez l'enregistrement à la FOIS par le biais de ce plugin ET le validateur qui est actuellement en vigueur et comparer l'enregistrement de la validité dans le temps.
Ce genre de pouvoir qui nous permet également de définir fallthrough remplacements pour les plugins. Les applications que je suis en train de travailler sur sont en fait la même base de code déployés pour 30+ implémentations. Donc, nous sommes généralement à la recherche pour les plugins en demandant:
Qui nous permet de regrouper un ensemble de valeur par défaut des plugins qui donnera un coup de pied dans, mais seulement si précis de la mise en œuvre n'est pas de la remplacer par le client des règles spécifiques.
CIO est d'une grande technologie, mais semble vraiment être plus sur, il est facile de coder des interfaces plutôt que des implémentations concrètes. Toutefois, l'échange de ces implémentations est plus un projet shift genre d'événement au sein de la COI. Dans MEF, vous prenez la flexibilité des interfaces et des implémentations concrètes et d'en faire un moteur d'exécution de décision entre de nombreuses options disponibles.
Je suis en excuse d'être hors-sujet. Je voulais simplement dire qu'il y a 2 défauts qui rendent MEF une complication inutile:
il est l'attribut de base de ce qui ne veut pas faire quelque chose de bon à vous aider à comprendre pourquoi les choses fonctionnent comme ils le font. Il n'y a aucun moyen d'obtenir les détails burred dans les entrailles du cadre pour voir exactement ce qui se passe là. Il n'y a aucun moyen d'obtenir un journal de suivi ou d'un crochet jusqu'à la résolution de mécanismes et de gérer des situations non résolues manuellement
il n'a pas de mécanisme de dépannage de comprendre les raisons pour lesquelles certaines parties sont rejetés. En dépit de pointer une partie défaillante, il ne vous dit pas pourquoi cette partie a échoué.
Donc je suis très déçu par elle. J'ai passé trop de temps à lutter contre des moulins à vent en essayant de bootstrap quelques classes au lieu de travailler sur les vrais problèmes. Je l'ai convaincu qu'il n'existe rien de mieux que de la vieille école de l'injection de dépendance technique lorsque vous avez le plein contrôle sur ce qui est créé, quand, et peut de trace de quoi que ce soit dans le VS débogueur. Je souhaite quelqu'un qui prône la MEF a présenté un tas de bonnes raisons de pourquoi je l'ai choisi sur la plaine de DI.
Je suis d'accord que le MEF peut être pleinement capable Cio cadre. En fait, je suis en train d'écrire une application dès maintenant basée sur l'utilisation de la MEF pour les deux extensibilité et de la Coi. J'ai pris le générique de ses parties, et dans un "cadre" et de l'open source en tant que son propre cadre de référence appelé De Caisse À Savon De Base dans le cas où les gens veulent voir comment il fonctionne.
En particulier, jetez un oeil à la façon dont le Accueil fonctionne si vous souhaitez voir le MEF dans l'action.