2024-05-14 08:47:48 发布
网友
Zope实用程序的ZCML注册可以接受组件或工厂,这有点令人困惑。在
<utility component=".some.Class" />
与
<utility factory=".some.Factory" />
有什么区别?在
工厂创建实用程序,而注册为组件的实用程序是一个实例。因此,如果您查找注册为组件的实用程序,则每次都将获得相同的对象。但是如果它注册为工厂,那么每次都会得到一个新实例。在
我认为@lennart regebro的回答可能有点无心欺骗。这是可以理解的,因为zope文档有点模糊。我认为下面的解释是正确的,但我必须亲自测试才能确定。在
在中,组件和工厂注册在初始注册之后,对getUtility的每个后续调用都将返回同一个实例。在
不同之处在于,组件方法将被引用对象注册为要返回的实用程序实例,其中factory方法将调用被引用对象并将结果存储为要返回的实用程序实例。在
例如,如果你有一个这样定义的实用程序类
class MyUtility(object): implements(IMyUtility) ...
向注册; <utility factory=".my_module.MyUtility"/>
<utility factory=".my_module.MyUtility"/>
将在执行zcml时创建MyUtility的实例并将其存储以备将来调用getUtility
注意,我们可以将工厂注册为一个函数而不是一个类,它只需要在没有参数的情况下调用时返回要使用的实用程序的实例。在
组件的等效示例是:
class MyUtility(object): implements(IMyUtility) ... my_module_instance_of_utility = MyUtility()
向注册; <utility component=".my_module.my_module_instance_of_utility"\>
<utility component=".my_module.my_module_instance_of_utility"\>
这或多或少相当于工厂的例子。唯一的区别是,组件示例中返回的实例是在my_module被任何东西(包括注册机制)导入时实例化的,在使用工厂时,实例是在zcml配置执行时实例化的,就在注册之前。在这两种情况下,对getUtility的后续调用将返回相同的实例。在
my_module
这一切都不能与IFactory混淆,IFactory确实提供了一些东西,可以在每次被请求时提供一个新实例,但API略有不同。见this document for more information about those。在
工厂创建实用程序,而注册为组件的实用程序是一个实例。因此,如果您查找注册为组件的实用程序,则每次都将获得相同的对象。但是如果它注册为工厂,那么每次都会得到一个新实例。在
我认为@lennart regebro的回答可能有点无心欺骗。这是可以理解的,因为zope文档有点模糊。我认为下面的解释是正确的,但我必须亲自测试才能确定。在
在中,组件和工厂注册在初始注册之后,对getUtility的每个后续调用都将返回同一个实例。在
不同之处在于,组件方法将被引用对象注册为要返回的实用程序实例,其中factory方法将调用被引用对象并将结果存储为要返回的实用程序实例。在
工厂示例
例如,如果你有一个这样定义的实用程序类
向注册;
<utility factory=".my_module.MyUtility"/>
将在执行zcml时创建MyUtility的实例并将其存储以备将来调用getUtility
^{pr2}$注意,我们可以将工厂注册为一个函数而不是一个类,它只需要在没有参数的情况下调用时返回要使用的实用程序的实例。在
组件示例
组件的等效示例是:
向注册;
<utility component=".my_module.my_module_instance_of_utility"\>
这或多或少相当于工厂的例子。唯一的区别是,组件示例中返回的实例是在
my_module
被任何东西(包括注册机制)导入时实例化的,在使用工厂时,实例是在zcml配置执行时实例化的,就在注册之前。在这两种情况下,对getUtility的后续调用将返回相同的实例。在不要和IFactory混淆
这一切都不能与IFactory混淆,IFactory确实提供了一些东西,可以在每次被请求时提供一个新实例,但API略有不同。见this document for more information about those。在
相关问题 更多 >
编程相关推荐