Andreas Jung wrote:
I have an utility registered as

<utility
 provides="textindexng.interfaces.ILexicon"
 factory="textindexng.lexicon.LexiconFactory"
 name="txng.lexicons.default"

/>

trying to create a new Lexicon instance through

lexicon zapi.createObject(None, 'txng.lexicons.default')

does not work (Zope 2.8, Five) because the factory does not seem
to be registered for IFactory.

Adding

<utility
 provides="zope.component.interfaces.IFactory"
 component="textindexng.lexicon.LexionFactory"
 name="txng.lexicons.default"
/>

resolves the issue. But why is the explicit declaration of the factory
necessary? IMO the first declaration implies the second one. So this
looks like configuration overhead to me...thoughts?

This is actually a mixup of the term 'factory'. The 'factory' parameter of the <utility /> directive might suggest that an IFactory is registered, but as you found out, it isn't meant that way. With the <utility /> directive, the parameter 'factory' means a globally accessible callable (class constructor, function, etc.) that creates an instance of the utility. Think of it as a "class factory", not a "factory component" in the Zope 3 sense.


If you want an IFactory utility to be registered (so you can call createObject, for example), you need to do this explicitly. Either with a separate <utility /> directive like you quoted above, or (if you want to save a line) with the <factory /> directive.

Philipp

_______________________________________________
Zope3-users mailing list
Zope3-users@zope.org
http://mail.zope.org/mailman/listinfo/zope3-users

Reply via email to