惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Last Week in AI
Last Week in AI
Project Zero
Project Zero
L
LINUX DO - 最新话题
C
Cisco Blogs
P
Privacy International News Feed
S
Schneier on Security
D
Darknet – Hacking Tools, Hacker News & Cyber Security
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
S
Security @ Cisco Blogs
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
V
Vulnerabilities – Threatpost
W
WeLiveSecurity
Webroot Blog
Webroot Blog
K
Kaspersky official blog
Help Net Security
Help Net Security
博客园_首页
Security Archives - TechRepublic
Security Archives - TechRepublic
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
雷峰网
雷峰网
The Last Watchdog
The Last Watchdog
WordPress大学
WordPress大学
IT之家
IT之家
Hugging Face - Blog
Hugging Face - Blog
A
Arctic Wolf
I
Intezer
V
V2EX
博客园 - 【当耐特】
Latest news
Latest news
T
Tenable Blog
Google Online Security Blog
Google Online Security Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
Cyberwarzone
Cyberwarzone
量子位
G
GRAHAM CLULEY
T
Troy Hunt's Blog
博客园 - Franky
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - 三生石上(FineUI控件)
TaoSecurity Blog
TaoSecurity Blog
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
V
Visual Studio Blog
Jina AI
Jina AI
T
The Exploit Database - CXSecurity.com
NISL@THU
NISL@THU
Scott Helme
Scott Helme

博客园 - jjxstudio

关于silverlight 前景的讨论,不吐不快 没有说说新的async ctp吗? 新blog地址 青春咖啡馆 2010 计划 axapta 断开的记录集 django 1.1 south 准备放弃django openerp新的web-client openerp view design elements中的col和colspan - jjxstudio a中的this和element 上下文 怎样才算是一个好的windows forms 应用程序框架? 自定义django admin 之一 django admin search_fields 今天的折腾 杭州:一个python的工作机会 ironpython的下一个版本
理解zope3 的适配器
jjxstudio · 2009-07-22 · via 博客园 - jjxstudio

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()