Was ist der Unterschied zwischen einem Zope-Dienstprogramm mit einer Fabrik definierte im Vergleich zu einer Komponente?

StackOverflow https://stackoverflow.com/questions/2135316

Frage

Es ist ein wenig verwirrend, dass ZCML Registrierungen für Zope-Dienstprogramme eine Komponente oder eine Fabrik annehmen können.

<utility component=".some.Class" />

Vergleich

<utility factory=".some.Factory" />

Was ist der Unterschied?

War es hilfreich?

Lösung

Eine Fabrik schafft Dienstprogramme, während ein Programm als eine Komponente registriert ist eine Instanz. Wenn Sie also ein Dienstprogramm als Komponente registriert nachschauen, werden Sie das gleiche Objekt zurück jedes Mal bekommen. Aber wenn es als Fabrik registriert ist, werden Sie eine neue Instanz erhalten, jedes Mal.

Andere Tipps

Ich denke, @ lennart-regebro Antwort könnte ein wenig unbeabsichtigt täuschen. Es ist verständlich, da die zope docs ein wenig vage sind. Ich denke, unten ist die richtige Interpretation, aber ich hatte es zu testen, mich sicher zu sein.

In sowohl die Komponente und die Fabrik Anmeldung jeder nachfolgender Aufruf zu getUtility nach einer anfänglichen Registrierung, kehrt die gleiche Instanz .

Der Unterschied besteht darin, dass die Komponentenmethode wird das referenzierte Objekt als Utility-Instanz registrieren zurückgegeben werden, wo als Factory-Methode wird das referenzierte Objekt aufrufen und speichern Sie das Ergebnis als das Dienstprogramm Instanz zurückgegeben werden.

Werk Beispiel

So zum Beispiel, wenn Sie eine Utility-Klasse wie so definiert ist;

class MyUtility(object):
    implements(IMyUtility)
    ...

Registrierung mit;     <utility factory=".my_module.MyUtility"/>

wird die zcml an dem Punkt ausgeführt wird, eine Instanz von MyUtility erstellen und speichern es für alle zukünftigen Anrufe getUtility;

> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True

Beachten Sie, dass wir die Fabrik registriert haben könnte eine Funktion statt einer Klasse zu sein, es muss nur etwas sein, dass, wenn ohne Argumente gibt die Instanz des Dienstprogramms Sie verwenden möchten genannt.

Komponenten Beispiel

Ein äquivalentes Beispiel mit der Komponente ist;

class MyUtility(object):
    implements(IMyUtility)
    ...

my_module_instance_of_utility = MyUtility()

Registrierung mit;     <utility component=".my_module.my_module_instance_of_utility"\>

Dies ist mehr oder weniger gleich dem Fabrik Beispiel. Der einzige Unterschied ist, dass die Instanz in der Komponente Beispiel zurückgegeben instanziiert wird, wenn my_module durch nichts (einschließlich dem Registrierungsmechanismus) eingeführt wird, wo, wie, wenn eine Fabrik der Instanz unter Verwendung instanziiert wird, wenn die zcml Config ausgeführt wird, kurz bevor es registriert ist. In beiden Fällen nachfolgende Aufrufe getUtility die gleiche Instanz zurück.

Nicht mit IFactory

verwechselt werden

Nichts davon ist mit IFactory zu verwechseln, die etwas tut, an die Sie eine neue Instanz jedes Mal zur Verfügung stellen kann es aber mit einem etwas anderen API gefragt wird. Siehe dieses Dokument für weitere Informationen über diese .

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