Quelle est la différence entre un utilitaire Zope défini avec une usine par rapport à un composant?

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

Question

Il est un peu déroutant que les enregistrements ZCML pour les services publics Zope peuvent accepter un composant ou d'une usine.

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

contre

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

Quelle est la différence?

Était-ce utile?

La solution

Une usine crée utilitaires, alors qu'un utilitaire enregistré en tant que composant est une instance. Par conséquent, si vous regardez un utilitaire enregistré en tant que composant, vous obtiendrez le même objet en arrière chaque fois. Mais si elle est enregistrée comme une usine, vous aurez une nouvelle instance à chaque fois.

Autres conseils

Je pense que @ la réponse de lennart-regebro pourrait être un peu sans le vouloir trompeur. Il est compréhensible que les Zope docs sont un peu vague. Je pense que ci-dessous est l'interprétation correcte mais je devais tester moi-même pour être sûr.

à la fois le composant et l'usine inscription chaque appel suivant à getUtility, après une inscription initiale, retournera la même instance .

La différence est que la méthode des composants enregistrera l'objet référencé comme l'instance d'utilité à retourner, alors que la méthode de l'usine appellera l'objet référencé et stocker le résultat que l'instance d'utilité à renvoyer.

Exemple usine

Ainsi, par exemple si vous avez une classe utilitaire définie comme ainsi;

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

avec l'enregistrement;     <utility factory=".my_module.MyUtility"/>

sera au point le zcml est exécuté créer une instance de MyUtility et de le stocker pour les futurs appels à getUtility;

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

Notez que nous aurions pu enregistré l'usine d'être une fonction au lieu d'une classe, il doit juste être quelque chose que lorsqu'il est appelé sans argument renvoie l'instance de votre utilitaire que vous souhaitez utiliser.

Exemple composant

Un exemple équivalent de composant est;

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

my_module_instance_of_utility = MyUtility()

avec l'enregistrement;     <utility component=".my_module.my_module_instance_of_utility"\>

Ceci est plus ou moins équivalent à l'exemple de l'usine. La seule différence est que l'instance retournée dans l'exemple composant est instancié lorsque my_module est importé par quoi que ce soit (y compris le mécanisme d'enregistrement), alors que lors de l'utilisation d'une usine l'instance est instancié lorsque la configuration zcml est exécutée, juste avant qu'il ne soit enregistré. Dans les deux cas, les appels suivants à getUtility retourneront la même instance.

Ne pas confondre avec IFactory

Rien de tout cela doit être confondu avec IFactory qui fournit quelque chose qui peut vous fournir une nouvelle instance à chaque fois qu'il est demandé mais avec une API légèrement différente. Voir ce document pour plus d'informations sur ces .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top