zope 3有三种类型的组件,内容组件,适配器和实用组件
1. 内容组件
from zope.interface import Interface,Attribute,implements
from zope.component import getGlobalSiteManager,getAdapter,adapts
gsm=getGlobalSiteManager()
gsm.registerAdapter(UserService)
user=User('jjx','123456','jjx@email.com')
user_service=gsm.getAdapter(user,IUserService)
user_service.login()
内容组件相当于我们平时常说的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
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
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()