将Zope组件注册到GlobalSiteManager有什么意义?

时间:2013-08-14 09:41:44

标签: zope.interface zope.component

我正在阅读有关zope组件架构的精彩教程:

http://www.muthukadan.net/docs/zca.html#adapters

我似乎无法理解 Adapters 章节。

>>> from zope.interface import implements
>>> from zope.component import adapts

>>> class FrontDeskNG(object):
...
...     implements(IDesk)
...     adapts(IGuest)
...
...     def __init__(self, guest):
...         self.guest = guest
...
...     def register(self):
...         guest = self.guest
...         next_id = get_next_id()
...         bookings_db[next_id] = {
...         'name': guest.name,
...         'place': guest.place,
...         'phone': guest.phone
...         }

如果我错了,请纠正我。上面的类FrontDeskNG是一个适配器,对吗?正如文章中所写:

  

FrontDeskNG是IDesk的适配器,适用于IGuest

好的,现在我有适配器,为什么我必须注册它才能使用GlobalSiteManager才能使用它?

我正在开发移动游戏后端,我希望通过查看Zope组件架构来使代码更加模块化。我需要能够使用任何数据库技术交换我的存储,并使代码仍然有效。这似乎是ZCA自豪地宣传的东西。我从未读过着名的GoF设计模式书,所以请耐心等待。

1 个答案:

答案 0 :(得分:1)

一个实用的优点是它允许以下非常酷的片段;

use_me_like_a_desk = IDesk(instance_of_something_providing_iguest)

除了你想要提供IDesk接口的东西之外,你不必指定任何东西。只要您注册了将IGuest转换为IDesk的适配器,一切正常。

换句话说

这可能是最好的示例,但您可以使用注册框架进行许多查询。例如,您可以提出要求;

  

我有这个东西,请确保它有这个界面。

甚至是公用事业

  

请告诉我为我的应用程序提供此界面的东西

优点

通常使用zcml按应用程序完成各种适配器和实用程序的所有注册。这样可以轻松地将一个适配器换成另一个适配器,或者使用不同的实用程序实现,而无需更改大量代码。

更一般地说,组件的注册加强了解耦。您可以构建多个可以协同工作的模块,而无需将它们组合在一起。两个模块需要协同工作的唯一事情是一组通用的接口。

这使得编写无缝地协同工作的模块变得非常容易,而不会使它们彼此依赖,这反过来又可以轻松地添加,删除,发展和测试新组件而无需大量重构。

更多信息

我确信你已经发现zope文档的各个部分已经分散并且很难找到。我需要很长时间才能想到它们为点击带来的一些概念和优势,你能做的最好的事情就是尽可能多地阅读,然后在阿拉斯加的洞穴里住六个月并冥想它。

Comprehensive Guide to Zope Component Architecture是一个良好的开端,但我也建议至少阅读zope.component docszope.interface docs。特别是this example might help you understand the benefit