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?
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?
Antworten:
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
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:
In der Praxis hat es viel mit der Abhängigkeitsinjektion und dem Strategiemuster zu tun.
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!