IOC und staatenlose Dienste. Kurzlebig oder Einzelinstanz?


8

Angesichts eines Garbage-Collected-Frameworks ist es bei Verwendung eines IOC-Containers zum Injizieren von rein zustandslosen Diensten im Allgemeinen besser, die Lebensdauer einer einzelnen Instanz des Containers zu verwenden oder das Objekt bei jeder Verwendung neu zu erstellen und es und alle seine Abhängigkeiten wegzuwerfen sobald du mit ihnen fertig bist?

Antworten:


5

Sie erwähnen, dass Ihr Dienst Abhängigkeiten aufweist.

Wenn eine Abhängigkeit in Ihrem Abhängigkeitsdiagramm nicht vollständig zustandslos ist oder wenn eine Ihrer Abhängigkeiten in Ihrem Abhängigkeitsdiagramm so geändert werden sollte, dass sie nicht mehr so ​​vollständig zustandslos ist, schlägt das gesamte System fehl. Und die Fehler, die Sie erhalten, werden wahrscheinlich sehr kryptisch sein, was es schwierig macht, das Problem zu entdecken.

Angenommen, Sie sind ein Entwicklerteam, das an dem Projekt arbeitet. Es ist höchst unwahrscheinlich, dass jeder von ihnen weiß, dass für die IOC-Konfiguration alle diese Komponenten vollständig zustandslos bleiben müssen. Sie mögen es jetzt wissen, aber dieses Bewusstsein wird mit der Zeit verblassen. Und wenn Sie einen neuen Mann einstellen, wird er / sie es auch nicht wissen.

Daher würde ich den IOC-Container definitiv so einrichten, dass jedes Mal eine neue Instanz zurückgegeben wird. Es ist einfach die sicherere Wahl, imho.

Ich würde mir sicherlich keine Sorgen um Ressourcen machen. Die Kosten für den Bau und die Speicherbereinigung von Objekten sind wahrscheinlich unbedeutend im Vergleich zu beispielsweise nur einer einzigen Datenbanksuche.


Sie möchten also jedes Mal neue Instanzen erstellen, weil Sie möglicherweise nicht wissen, wie Sie einen Dienst zustandslos machen können?
Matthew Flynn

1
Ich versuche zu sagen, dass es schwierig sein kann, vorherzusagen, wie sich Ihre Codebasis im Laufe der Zeit ändern wird. Aber die Frage ist sehr allgemein, also gebe ich eine sehr allgemeine Antwort;)
Pete

Ja, die Frage war absichtlich allgemein gehalten, weil ich nicht riskieren wollte, dass meine eigene Voreingenommenheit durchkommt. Immer noch enttäuscht, keine erfahrungsbasierte Antwort zu erhalten, aber dies ist die am besten durchdachte Begründung. Vielen Dank.
pdr

4

Die Einzelinstanz war aus einem bestimmten Grund das Standardverhalten von Spring. Eine einzelne Instanz eines zustandslosen Dienstes verbraucht weniger Ressourcen als die ständige Erstellung und Speicherbereinigung vieler Instanzen. Darüber hinaus besteht keine wirkliche Gefahr bei der Freigabe eines zustandslosen Dienstes, es gibt jedoch einige echte Skalierbarkeitsprobleme beim Erstellen mehrerer Instanzen eines Dienstes.

Ich würde also sagen, dass die Einzelinstanz höchstwahrscheinlich Ihr Freund sein wird.


0

Ohne weiteren Kontext denke ich, dass es nicht wirklich wichtig ist.

Sie können die Vorteile kurzlebiger Objekte von einer einzelnen Instanz erhalten, wenn diese Instanz einfach die kurzlebigen Objekte für jeden Aufruf erstellt, und Sie können die Vorteile einer einzelnen Instanz von vielen kurzlebigen Objekten erhalten, wenn diese lediglich wirken als Fliehgewichte .

Natürlich ist es unnötig laut, es in eine Richtung einzurichten, nur um es an das Gegenteil zu delegieren. Ich denke, Sie sollten nur raten, ob Sie wahrscheinlich überhaupt einen Status hinzufügen und wenn ja, ob es sich um einen persistenten / globalen Status (z. B. beim Hinzufügen eines Caches) oder einen kurzlebigen / lokalen Status handelt.

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.