【问题标题】:Understanding Zope Component Architecture and Component Dependency了解 Zope 组件架构和组件依赖性
【发布时间】:2012-10-12 14:20:02
【问题描述】:

我的问题很难有一个好的标题。 据我了解,Adapter 是在不改变组件的情况下,为组件添加更多的服务。适配器可以从多个组件扩展服务。

但是组件之间的依赖关系呢?如何像这个普通的 Python 代码一样设置组件 A (Person) 和组件 B (Task) 之间的依赖关系

class Person:
 pass

class Task:
 def __init__(self, person):
  self.owner = person

如果我实现了 2 个类

from zope.interface import Interface
from zope.interface import implements

class IPerson(Interface):
 pass

class Person(object):
 implements(IPerson)

class ITask(Interface):
 pass

class Task(object):
 implements(ITask)
 def __init__(self, person):
  self.owner = person

这是一个好的实现吗?

【问题讨论】:

    标签: python zope zope.component


    【解决方案1】:

    关键在于,使用 ZCA,您 将依赖项设置为具体对象。您改用实用程序。

    对象 A 将实现一个接口,您在 B 中查找该接口以找到一个具体的实现,可能是 A,但这取决于寄存器。

    请注意,ZCA 旨在允许您为给定接口插入不同的实现,并不总是需要。

    如果您的 Task 对象需要特定类型,请记录该类型。此处不要求使用 ZCA。最多可以尝试将传入的值适配为IPerson;如果传入的对象已经实现了该接口,则该操作是空操作:

    class Task(object):
        implements(ITask)
    
        def __init__(self, owner):
            self.owner = IPerson(owner)
    

    这将使您可以灵活地稍后传递其他东西,这些东西不是 Person 本身,但可以适应该接口。

    【讨论】:

    • 我已经更新了我上面的问题。我的问题是,实例A需要一个B实例。如果我使用该实用程序,我怎么知道注册服务处理的这个B实例对应于A
    • @HOAINAMNGUYEN:您实际上是在谈论 API 合约,而不是组件架构。 ZCA 不enforce 接口,它只是将它们用作(强大的)注册和查找键。您的 Task 对象只能与 IPerson 对象一起使用这一事实是您需要记录的,ZCA 不会为您强制执行这种依赖关系。
    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 2018-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    相关资源
    最近更新 更多