On 6 Feb 2007, at 15:41 , Chris Withers wrote:
Philipp von Weitershausen wrote:
Well, actually, you can't register it through ZCML because ZCML
knows nothing about the ZODB.
Why would this be in zope.conf at all?
I would have thought just having a normal zcml setup for a
single, global IRootObjectFactory utility would be fine...
Okay, how about the config parser registers the utility:
The config parser (ZConfig) is generic and doesn't know anything
about the component architecture. The main() program in
zope.app.appsetup, which makes use of the zope.conf configuration,
would have to do it.
from zope.component import provideUtility
Of course, I don't see any reason for the config parser to _have_
to do so... something just needs to register an IRootObject before
the first publication gets instantiated, right?
Right, but the whole point of factoring it out to a utility is to
gain the ability to override things. If it's registered using
z.c.provideUtility(), it'll be hard to impossible to override it
using overrides.zcml. That's why I suggested we use named utilities
because the we don't need to work with overrides.zcml.
If so, what bad things could happen if the zodb sections in
zope.conf were made optional and a later zcml statement provided
<utility factory="myIRootObjectProvider" />
Yeah, but how would you implement myIRootObjectProvider w/o having
access to the ZODB? You don't know which ZODB you're going to get the
root object from because that's decided *at runtime* in the main()
program by reading zope.conf.
I guess just IRootObject is ok, the factory would have been a bit
more generic because then you're not registering a specific root
object for all times but could actually incorporate some logic
into the root-object-finding-process.
Also, why the factory? Why not just IRootObject?
Why would you want to do that?
Because I'm not sure how persistent objects behave in a global
registry. Right now in the Zope default publication, the root object
is gotten *after* opening the DB. If we'd register the (persistent)
root object in the global registry, it might exist w/o any ZODB
connections open. Not sure if that's every going to occur, or if
that's going to be a problem, etc.
Anyway, I think I've tried to give as many pointers as I could. I'm
sure some of the things discussed here will come up when you'll
implement this :).
Zope3-dev mailing list