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

推荐订阅源

C
Cyber Attacks, Cyber Crime and Cyber Security
The Last Watchdog
The Last Watchdog
Forbes - Security
Forbes - Security
S
Security @ Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
T
Troy Hunt's Blog
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
W
WeLiveSecurity
WordPress大学
WordPress大学
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
N
News | PayPal Newsroom
D
DataBreaches.Net
博客园_首页
Y
Y Combinator Blog
F
Fortinet All Blogs
罗磊的独立博客
Apple Machine Learning Research
Apple Machine Learning Research
T
Tailwind CSS Blog
Hacker News - Newest:
Hacker News - Newest: "LLM"
Hugging Face - Blog
Hugging Face - Blog
The GitHub Blog
The GitHub Blog
B
Blog RSS Feed
C
CERT Recently Published Vulnerability Notes
P
Privacy & Cybersecurity Law Blog
Help Net Security
Help Net Security
S
SegmentFault 最新的问题
Recorded Future
Recorded Future
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
N
News and Events Feed by Topic
Schneier on Security
Schneier on Security
V
Vulnerabilities – Threatpost
A
About on SuperTechFans
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
L
LangChain Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
L
LINUX DO - 热门话题
Simon Willison's Weblog
Simon Willison's Weblog
雷峰网
雷峰网
G
Google Developers Blog
Cyberwarzone
Cyberwarzone
I
Intezer
Google DeepMind News
Google DeepMind News
AWS News Blog
AWS News Blog
C
Check Point Blog
AI
AI
博客园 - 【当耐特】
有赞技术团队
有赞技术团队
博客园 - 司徒正美

博客园 - 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()