2017-11-20 3 views
2

Ich baute eine Bibliothek, die in Plugins für eine Anwendung verwendet wird.
Diese Bibliothek enthält einen Singleton (ich weiß, Singletons sind hier nicht beliebt und ich hätte keinen benutzt, wenn es einen Weg gab).
Jetzt ist meine Frage:Singleton und verschiedene Bibliotheksversionen

Was passiert, wenn zwei Plugins mit verschiedenen Versionen der Bibliothek erstellt wurden?

  • Ist das nur ein Problem, wenn sich die Singleton-Klasse geändert hat?
    • hinzugefügt Methoden/Entfernte Methoden/Geändert Signaturen/Implementierung ändert
  • Oder ist es immer ein Problem?

bearbeiten: von Plugins, die ich auf gemeinsam genutzte Objekte beziehe mich auf die zur Laufzeit geladen werden. Grundsätzlich erlaubt die Anwendung das Exportieren von Klassen mit einem Makro mit bekannten Basisklassen. Nach dem Laden der Bibliothek mit den Plugin-Klassen kann der Benutzer diese Plugins (die exportierten Klassen) instanziieren. Diese Basisklassen definieren nur verschiedene Arten von Plugins. I.e. Plugins, die sich auf Interaktion, Visualisierung usw. auswirken.

+1

Zu viele Variablen. Beginnen Sie, sich zu verengen, indem Sie beschreiben, was Sie mit Plug-in meinen. – user4581301

+0

Ich habe die Frage aktualisiert. Ich versuche, die Frage allgemein zu halten, aber wenn die Antwort stark vom Kontext abhängt, kann ich auf die Details eingehen. –

Antwort

1

Wenn Ihre Bibliothek statisch ist, sollte es keine Probleme geben, da sie in den Code des Plugins kopiert wird.

Eine dynamische Bibliothek wird jedoch aus dem Programm heraus referenziert. Wenn Sie ein Plugin verwenden, das beispielsweise Version 1.1 Ihrer Bibliothek verwendet und die Anwendung, die das Plugin lädt, nur Version 1.0 kennt, können Sie bis zu Abstürzen seltsames Laufzeitverhalten bekommen.

Der einfachste Weg wäre, eine getVersion() Funktion zu implementieren, damit die Anwendung prüfen kann, ob die angenommene Version auf dem Zielsystem installiert ist und auf frühere Versionen zurückgreift, falls dies nicht der Fall ist. Es hängt davon ab, welche Funktionalität Sie verwenden und ob oder wie sie geändert wurde.

Aber um zu Ihrer Ausgangsfrage zurückzukommen: Es spielt keine Rolle, ob es zwei Plugins gibt, die verschiedene Versionen verwenden. Es spielt eine Rolle, ob eines dieser Plugins eine Version verwendet, die nicht auf dem Ziel installiert ist (nur dynamische Bibliothek)

+0

Danke für die Antwort! Leider kann ich die Basisanwendung nicht ändern, und falls ich nicht klar bin, müssen die Plugins alle die gleiche Singleton-Instanz verwenden, also sollte es anwendungsweit sein. Ich habe bereits überprüft, dass das der Fall ist, wenn die Version gleich ist. Ich nehme an, dass das erste Plugin, das geladen wird, seine Version des Singletons erstellt, oder? Wenn ja, erstellen nachfolgende Plugins, die mit einer neueren Version erstellt wurden, eine neue Instanz ihrer Singleton-Version oder greifen sie auf die alte Version zu, indem sie den in der Kopfzeile der neueren Version definierten Vertrag verwenden? –

+0

Wenn Sie nur das Hauptprogramm erstellen das Singleton erstellen, indem Sie es aufrufen, rufen Sie Code, der nicht über die neue Version wissen. Wenn Ihr Plugin jedoch den gesamten Singleton-Code selbst kompiliert, ist es wahrscheinlich, dass die Instanz aus diesem Code erstellt wird und daher die neue Version ist. Aber ich empfehle, nur die alte Version zu verwenden, weil entweder das Hauptprogramm oder das Plugin verwirrt werden könnte, wenn ein Speicherobjekt nicht so ausgerichtet ist, wie es für sie sein sollte. – Detonar

+0

Ich denke, es Anwendungs-weit zu nennen war ein bisschen irreführend.Das Hauptprogramm kennt nicht einmal den Singleton. Es ist in den Plugins enthalten und wird nur von ihnen verwendet. Aber wenn ich Sie richtig verstehe, würde das Singleton nur vom ersten Plugin erstellt werden, das darauf zugreift und die Version dieses Plugins verwendet, und Plugins mit anderen Versionen würden mit ihrer Version auf das Speicherobjekt zugreifen. Könnte ich das umgehen, indem ich mit einem Singleton eine * Arbeiterklasse * verwalte, die die ganze Arbeit erledigt, und wenn ein Plugin geladen wird, prüft es die Version der * Arbeiterklasse *, und wenn es älter ist, ersetzt es sie? –

Verwandte Themen