Domanda

E 'un po' di confusione che ZCML iscrizioni per Zope utilities è in grado di accettare un componente o di una fabbrica.

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

versus

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

Qual è la differenza?

È stato utile?

Soluzione

Una fabbrica di crea utilities, mentre un programma di utilità registrato come componente è un'istanza. Quindi, se si guarda un programma di utilità registrato come un componente, si otterrà lo stesso oggetto di nuovo ogni volta. Ma se è registrata come una fabbrica, si otterrà una nuova istanza ogni volta.

Altri suggerimenti

Penso che @lennart-regebro la risposta potrebbe essere un po ' involontariamente ingannevole.È comprensibile come zope docs sono un po ' vago.Penso che sotto è l'interpretazione corretta, ma ho avuto la prova me stesso per essere sicuri.

In sia il componente e la fabbrica registrazione ogni chiamata successiva per getUtility, dopo una prima registrazione, verrà restituito il stessa istanza.

La differenza è che il metodo di un componente si registra l'oggetto a cui fa riferimento il programma di utilità di istanza per essere restituito, dove come metodo factory sarà chiamata l'oggetto di riferimento e di salvare il risultato come l'utilità istanza deve essere restituito.

Esempio In Fabbrica

Così, per esempio, se si dispone di una classe di utilità definita così:

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

registrazione con; <utility factory=".my_module.MyUtility"/>

al punto che il zcml viene eseguito creare un'istanza di MyUtility e conservarlo per le future chiamate a getUtility;

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

Si noti che si potrebbe avere registrati in fabbrica per essere una funzione invece di una classe, basta che sia qualcosa che, quando viene chiamato senza argomenti restituisce l'istanza di utilità che si desidera utilizzare.

Componente Esempio

Un esempio equivalente con componente;

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

my_module_instance_of_utility = MyUtility()

registrazione con; <utility component=".my_module.my_module_instance_of_utility"\>

Questo è più o meno equivalente all'esempio in fabbrica.L'unica differenza è che l'istanza restituito nella componente di esempio viene creata un'istanza quando my_module viene importato nulla (compreso il meccanismo di registrazione), dove, come quando si utilizza una fabbrica, l'istanza viene creata un'istanza quando il zcml config viene eseguito, appena prima che venga registrato.In entrambi i casi le chiamate successive a getUtility restituirà la stessa istanza.

Da non confondere con IFactory

Nessuno di questo è quello di essere confuso con IFactory che fornisce qualcosa che può fornire una nuova istanza ogni volta che ci viene chiesto, ma con una diversa API.Vedere questo documento per ulteriori informazioni su tali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top