使用工厂和组件定义的Zope实用程序有什么区别?

Zope实用程序的ZCML注册可以接受组件或工厂,这有点令人困惑。
<utility component=".some.Class" />
<utility factory=".some.Factory" />
有什么不同?     
已邀请:
工厂创建实用程序,而注册为组件的实用程序是实例。因此,如果您查找注册为组件的实用程序,则每次都会返回相同的对象。但是如果它被注册为工厂,那么每次都会得到一个新实例。     
我认为@ lennart-regebro的回答可能有点无意中具有欺骗性。这是可以理解的,因为zope文档有点模糊。我认为下面是正确的解释,但我必须自己测试才能确定。 在组件和工厂注册中,每次后续调用getUtility,在初始注册后,将返回相同的实例。 区别在于组件方法将引用的对象注册为要返回的实用程序实例,其中工厂方法将调用引用的对象并将结果存储为要返回的实用程序实例。 工厂示例 因此,例如,如果您有一个如此定义的实用程序类;
class MyUtility(object):
    implements(IMyUtility)
    ...
注册;     
<utility factory=".my_module.MyUtility"/>
将在执行zcml时创建一个MyUtility实例并存储它以用于将来调用getUtility;
> a = getUtility(IMyUtility)
> b = getUtility(IMyUtility)
> c = getUtility(IMyUtility)
> a is b is c
True
请注意,我们可以将工厂注册为函数而不是类,它只需要在没有参数的情况下调用时返回要使用的实用程序实例。 组件示例 组件的等效示例是;
class MyUtility(object):
    implements(IMyUtility)
    ...

my_module_instance_of_utility = MyUtility()
注册;     
<utility component=".my_module.my_module_instance_of_utility">
这或多或少等同于工厂示例。唯一的区别是,当任何东西(包括注册机制)导入
my_module
时,实例化组件示例中返回的实例,其中当使用工厂时,实例在执行zcml配置时实例化,就在它注册之前。在这两种情况下,后续的getUtility调用都将返回相同的实例。 不要与IFactory混淆 这些都不会与IFactory混淆,IFactory确实提供了一些东西,可以在每次询问时为您提供一个新实例,但API略有不同。有关这些内容的详细信息,请参阅此文档     

要回复问题请先登录注册