AKTUALISIEREN
Da ich versucht habe, MEF in meiner Anwendung zu verwenden, stoße ich immer öfter auf Orte, an denen ich einfach nicht verstehe, warum meine Bibliothek nicht automatisch erstellt wird, wenn ich es erwarte. Ich denke, es kommt alles darauf an, was Reed gesagt hat, dass ich MEF brauche, um alles zu erschaffen. Im Moment habe ich eine XML-Reader-Klasse, die meine CandySettings verwenden muss, aber obwohl ihre ICandySettings -Eigenschaft das [Import] -Attribut hat, wird sie nicht importiert. Zuerst habe ich herausgefunden, dass [Import] bei Statik nicht funktioniert, also habe ich das geändert. Aber danach hat es immer noch nicht funktioniert. Ich denke, das liegt daran, dass ich das XML-Reader-Objekt manuell erstelle, und was MEF stattdessen tun möchte, ist [Import] des XML-Readers ... was bedeutet, dass ich jetzt auch eine Schnittstelle dafür haben muss.
Es ist fast wie mit IoC (oder zumindest für MEF), es ist eine Alles-oder-Nichts-Affäre. Sie können es hier und da nicht willkürlich verwenden, da letztlich jede Klasse, in die Sie Eigenschaften einfügen möchten, auch von MEF erstellt werden muss.
Bitte korrigieren Sie mich, wenn ich falsch liege!
Originaler Beitrag
Nun, es ist noch nicht so schlimm. :) Aber ich habe Fragen, nachdem Reed mich auf MEF als eine mögliche Alternative zu IoC gezeigt hat (und bis jetzt sieht es ziemlich gut aus).
Betrachten Sie das folgende Modell: http://bit.ly/9W0sHt
Wie Sie sehen können, habe ich eine App, und diese App verwendet Plugins (hoppla, verpasst diese Zuordnung!). Sowohl die App als auch die Plugins erfordern die Verwendung eines Objekts vom Typ CandySettings, das in einer anderen Assembly gefunden wird.
Ich habe zuerst versucht, die ComposeParts-Methode in MEF zu verwenden, aber die einzige Möglichkeit, dies zum Laufen zu bringen, war, so etwas im Code plugin zu tun.
%Vor%Aber das macht keinen Sinn, denn warum sollte ich die Instanz von CandySettings im Plugin erstellen? Es sollte in der App sein. Aber wenn ich es in den App-Code lege, dann kommt das Plugin nicht heraus, wie ich ICandySettings erreichen kann, obwohl ich [Import] im Plugin und [Export] in CandySettings verwende. BEARBEITEN (wahrscheinlich, weil ich ComposeParts () von der App aufrufen und dann das Plugin übergeben soll?)
Die Art und Weise, wie ich es gemacht habe, war die Verwendung von DirectoryCatalog von MEF, da das Plug-in, wenn es erstellt wird, alle Assemblies im aktuellen Ordner scannt und automatisch alles importiert, was mit dem [ Import] -Attribut. Es sieht also so aus und möglicherweise in jedem Plugin:
%Vor%Das funktioniert großartig, aber ich kann nicht anders, als zu denken, dass MEF nicht so verwendet werden sollte?
Der "Trick" hier ist, dass Sie möchten, dass MEF Ihre Plugins für Sie erstellt.
Die Vorgehensweise besteht darin, dass Ihre Anwendung sich mit den angegebenen Plugin-Typen zusammensetzt:
%Vor% Wenn Sie dies tun und MEF Ihre "Repository" -Klasse verfassen, erstellt MEF die Objekte. Es wird dann automatisch diejenigen erstellen, wie sie sie konstruiert, so dass ICandySettings
ohne irgendeine Intervention für Sie komponiert werden.
Sie müssen ein Objekt nur manuell erstellen, wenn MEF es nicht für Sie erstellt.
Tags und Links c# dependency-injection ioc-container inversion-of-control mef