2010-06-24 3 views
8

(ich weiß, über die anderen MEF/MAF Fragen, aber dies ist ein spezielleres Problem)Erweiterbare WPF-Anwendung - MEF, MAF oder einfaches Laden?

ich eine WPF-Anwendung erstellen möchten, die im Grunde nur ein einfaches Add-In wird Host, GUI und Einstellungen. Die gesamte Arbeit wird von einem oder mehreren Plugins erledigt. Sie müssen nicht miteinander kommunizieren, die Hauptanwendung sendet Benutzereingaben/Befehle an sie und sie werden einige Ergebnisse zurückgeben (z. B. WPF-Benutzeroberflächenelemente zum Rendern).

Jetzt, da der Kern der Anwendung auf Plugins basiert, muss ich einen guten Weg wählen, um sie zu verwalten. Ich möchte sie zur Laufzeit laden/entladen/neu laden können (zum Beispiel wenn ein Update gefunden und heruntergeladen wird). Sie sollten wahrscheinlich in der eigenen Anwendungsdomäne und/oder im Prozess für Stabilität und Sicherheit laufen.

Von einigen Recherchen und Experimente kam ich zu drei Möglichkeiten:

  • System.AddIn (MAF): Es scheint, dies alles kann ich brauche. Es gibt eine Pipeline, mit der mehrere API-Versionen gleichzeitig ausgeführt werden können, um Kompatibilität zu gewährleisten. Aber wenn ich etwas nicht vermisse, muss ich die API mehrmals erstellen - Host- und Plugin-Ansichten, Vertrag und zwei Adapter für den Vertrag. Auch gibt es wenig (im Vergleich zu MEF) Informationen und Ressourcen rund um und die meisten Artikel sind wenige Jahre alt. Ich mache mir Sorgen, dass das langsam stirbt und ich es lieber nicht für ein neues Projekt nutzen würde.

  • MEF: Dies scheint einfacher, aber es fühlt sich auch so gibt es eine Menge Magie, die ich nicht kontrollieren kann, und die Schichten nicht so viel wie in MAF getrennt. Ich möchte nur eine kleine Bibliothek, die du mit einem neuen Projekt verlinken kannst, implementierst die Schnittstelle und das Plugin ist fertig.

  • manuelle Beladung: Die letzte Option wäre Plugin Klassen manuell Scan-Ordner für .dlls, Verwendung Reflexion zu finden und Instanzen zu erstellen. Während es machbar ist, würde ich lieber etwas Framework verwenden als manuell Baugruppen laden, ein separater Prozess/Appdomain usw.

Also, die man am besten für diese Art von Anwendung sein würde, oder gibt es etwas, das ich verpasst haben?

+0

Echt ordentliches Thema. Paar gute verwandte Artikel; http://pwlodek.blogspot.com/2011/07/isolating-mef-components.html und http://blogs.msdn.com/b/tilovell/archive/2011/08/19/wf4-hosting-the- workflowdesigner-oder-andere-wpf-stuff-in-einem-separaten-appdomain.aspx – Will

Antwort

9

MEF ist definitiv die einfachste Option der drei. Es wurde wirklich mit diesem exakten Szenario (erweiterbare Anwendungen) im Auge behalten.

Es ist eigentlich der "Plugin" -Mechanismus von Visual Studio, der eine WPF-Anwendung ist. Alles, was Sie tun müssen, ist, dass Ihr "Plugin" eine Schnittstelle implementiert oder von einer bekannten Basisklasse ableitet und das Attribut [Export] hinzufügt. Sofern die Assembly zum Katalog Ihrer Hauptanwendung hinzugefügt wurde, kann dieser Typ in einem Schritt [Import] ed sein. Es gibt sehr wenig Arbeit, um diese Arbeit zu machen.

Es wäre meine Empfehlung, es sei denn, es gibt einen guten Grund, mit einer anderen Option zu gehen. MAF hat mehr Isolationsunterstützung, ist aber viel schwieriger zu verwenden, und die meisten Isolationsfunktionen sind in einer WPF-Anwendung nicht verwendbar, da die UI in WPF in keinem Fall isolierter Code sein kann.

+0

"... da die Benutzeroberfläche in WPF nicht wirklich isoliert werden kann ..." Nicht sicher, was Sie meinen. Ich brauche die Anwendung, um einige UI, zum Beispiel eine Schaltfläche, zurückzugeben. Das wird von der Haupt-App gerendert, aber es kann einen Rückruf zurück zum Plugin haben. Ist es möglich, das Plugin in einer anderen App-Domain laufen zu lassen, um zu verhindern, dass es die gesamte Anwendung zum Absturz bringt, und vielleicht eine Isolation für Plugins mit geringem Vertrauen bietet? – lacop

+0

@Iacop: Ich würde MEF dafür verwenden. Sie können die Benutzeroberfläche in einer separaten Anwendungsdomäne nicht wirklich isolieren, da sie von Ihrer Shell verwendet werden muss (was ich meinte). Wenn Sie dies für die Erweiterbarkeit der Benutzeroberfläche ausführen, ist die von MAF bereitgestellte AppDomain-Isolierung unbrauchbar, da eine Benutzeroberfläche in der einzelnen Hauptanwendungsdomäne (in WPF) immer vorhanden ist und keine Anwendungsdomänen passieren kann. –

+1

Wenn Sie MAF für rein algorithmische Plugins verwenden, die keinen UI-Code haben, ist es möglich, das Plugin in eine separate AppDomain zu isolieren - aber mit UI-Erweiterbarkeit funktioniert das nicht - so verlieren Sie den einzigen Vorteil gegenüber MAF - Deshalb würde ich sagen, gehen Sie mit MEF (es ist viel flexibler, besser unterstützt, einfacher zu bedienen, etc ...) –