MEF = Kann es zu Frustration kommen?

AKTUALISIERE

Da ich versucht habe, MEF in meiner gesamten Anwendung zum Laufen zu bringen, stoße ich immer mehr auf Bereiche, in denen ich einfach nicht verstehe, warum meine Bibliothek nicht automatisch erstellt wird, wenn ich dies erwarte. Ich denke, es kommt alles auf das zurück, was Reed darüber sagte, MEF zu brauchen, um alles zu erschaffen. Im Moment habe ich eine XML-Reader-Klasse, die meine CandySettings verwenden muss, aber obwohl ihre ICandySettings-Eigenschaft das Attribut [Import] 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 MEF stattdessen den XML-Reader [importieren] soll. Das 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-Angelegenheit. Sie können es hier und da nicht einfach beliebig verwenden, da letztendlich auch die Klasse, in die Sie Eigenschaften einfügen möchten, von MEF erstellt werden muss.

Bitte korrigieren Sie mich, wenn ich falsch liege!

Original post

Na ja, es ist noch nicht so schlimm. :) Aber ich habe noch Fragen, nachdem Reed mich auf MEF als mögliche Alternative zu IoC hingewiesen hat (und bis jetzt sieht es ziemlich gut aus).

Betrachten Sie das folgende Modell:alt text http://bit.ly/9W0sH

Wie Sie sehen können, habe ich eine App, und diese App verwendet Plugins (whoops, diese Zuordnung verpasst!). Sowohl die App als auch die Plugins erfordern die Verwendung eines Objekts vom Typ CandySettings, das sich in einer weiteren Assembly befindet.

Ich habe zuerst versucht, die ComposeParts-Methode in MEF zu verwenden, aber die einzige Möglichkeit, dies zum Laufen zu bringen, bestand darin, im plugin code.

var container = new CompositionContainer();
container.ComposeParts(this, new CandySettings());

Aber das macht keinen Sinn, denn warum sollte ich die Instanz von CandySettings im Plugin erstellen? Es sollte in der App sein. Wenn ich es jedoch in den App-Code einfüge, findet das Plugin nicht auf magische Weise heraus, wie es zu ICandySettings kommt, obwohl ich [Importieren] im Plugin und [Exportieren] in CandySettings verwende.BEARBEITE (wahrscheinlich, weil ich ComposeParts () von der App aus aufrufen und dann das Plugin übergeben soll?)

Die Art und Weise, wie ich es tat, war, MEF's zu benutzen DirectoryCatalog, weil dies dem Plugin ermöglicht, bei seiner Erstellung alle Assemblys im aktuellen Ordner zu scannen und alles, was mit dem Attribut [Import] markiert ist, automatisch zu importieren. So sieht es aus, und möglicherweise injede plugin:

var catalog = new DirectoryCatalog(".");
var container = new CompositionContainer(catalog);
container.ComposeParts(this);

Das funktioniert total gut, aber ich kann nicht anders, als zu glauben, dass MEF nicht so eingesetzt werden sollte?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage