Wenn ich ein Projekt organisiere, wo sollte ich die Provider-Interfaces platzieren, die in MEF verwendet werden? Derzeit habe ich sie nur im selben Projekt wie alles andere, aber es scheint, als wäre es wünschenswert für mich, sie in eine separate DLL zu extrahieren, so dass es eine sehr kleine DLL war und leicht mit anderen verbunden werden könnte, die Erweiterungen schreiben wollten. Was ist eine gute Praxis dafür?
Wie bei jedem Plug-In / Extension-Modell sollten Sie Ihre "Verträge" (die Schnittstellen, die ein Plug-in-Autor implementieren sollte) in eine von Ihrer Anwendung getrennte Assembly einfügen.
Auf diese Weise können Sie die Assembly für Plug-in-Autoren verfügbar machen, ohne ihnen die gesamte Anwendung zur Verfügung stellen zu müssen - nützlich, wenn es sich um eine kommerzielle App handelt, die Sie separat lizenzieren müssen.
MEF Preview 5 bietet die Möglichkeit, eine Schnittstelle zu exportieren (dh ein [Export] -Attribut zu einer Schnittstelle hinzuzufügen), so dass jeder Implementor dieser Schnittstelle automatisch exportiert wird. Das bedeutet, dass Plug-in-Autoren nicht einmal etwas über MEF wissen müssen - sie implementieren nur Ihre Schnittstelle und sie sind automatisch eine MEF-Erweiterung.
Tatsächlich gibt es eine neue Funktion in .NET 4.0, die Typ-Äquivalenz genannt wird, die dies erreichen kann. Mit dieser Funktion können Sie zwei verschiedene Schnittstellen in verschiedenen Vertragsassemblys verwenden, die der CLR mitteilen, dass sie identisch sind. Weil es Low-Level ist, kann MEF damit gut arbeiten.
Ein paar Vorbehalte:
Sie können mehr darüber hier lesen: Ссылка . Die Dokumentation sagt, es ist für COM, aber Sie können es auch für verwalteten Code verwenden.
Ursprünglich wollte MEF Duck-Typing implementieren, was bedeuten würde, dass Sie keine gemeinsame Assembly benötigen würden, aber das erwies sich als zu schwierig.
Ich lege sie alle in eine gemeinsame Assembly zusammen mit einigen nützlichen abstrakten Basisklassen, die verwendet werden können, um die Schnittstellen zu implementieren.
Ich hatte auch dieselbe Frage und wollte ein Beispiel sehen, in dem Verträge in einem Projekt definiert sind, mehrere Implementierungen in anderen Projekten definiert sind und ein separates Consumer-Projekt, das Vertrag verwendet und Erweiterungsordner hat, in dem Implementierungs-DLLs einfach kopiert werden können ist für die Verbraucheranwendung ohne Codeänderungen verfügbar. Also habe ich versucht, eine einfache Hallo-Welt-Art von Anwendung zu schreiben und auf meinem Blog veröffentlicht. Ich hoffe, Sie könnten es nützlich finden. Ich habe auch den Quellcode (in C #) gepostet.