Frage

Eine der Bibliotheken wir für unser Produkt verwenden verwendet einen Singleton für den Zugriff darauf. Ich bin mir ziemlich sicher, dass es als eine statische Instanz implementiert ist (es ist nicht Open Source). Das funktioniert gut für ein einzelnes Dokument Anwendung, aber unsere App kann mehr als ein Dokument geladen. Ich gehe davon aus Zugriff auf die Instanz ist so etwas wie folgt geschrieben:

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

In Situationen wie diesen, ist es eine Möglichkeit zu schaffen, als robust mehr eine Instanz? Das einzige, was ich denken kann, ist mehr als Prozess zu haben und eine Art von IPC verwenden sie alle zusammen zu binden. Ich kann mich nichts weniger hacky.

Ich habe den Verkäufer gefragt Token irgendeine Art von Sitzung zu implementieren, so kann ich mehrere gleichzeitige Instanzen haben, aber sie sind groß und wir sind klein.

Cory

Bearbeiten:

  • die Maschine ist eine Windows-Maschine
  • die globale statische ist im Grunde eine große Fabrik. Ich mag eine Session-Token eines Typs, so kann ich leicht sagen, „lassen Sie alle Ressourcen aus dieser Sitzung“ (es gibt keine Möglichkeit, die globale Statik neu zu initialisieren, die ich kenne)

Anstatt einige zweifelhaften Spielereien versuchen zu bekommen, was ich will, ich werde die ganze Sache mit meiner eigenen Klasse wickeln und einen Sitzungsschlüssel zu jedem Getter hinzuzufügen. Intern werde ich verfolgen, was zugeteilt wurde meine eigene Release-Methode zurückzukehren Ressourcen hinzuzufügen. Dies ist nicht optimal für viele Gründe, aber ich kann eine bessere Idee nicht denken.

Danke an alle für die tolle Resonanz.

War es hilfreich?

Lösung

Das einzige, was ich denken kann, ist zu Unterklasse es, wenn Sie das Glück haben, die Singleton-Klasse definiert haben, wie:

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

Wenn Sie es Unterklasse und die Unterklasse Zugriff auf den Konstruktor haben, dann können Sie erstellen ein instanzierbar Unterklasse wie:

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};

Dies könnte nicht völlig sicher sein, da der Implementierer einige bösen Annahmen gemacht hat. Aber es ist eine Idee oder ein Konzept, das eine gewisse Chance zu arbeiten haben könnte. Mit etwas Glück kann der Verkäufer auf diese Option zugänglich sein, wenn Sie es ... viel Glück nennen.

Andere Tipps

Auch wenn Sie in der Lage sind, dieses besondere Problem zu lösen, während alles in-proc geschehen ist, würde ich mir Sorgen machen, dass dieses Problem Singletons nur die Spitze des Eisbergs ist. Die Bibliothek war offensichtlich nicht für Ihr Szenario entworfen.

Das Isolieren jede Last der DLL in einen eigenen Prozess klingt richtig und nicht-Hacky mir, obwohl es natürlich für Sie teuer sein könnte.

Ich kann nicht einen Fehler in Ihrer Argumentation leider sehen. Der Hersteller hat eine Entscheidung getroffen, und Sie sind daran gebunden. Er hat sich auf eine Instanz pro Prozess entschieden, so dass, wenn Sie mehrere Instanzen wollen Sie mehrere Prozesse mit allen haben müssen, die zur Folge hat.

Natürlich, wenn Sie davon ausgehen, dass seine Entscheidung zu beschränken willkürlich ist, und dass es kein guter Grund dafür ist, könnten Sie um es zu hacken zu versuchen. Die Art und Weise auf diesem Weg zu beginnen ist eine Demontage / Montage Schritt im Debugger zu tun. Wenn Sie bestätigen können, dass sein Beispiel Fabrik funktioniert genau so, wie Sie oben abgeschlossen haben, können Sie kein Zweifel Hack zusammen eine Alternative, die Erstellung mehrerer Instanzen ermöglicht.

Aber natürlich ist die große Gefahr bei diesem Ansatz ist, dass jede Zeile Code in der Codebasis des Herstellers, der auf seiner Entscheidung stützt eine einzelne Instanz haben, ist dann eine Zeitbombe bereit, in Ihrem Gesicht zu sprengen. Dieser Code ist für Sie unsichtbar. Sind Sie bereit, es zu wetten, sind Null solche Linien? Ich weiß, was Clint Eastwood in einer Situation wie dieser sagen würde; "Do ya Glück Punk fühlen, tun ya gut?" : -)

Es gibt keine eleganten Möglichkeiten, um mehrere Instanzen ein Singleton-Objekt in einem Programm Raum zu haben - aber das ist absichtlich. In der Regel verwenden Sie nur einen Singleton in dem Fall, wo es nicht erwünscht ist, mehrere Instanzen zu haben. Wenn der Verkäufer ihr Produkt mit einem Singleton implementiert hat, kann es für die Wahl gute Gründe geben.

Vielleicht, wenn Sie Ihr Problem genauer zu beschreiben, kann es andere Ansätze möglich sein. Es ist schwer zu sagen, auf der Grundlage der bereitgestellten Informationen. Was macht das Singleton-Objekt? Warum wollen Sie mehrere Instanzen es brauchen?

Mit Ausnahme der Inter Sachen, die Sie vorgeschlagen, die beste Hack, den ich mit oben kommen kann ist die DLL in eine neue Datei zu kopieren und manuell die neue DLL laden und alle Funktionen importieren Sie für jede Instanz verwenden Sie erstellen.

Hoffentlich bedeutet dies die statischen Variablen nicht zwischen den verschiedenen Instanzen in Konflikt geraten, da sie technisch nicht in der gleichen DLL sind. Allerdings gibt es viele schlechte Dinge mit dieser Lösung, wie alle Code in der DLL für jede Version geklont und Sie verwenden können, um eine Importbibliothek nicht, sondern müssen die DLL zu laden und alle Funktionen manuell importieren.

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