Wo sollte ich die Schnittstellen für MEF setzen?

8

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?

    
stimms 28.04.2009, 01:33
quelle

4 Antworten

6

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.

    
Matt Hamilton 28.04.2009, 01:43
quelle
2

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:

  • Außer Framework-Typen werden nur benutzerdefinierte Schnittstellen unterstützt.
  • Benutzerdefinierte generische Schnittstellen werden nicht unterstützt.
  • Matching erfordert eine GUID für beide Schnittstellen: - (

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.

    
Glenn Block 22.12.2009 18:28
quelle
1

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.

    
Scott Whitlock 15.05.2009 01:28
quelle
0

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.

Ссылка

    
Ajay Singh 09.12.2009 08:35
quelle

Tags und Links