Wie würde man steckbare Software erstellen?


20

Wenn Sie eine Anwendung haben und Ihre Benutzer Plugins dafür schreiben sollen, wie sollte die Anwendung gestaltet sein?

Was müssen Sie beachten, welche Designmuster sind dafür etc?


Muster wie Observer, Mediator, Command und Chain of Responsibility kommen in den Sinn
Mchl

3
@Mchl: Bitte poste deine Antwort als Antwort, nicht als Kommentar.
S.Lott

Sie sollten einen Blick auf Mef und die MSDN-Informationen
Luc Bos

Ich
denke

@Mchl: "nicht detailliert genug"? Warum dann überhaupt kommentieren? Es ist eindeutig eine Antwort. Bitte poste Antworten als Antworten.
S.Lott

Antworten:


13

Es hängt ein bisschen von Ihrer Plattform ab, aber einige allgemeine Dinge, die Sie beachten sollten

Versionierung Was passiert, wenn Sie Ihre Anwendung aktualisieren? Werden alle alten Plugins veraltet (das Firefox-Problem)?

Isolation Können Plugins tun, was sie wollen? Vertraust du ihnen immer? Oder müssen Sie sie in einer Art Sandbox ausführen und Berechtigungen anfordern.

Updates Wie gehen Sie mit Plugin-Updates um?

Sicherheit Wie stellen Sie den Autor eines Plugins sicher, verhindern, dass Spoofing oder Benutzer dazu verleitet werden, bösartigen Code zu installieren? Wird normalerweise durch eine Art Codesignatur gelöst

Serialisierung Wenn Sie eine Art Isolation verwenden, müssen Sie häufig Informationen zwischen verschiedenen Threads oder Prozessen serialisieren. Wie machst du das am effizientesten?

Erweiterbarkeit Welche Aspekte müssen Sie erweitern? Wie maximiert man das Potenzial von Plugins, ohne dass die API unhandlich wird?

Wenn Sie sich an Entwickler von Drittanbietern wenden, die Plugins benötigen, ist es meiner Erfahrung nach am wichtigsten, die API und Klassen des Plugins als völlig anders als den Rest der Anwendung zu betrachten und die Entwicklung für sie so einfach wie möglich zu gestalten wie möglich. Es ist sehr einfach für die Architektur von der Haupt-App, in die Plugins zu "bluten", so dass Plugin-Autoren viel mehr lernen müssen, als sie müssen. Machen Sie es ihnen einfach, überlegen Sie sich, welche Art von Benutzeroberfläche Sie als Plug-in-Autor haben möchten.

Eine andere gute Einstellung ist, nicht zu denken: "Das Plugin erledigt all diese Dinge (im Code), sondern" das Plugin muss diese Informationen bereitstellen. "Auf diese Weise kann die Anwendung die erforderlichen Informationen konsumieren und die eigentliche Verarbeitung durchführen, was die Arbeit vereinfacht das Plugin.

Auch im Allgemeinen haben Sie einen großen Vorteil, wenn Sie einen beschreibenden Ansatz (Metadaten wie XML) anstelle von Code wählen können, da Metadaten einfacher zu transportieren, zu versionieren, bereitzustellen, zu sichern und von Dritten einfacher zu konfigurieren sind


1
+1 Es wird die Frage nicht direkt beantwortet, aber dies sind wichtige Punkte, die zu beachten sind
Adriano Carneiro

Ich glaube, diese Probleme werden behandelt, bevor jemand damit beginnt, den eigentlichen Erweiterungsmechanismus zu entwickeln
Gus

9

Ich habe das geschrieben Code Project-Artikel über die Verwendung von MEF für die Erweiterbarkeit in .NET geschrieben. Es ist eine gute Einführung.

Es gibt andere Erweiterungs-Frameworks für .NET, wie die Add-In-Architektur von SharpDevelop , Mono.Addins und System.AddIn .

Für Java gibt es die Eclipse-Plug-in-Architektur .

Das allgemeine Muster lautet wie folgt:

  • Sie definieren einen Vertrag (normalerweise eine Schnittstelle) zwischen dem Host und der Erweiterung
  • Sie benötigen einen Erkennungsmechanismus, der nach installierten Erweiterungen sucht
  • Sie müssen in der Lage sein, die Erweiterungen dynamisch zu laden und den Host darauf aufmerksam zu machen

In der Praxis hat es viel mit der Abhängigkeitsinjektion und dem Strategiemuster zu tun.


+1 MEF und System.AddIn sind beide gute Dinge zu betrachten. Auch wenn Sie sie nicht verwenden, zeigen beide gute Konzepte.
RationalGeek

@jkohlhepp - Ich stimme zu, und ich würde auch vorschlagen, tief in die SharpDevelop-Architektur einzutauchen, weil viel darüber geschrieben wurde, Open Source ist (so wie MEF, übrigens) und gut gestaltet ist.
Scott Whitlock

3

Sie müssen nur eine Schnittstelle für die Plugins bereitstellen.

Es sollte mindestens eine Activate-Methode (einen Einstiegspunkt) enthalten, aber Sie möchten auch Dinge wie Initialisieren usw..

Außerdem sollte die Möglichkeit bestehen, mit der Host-Anwendung auf registrierungsähnliche Weise zu kommunizieren, beispielsweise um Menüelemente zu registrieren. Daher sollten Registrierungen für Dinge bereitgestellt werden, die für Plugins änderbar / erweiterbar sind.

Außerdem sollte es einen zugänglichen Speicherplatz für die Daten und Objekte der Host-Anwendung geben, damit Plug-ins ihre Routinen aufrufen können. Dies kann auf einfache Weise erreicht werden, indem ein DI-Container wie Unity verwendet wird und die Plugins darauf zugreifen, sodass sie die benötigten Dienste auflösen können.

Ein Event-Aggregator ist wahrscheinlich auch eine gute Idee, damit die Plugins Ereignisse auslösen und entkoppelt auf Ereignisse von anderen Plugins und der Host-Anwendung reagieren können. Du willst definitiv einen!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.