4

如何从组件注册表browser:resource中获取所有注册信息?browser:resourceDirectory

我查看了不同的地方,试图发现 zcml 指令创建了什么样的组件,browser:resource并通过调用找到Products.Five.browser.metaconfigureregisterAdapter

handler('registerAdapter', factory, (layer,), Interface, name, _context.info)

这意味着它将注册一个需要(layer,)和提供的适配器Interface,但调用以下内容不起作用(它返回一个不是浏览器资源的组件)​​:

from zope.publisher.interfaces.browser import IDefaultBrowserLayer
zope.component.getAdapters((IDefaultBrowserLayer,), Interface)

我不确定,但似乎getAdapters需要一个实例。我不想查询 zope.component 而是要获得注册的适配器。

我找到了zope.interface.interfaces一个lookupAll(required, provided)看起来像我想要的方法,但我找不到它的实现位置,所以我不知道如何调用它。

4

1 回答 1

2

zope.component.getAdapters() 确实需要传递一个实例。该zope.interface.registry.Components.getAdapters()方法调用:

list(map(providedBy, objects))

providedBy在哪里zope.interface.declarations.providedBy()。所有IDefaultBrowserLayer提供的是..zope.interface.IInterfacezope.interface.ISpecification.

您需要传入一个提供 IDefaultBrowserLayer的虚拟对象,而不是直接传入接口。

from zope.publisher.interfaces.browser import IDefaultBrowserLayer
import zope.component
import zope.interface

class dummy(object):
    zope.interface.classProvides(IDefaultBrowserLayer)

zope.component.getAdapters((dummy,), zope.interface.Interface)
于 2013-08-13T13:33:45.813 回答