代码之家  ›  专栏  ›  技术社区  ›  joeforker

用工厂定义的zope实用程序与组件有什么区别?

  •  2
  • joeforker  · 技术社区  · 14 年前

    ZCML注册Zope实用程序可以接受组件或工厂,这有点令人困惑。

    <utility component=".some.Class" />

    对战

    <utility factory=".some.Factory" />

    有什么区别?

    2 回复  |  直到 11 年前
        1
  •  2
  •   Lennart Regebro    13 年前

    工厂 创造 实用程序,而注册为组件的实用程序是实例。因此,如果查找注册为组件的实用程序,每次都会得到相同的对象。但是如果它注册为工厂,每次都会得到一个新的实例。

        2
  •  3
  •   cscutcher    11 年前

    我认为@lennart regebro的回答可能有点不经意的欺骗。这是可以理解的,因为Zope文档有点含糊不清。我认为下面的解释是正确的,但我必须自己测试才能确定。

    部件和工厂 注册 每次后续呼叫 到getutility,在初始注册后,将返回 同一实例 .

    不同的是,component方法会将引用的对象注册为要返回的实用程序实例,其中,factory方法会调用引用的对象,并将结果存储为要返回的实用程序实例。

    工厂实例

    例如,如果您有一个这样定义的实用程序类;

    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确实提供了一些东西,可以在每次请求时为您提供一个新实例,但使用的API略有不同。参见 this document for more information about those .

    推荐文章