Frage

Kurz gesagt:. Was ist der beste Weg, um eine Fabrik + Plugin-Mechanismus zu entwerfen und zu implementieren, so dass Plugins Objekte in der Hauptanwendung ersetzen

Wir haben eine Code-Basis, aus denen wir unsere Anwendungen zu erstellen. Die Code-Basis ist für 70-95% der Anwendungen in Ordnung, dass wir 5-30% des Standardverhalten ändern müssen in jeder neuen Anwendung Sinn (neue Funktionen hinzufügen, Logik ändern Standard, fügen GUI usw.).

Die Implementierung ist Plugin-basiert: der Code-Basis in eine EXE und DLLs gebaut wird, und wenn die Haupt EXE läuft wir eine DLL laden, die die erforderliche Funktionalität hinzufügt

.

Zur Zeit jede Plugin macht folgende Funktion:

PluginInterface* PluginInit()
{
    return new MyCustomizedPluginInterface();
}

Wo PluginInterface ist wie folgt definiert:

class PluginInterface {
public:
    virtual SomeClass1* customizedSomeClass1() = 0;
    virtual SomeClass2* customizedSomeClass2() = 0;
};

Und SomeClass1 / SomeClass2 einige Standardverhalten haben, kann aber durch das Plugin überschrieben und verändert werden.

Die aktuelle Implementierung macht es schwierig für neue kundenspezifische Klassen hinzuzufügen. Wir möchten, dass jede Klasse in der Hauptanwendung des Plugins ersetzen, so macht es Sinn Objekt Fabriken zu nutzen.

Ein SDK, die ich kenne verwendet die folgende Technik:

PluginInterface* PluginInit(GodObject* godObject)
{
    FactoryForSomeClasses* factoryForSomeClasses = 
        godObject->factoryForSomeClasses();
    factoryForSomeClasses->setSomeClass1Creator( MyCustomizedSomeClass1::create); // create is a static creator function.
    factoryForSomeClasses->setSomeClass2Creator( MyCustomizedSomeClass2::create);
}

Ich frage mich, ob es Alternativen zu diesem Ansatz ist.

Wie würden Sie empfehlen Konzeption und Implementierung eines Plugin-System / Fabrik, wie ich gerade beschrieben?

War es hilfreich?

Lösung

Es gab einen Artikel vor einiger Zeit in Doctor Dobbs, die genau dieses Problem diskutiert. Hier ist ein Link zu dem Artikel in Frage.

Als Nebenwirkung kann man mit einer geraden C-Schnittstelle für den Plugins zu einem Projekt bleiben will. Auf diese Weise können Sie Code-Link in fast jeder Sprache in Ihren Rahmen mit minimalem Aufwand geschrieben. Während C ++ ist schön, in der Lage zu sein mehr als zu nutzen, was existiert in C ++, wie die unglaubliche Frameworks, die in Java und Python Ländern existieren, könnte auf lange Sicht als vorteilhaft erweisen.

Andere Tipps

Haben schauen Sie auf Codeproject Beispiele für Plugins Frameworks? https://secure.codeproject.com/KB/DLL/plugin.aspx http://www.codeproject.com/KB/library/dynobj.aspx

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top