Choix entre le MEF et le MAF (système.AddIn)
the Managed Extensibility Framework (MEF) and Managed AddIn Framework (MAF, alias System.AddIn) semblent accomplir des tâches très similaires. Selon cette question de débordement de pile, est MEF un remplacement pour le système.Addin? , vous pouvez même utiliser les deux en même temps.
Quand vous choisissez d'utiliser l'un contre l'autre? Dans quelles circonstances choisiriez-vous de les utiliser ensemble?
7 réponses
j'ai évalué ces options et voici la conclusion à laquelle je suis arrivé.
le CRG est un véritable addon framework. Vous pouvez séparer complètement vos addons, même en les exécutant dans un domaine d'application séparé de sorte que si un addon s'écrase, il ne détruira pas votre application. Il fournit également une façon très complète de découpler les addons de dépendre de tout sauf le contrat que vous leur donnez. En fait, vous pouvez versioniser vos adaptateurs de contrat à fournir rétrocompatibilité vers de vieux addons pendant que vous mettez à jour l'application principale. Bien que cela semble génial, il vient avec un prix lourd que vous devez payer afin de croiser appdomains. Vous payez ce prix dans la vitesse et aussi dans la flexibilité des types que vous pouvez envoyer d'avant en arrière.
MEF est plus comme l'injection de dépendance avec quelques avantages supplémentaires tels que la découverte et ... (dessin d'un vide sur celui-ci). Le degré d'isolement du CRG n'est pas présent dans le MEF. Ils sont deux cadres différents pour deux choses différentes.
ce que Danielg a dit est bon. J'ajouterais:
Si vous regardez les vidéos sur le Système.Addins, ils parlent clairement de très grands projets. Il parle d'une équipe gérer l'application hôte, une autre équipe gérer chaque AddIn, et un troisième équipe gérer le contrat et le pipeline. Sur cette base, je pense que le Système.Addins est clairement pour les applications plus grandes. Je pense applications telles que les systèmes ERP comme SAP (peut-être pas si grand, mais vous avez l'idée). Si vous avez regardé ces vidéos, vous pouvez dire que la quantité de travail à utiliser le Système.Addins est très grand. Cela fonctionnerait bien si vous aviez un grand nombre d'entreprises programmant des add-ins tiers pour votre système et vous ne pouvez briser aucun de ces contrats add-in sous peine de mort.
d'un autre côté, MEF semble partager plus de similitudes avec Sharp Develop's add-in scheme, le plugin Eclipse architecture ou Mono.Addins. C'est plus facile à comprendre que le système.Addins et moi croyons qu'il est beaucoup plus flexible. Les choses que vous perdez sont que vous n'obtenez pas AppDomain isolation ou des contrats de versioning forts hors-de-la-boîte avec MEF. Les points forts de MEF sont que vous pouvez structurer votre application entière comme une composition de pièces, de sorte que vous pouvez expédier votre produit dans différentes configurations pour différents clients, et si le client achète une nouvelle fonctionnalité, vous venez de laisser tomber la pièce pour que l'application le voit et l'exécute. Il facilite également les tests. Vous pouvez instancier l'objet que vous voulez tester et l'alimenter avec des objets mock pour toutes ses dépendances, mais quand il fonctionne comme une application composée, le processus de composition relie automatiquement tous les objets réels ensemble.
le point le plus important que j'aimerais mentionner est que même si le système.Addins est déjà dans le cadre, Je ne vois pas beaucoup de preuves de les gens l'utilisent, mais MEF est juste assis là sur CodePlex soi-disant pour être inclus dans .NET 4, et les gens commencent déjà à construire beaucoup d'applications avec elle (moi-même inclus). Je pense que cela vous dit quelque chose à propos des deux cadres.
ayant développé et envoyé une application MAF. Mes vues sur le MAF sont quelque peu blasées.
MAF est un système" découplé "ou" faiblement couplé " dans le pire des cas. Le MEF est un système" couplé "ou, au mieux, un système" à couple lâche".
les avantages du CRG que nous avons obtenus en utilisant le CRG sont:
-
installation de nouveaux composants ou mise à jour de composants existants pendant le fonctionnement de l'application. L'AddIn pourrait être mis à jour l'Application était en cours d'exécution et les mises à jour apparaissent à l'utilisateur de façon transparente. Tu dois avoir des AppDomains pour ça.
-
licence basée sur les composants achetés. Nous pouvions contrôler quel AddIn était chargé en fonction du rôle et des permissions de l'utilisateur et si L'AddIn était autorisé à être utilisé.
-
développement rapide (Délai de commercialisation plus rapide). Le développement AddIn s'adapte parfaitement avec la méthode Agile l'équipe de développement a développé un AddIn à la fois sans avoir à développer la pièce d'intégration avec le reste de l'application.
-
amélioration de L'assurance de la qualité (une seule composante à la fois). L'AQ pourrait ensuite tester et émettre des défauts pour un seul bit de fonctionnalité. Les cas types étaient plus faciles à élaborer et à mettre en œuvre.
- "151900920 de Déploiement" (ajouter des composants tels qu'ils sont mis au point et publiés et ils ont "juste"). Le déploiement n'est qu'une question de faire un AddIn et d'installer le fichier. Aucune autre considération n'était nécessaire!
-
nouveaux composants travaillés avec des composants anciens. AddIn qui ont été développés au début a continué à travailler. Nouveaux AddIns s'intègrent parfaitement dans l'Application
à mon avis, les deux technologies ciblent en fait des cas d'utilisation très différents.
MEF est généralement préférable dans un scénario d'injection de pure dépendance où la personne ou le groupe qui fournit la solution intégrée finale rassemble tout et garantit l'intégrité globale, mais a besoin d'avoir différentes implémentations de capacités clés.
CRG est pour un scénario où quelqu'un / groupe développe une plate-forme ou hôte et d'autres groupes va ajouter des fonctionnalités après le fait et qui n'est pas sous le contrôle de la structure d'accueil. Dans ce scénario, il est nécessaire de disposer de mécanismes plus élaborés pour "protéger" l'hôte des add-ins indésirables (ou pour protéger les add-ins les uns des autres).
une troisième technologie similaire est le système ProviderBase dans son ensemble. Cela permet également de remplacer une capacité mais son but est vraiment le scénario où l'hôte / application a absolument besoin d'une capacité et le besoin est vraiment de spécifier différentes implémentations via la configuration.
je viens de trouver ce long article discutant à la fois MAF et MEF. http://emcpadden.wordpress.com/2008/12/07/managed-extensibility-framework-and-others/
en plus des points soulevés par les autres réponses, il semble que l'une des principales différences entre le MEF et le MAF est que le cadre D'extensibilité gérée permettrait à une partie composable de dépendre d'une autre. Il laisserait un plug-in dépendre d'un autre plug-in, par exemple.
le cadre D'extensibilité gérée ne fait pas non plus vraiment de distinction entre l'hôte et l'add-in, comme le système.AddIn si. En ce qui concerne MEF, ce ne sont que des pièces composables.
À mon avis, la meilleure façon de découvrir les différences est quelques mains sur code. J'ai trouvé deux passages MSDN, tous deux avec un exemple de calculatrice pour que vous puissiez facilement comparer leurs implémentations:
MEF: calculatrice Simple exemple d'utilisation de MEF pièces
( M anaged E xtensibility F ramework)
- montre comment construire une calculatrice simple en utilisant la technologie MEF. Ne montre pas comment charger une dll externe. (Mais vous pouvez simplement modifier l'exemple en utilisant
catalog.Catalogs.Add(new DirectoryCatalog("Plugins", "*.dll"));
au lieu d'utilisercatalog.Catalogs.Add(new AssemblyCatalog(typeof(Program).Assembly));
et d'en extraire le code de calculatrice et contrat pour séparer les projets DLL.) -
MEF does not ne nécessite pas une structure de répertoire spécifique, il est simple et simple à utiliser, même pour les petits projet. Il fonctionne avec des attributs, de déclarer ce qui est exporté, qui est facile à lire et à comprendre. exemple:
[Export(typeof(IOperation))] [ExportMetadata("Symbol", '+')] class Add: IOperation { public int Operate(int left, int right) { return left + right; } }
-
MEF n'est pas automatiquement avec le versioning
MAF: calculatrice Simple avec version V1 et V2 plugins MAF
( M anaged Un ddin F ramework)
- montre comment construire la calculatrice en utilisant un plugin V1 et ensuite comment passer à un plugin V2 tout en maintenant rétrocompatibilité ( note: vous pouvez trouver la version V2 du plugin ici , le lien dans l'article original est cassé)
- MAF applique une structure de répertoire spécifique , et il a besoin de beaucoup de code boilerplate pour le faire fonctionner, donc je ne le recommande pas pour les petits projets.
exemple:
Pipeline AddIns CalcV1 CalcV2 AddInSideAdapters AddInViews Contracts HostSideAdapters
le MEF et le MAF sont inclus dans le .net Framework 4.x. Si vous comparez les deux exemples, vous remarquerez que les plugins MAF ont beaucoup plus de complexité que le framework MEF. besoin de réfléchir soigneusement avant de l'utiliser qui de ces cadres.
MAF et MEF les deux peuvent utiliser des AppDomains et les deux peuvent charger / décharger dll à l'exécution. Cependant, les différences que j'ai trouvées sont les suivantes: les AddIns de MAF sont découplés, les composants de MEF sont couplés librement; MAF "Active" (nouvelle instance) tandis que MEF crée des instances par défaut.
avec MEF vous pouvez utiliser Generics pour faire GenericHost pour tout contrat. Cela signifie que la gestion MEF load/unload et component peut être dans une bibliothèque commune et utilisée de manière générique.