zope 3有三种类型的组件,内容组件,适配器和实用组件

1. 内容组件

内容组件相当于我们平时常说的entity,model,比方说User,Category,Department,Order 都可以理解为内容组件, 例子
class IUser(Interface):
    name
=Attribute('name')
    password
=Attribute('password')
    email
=Attribute('email')
class User(object):
    implements(IUser)
    
def __init__(self,name,password,email):
        self.name
=name
        self.password
=password
        self.email
=email

2. 适配器

适配器可以理解为我们平常所用的服务类,服务类一般操作一个特定的内容组件,比方说UserService会操作User对象,而OrderService会操作Order对象。服务类通常会有一个或多个方法。这个被操作的对象在zope3中就是适配者。在zope3中,适配器可以有以下规律

①实现一接口
②适配一个或多个对象,多个对象叫多适配器
③对象通过构造函数传入

这同一般我们所用的java/c# 静态服务类不同,在那种情况中,所操作对象通常是作为第一个参数传入的,如
interface IUserService{
    void login(User user);
}

在zope3中,适配器有服务单一对象的,服务多对象的叫多适配器,另外还有订阅适配器和handler适配器
让我们来看看zope 3的适配器写法,可能像这样


from zope.interface import Interface,Attribute,implements
from zope.component import getGlobalSiteManager,getAdapter,adapts
class IUserService(Interface):
    
def login():
        
'''login'''
        

class UserService(object):
    implements(IUserService)
    adapts(IUser)
    
def __init__(self,user):
        self.user
=user
        
    
def login(self):
        
print 'pass
同spring的解决依赖的观点还不太一样,spring 解决的是服务依赖。而zope3的适配器,大概只关心业务方法实现的替换
    
zope3 的组件管理你可以用spring的对象工厂去理解,虽然实际的实现很不一样,一般可以归纳为二点

①如何注册组件
②如何获取组件

同spring一样,组件可以通过xml注册 (zcml) 或是代码

通过xml注册

<configure xmlns="http://namespaces.zope.org/zope">
<adapter
factory=""
provides=""
for=""
/>

factory是指适配器,如UserServcie,providers是指适配器接口 IUserService,for是指适配者,这里是IUser,一般秩序提供factory信息即可

在通过代码注册时,zope3 需要你了解你适配器的类型而调用不同的方法。过程是类似的
from zope.component import getGlobalSiteManager
gsm = getGlobalSiteManager()

注册适配器
gsm.registerAdapter(我的适配器类)

注册subscribte
gsm.registerSubscriptionAdapter(subscribe)

注册handler
gsm.registerHandler(handler)

获取一般适配器
getAdapter(内容组件实例,适配器接口)
获取多适配器
getMultiAdapter((内容组件实例tuple),适配器接口)
获取订阅
subscribers([内容组件实例], 接口)
执行handler
handler(内容组件)
     


gsm
=getGlobalSiteManager()

                
gsm.registerAdapter(UserService)

user
=User('jjx','123456','jjx@email.com')
user_service
=gsm.getAdapter(user,IUserService)
user_service.login()
                                                                
        
                            


posted on 2009-07-22 10:04  jjxstudio  阅读(412)  评论(0编辑  收藏  举报