¿Cuál es la diferencia entre una utilidad Zope definido con una fábrica en comparación con un componente?

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

Pregunta

Es un poco confuso que los registros de los servicios públicos ZCML Zope pueden aceptar un componente o una fábrica.

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

frente

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

¿Cuál es la diferencia?

¿Fue útil?

Solución

Una fábrica crea utilidades, mientras que una utilidad registrado como un componente es una instancia. Por lo tanto, si nos fijamos una utilidad registrado como un componente, obtendrá el mismo objeto volver cada vez. Pero si se registra como una fábrica, obtendrá una nueva instancia cada vez.

Otros consejos

Creo que la respuesta de @ Lennart-regebro podría ser un poco involuntariamente engañosa. Es comprensible, ya que los documentos zope son un poco vago. Creo que a continuación es la interpretación correcta, pero tenía que probar a mí mismo para estar seguro.

En tanto el componente y la fábrica registro cada llamada posterior a getUtility, después de un registro inicial, devolverá el misma instancia .

La diferencia es que el método de componentes registrará el objeto referenciado como la instancia de utilidad para ser devuelto, en tanto que el método de fábrica llamará al objeto referenciado y almacenar el resultado como la instancia de utilidad para ser devuelto.

fábrica Ejemplo

Así, por ejemplo, si tiene una clase de utilidad definida como por lo tanto;

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

registrándolo con;     <utility factory=".my_module.MyUtility"/>

será en el punto que se ejecuta el zcml crear una instancia de MyUtility y almacenarla para futuras llamadas a cualquier getUtility;

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

Tenga en cuenta que podríamos haber registrado la fábrica para ser una función en lugar de una clase, sólo tiene que ser algo que cuando se le llama sin argumentos devuelve la instancia de la utilidad que desee usar.

Componente Ejemplo

Un ejemplo equivalente con el componente es;

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

my_module_instance_of_utility = MyUtility()

registrándolo con;     <utility component=".my_module.my_module_instance_of_utility"\>

Esto es más o menos equivalente al ejemplo de la fábrica. La única diferencia es que la instancia devuelta en el ejemplo de componente se crea una instancia cuando my_module es importado por cualquier cosa (incluyendo el mecanismo de registro), en tanto que cuando se utiliza una fábrica de la instancia se crea una instancia cuando se ejecuta la configuración zcml, justo antes de que sea registrado. En ambos casos las llamadas posteriores a getUtility volverán la misma instancia.

No debe confundirse con IFactory

Nada de esto debe ser confundido con IFactory cual proporciona algo que le puede proporcionar una nueva instancia cada vez que se pidió, pero con un API ligeramente diferente. Ver este documento para obtener más información acerca de los .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top