组件技术 —— 最后一讲

41
组组组组——组组 组组组组——组组 潘潘潘 潘潘潘 潘潘潘潘潘潘潘潘潘潘潘潘潘潘 潘潘潘潘潘潘潘潘潘潘潘潘潘潘 http://www.icst.pku.edu.cn/ http://www.icst.pku.edu.cn/ CompCourse CompCourse

description

组件技术 —— 最后一讲. 潘爱民 北京大学计算机科学技术研究所 http://www.icst.pku.edu.cn/CompCourse. 内容. 框架和类库 CORBA overview 复习. framework. 领域工程 单个系统 —— 〉一类系统 针对应用的抽象 组件库 提供定制功能,允许开发人员对于框架主体部分进行修改 不同层次上的 framework 基于二进制代码的 framework, 例如 MMC 基于源代码的 framework, 例如 MFC. 基于二进制的 framework. 接口: 为应用中的组件提供二进制接口 - PowerPoint PPT Presentation

Transcript of 组件技术 —— 最后一讲

组件技术——最后一讲组件技术——最后一讲潘爱民潘爱民

北京大学计算机科学技术研究所北京大学计算机科学技术研究所http://www.icst.pku.edu.cn/http://www.icst.pku.edu.cn/

CompCourseCompCourse

内容内容 框架和类库框架和类库 CORBA overviewCORBA overview 复习复习

frameworkframework 领域工程领域工程

– 单个系统 ——〉一类系统单个系统 ——〉一类系统– 针对应用的抽象针对应用的抽象

组件库组件库 提供定制功能,允许开发人员对于框架主体部提供定制功能,允许开发人员对于框架主体部分进行修改分进行修改 不同层次上的不同层次上的 frameworkframework

– 基于二进制代码的基于二进制代码的 frameworkframework ,,例如例如 MMCMMC– 基于源代码的基于源代码的 frameworkframework ,,例如例如 MFCMFC

基于二进制的基于二进制的 frameworkframework 接口:接口:

– 为应用中的组件提供二进制接口为应用中的组件提供二进制接口 以对象形式封装以对象形式封装 以功能为单位以功能为单位

– 粒度粒度 大而全的接口大而全的接口 小型接口,允许动态发现新的接口小型接口,允许动态发现新的接口

通信模型通信模型– 用户组件与框架进行通信用户组件与框架进行通信– 用户组件之间如何通信?用户组件之间如何通信?

通过框架传递信息通过框架传递信息 通过框架建立直通模型通过框架建立直通模型

基于源代码的基于源代码的 frameworkframework 接口:接口:

– 一般为抽象类,用户提供虚函数的实现,并注册到一般为抽象类,用户提供虚函数的实现,并注册到主框架中主框架中– 用户定制的余地比较大用户定制的余地比较大

通信模型通信模型– 用户组件与框架进行通信用户组件与框架进行通信– 用户组件之间容易建立起直通途径用户组件之间容易建立起直通途径

从派生类传播类型到基类的一种模式从派生类传播类型到基类的一种模式 意图:意图:

– 基类有时需要根据子类的类型执行一些功能,而基基类有时需要根据子类的类型执行一些功能,而基类又不可能直接得到子类的静态类型类又不可能直接得到子类的静态类型– 这对于这对于 generic programminggeneric programming 非常重要,因为编非常重要,因为编译器要靠静态类型来实例化模板译器要靠静态类型来实例化模板 (( 函数或者类函数或者类 ))

解决方案解决方案– 用虚函数不能解决问题 —— 用虚函数不能解决问题 —— runtimeruntime 多态性多态性– 在子类中插入一个函数,由该函数调用模板函数或在子类中插入一个函数,由该函数调用模板函数或者模板类,或者该函数调用基类中的模板成员函数者模板类,或者该函数调用基类中的模板成员函数– 仅对基于源代码的仅对基于源代码的 frameworkframework 适用适用

FrameworkFramework 举例举例 为报社提供一套为报社提供一套 frameworkframework

Snap-In 管理器

FrameSite FrameSite FrameSite

SnapIn 对象 SnapIn 对象SnapIn 对象

Security 管理器Database 管理器UI 管理器

SnapIn 仓库

IFrameSiteISnapInfo

SnapIn DLL SnapIn DLL SnapIn DLL

可重用类库的设计可重用类库的设计 (( 一一 )) 在所有的系统设计中,可重用类库的设计是难度比较在所有的系统设计中,可重用类库的设计是难度比较大的,要做到:大的,要做到:

– 使用:灵活性和易用性使用:灵活性和易用性– 功能:广泛性和效率功能:广泛性和效率

经验非常重要经验非常重要– 实现同样的功能会有许多不同的道路,如何选择?效果怎么实现同样的功能会有许多不同的道路,如何选择?效果怎么样?样?

类库的基础类库的基础– 是否使用其他的类库?是否使用特殊的平台和编译环境?是否使用其他的类库?是否使用特殊的平台和编译环境?

参考成功的类库参考成功的类库– 起点要高起点要高

可重用类库的设计可重用类库的设计 (( 二二 )) 接口的设计接口的设计

– 这是类库的关键,会影响到类库的使用这是类库的关键,会影响到类库的使用 接口的类型:接口的类型: C/C++C/C++

– 大而全的接口并不理想大而全的接口并不理想– 接口的语义一定要清晰接口的语义一定要清晰– facadefacade 模式模式

内存管理内存管理– 保证内存分配和释放的一致性保证内存分配和释放的一致性– 使用要方便使用要方便

[[out]out] 参数的资源由谁来申请?谁知道参数的资源由谁来申请?谁知道 sizesize ?? 是否使用自定义的内存分配器,例如针对小对象的分配器是否使用自定义的内存分配器,例如针对小对象的分配器

可重用类库的设计可重用类库的设计 (( 三三 )) 使用各种模式使用各种模式

– 模式是经验,成功的典范模式是经验,成功的典范– policypolicy 模式允许使用者定制类模式允许使用者定制类– 结构型模式有助于建立起更加合理的结构模型,而结构型模式有助于建立起更加合理的结构模型,而不至于层次错综复杂不至于层次错综复杂– 行为型模式有助于各个类之间有更好的协作模型行为型模式有助于各个类之间有更好的协作模型– 创建型模式可以提供各种合理的创建机制创建型模式可以提供各种合理的创建机制

模板类库的特殊性模板类库的特殊性– 利用模板类型实现利用模板类型实现 compile-timecompile-time 的预处理的预处理– 熟悉编译器的特性熟悉编译器的特性– 控制模板生成代码控制模板生成代码

可重用类库的设计可重用类库的设计 (( 四四 )) 行为前置和延后行为前置和延后

– 在基类中提供缺省的实现在基类中提供缺省的实现– 纯虚函数 —— 强制子类提供实现纯虚函数 —— 强制子类提供实现– 利用利用 functorfunctor 或者函数指针或者函数指针– 要求要求 ((必须必须 )) 子类调用父类的实现子类调用父类的实现

用宏来封装代码用宏来封装代码 代码风格代码风格 类库的优化类库的优化

– 优化需要用到内部知识,是否暴露这些知识优化需要用到内部知识,是否暴露这些知识– 允许使用者用允许使用者用 policypolicy 进行配置,用不同的实现配置类进行配置,用不同的实现配置类– 类似于类似于 policypolicy 的思想,在细节点上用开关进行控制的思想,在细节点上用开关进行控制

可重用类库的设计可重用类库的设计 (( 五五 )) 类库的调试类库的调试

– 类库内部调试,使用类库内部调试,使用 assertassert支持支持 类库的测试类库的测试

– 比应用系统的测试更加严格比应用系统的测试更加严格 类库的发行类库的发行

– 是否提供源代码?是否提供源代码?– 文档文档– 编译设置编译设置

可重用类库的设计可重用类库的设计 (( 六六 ))举例:举例: MFC/ATLMFC/ATL MFCMFC

– 同时也具有源代码框架的结构同时也具有源代码框架的结构– 传统意义上的传统意义上的 C++C++ 类库,对类库,对 Win32Win32 进行了封装进行了封装– 以便于使用为主要目标,优化较少以便于使用为主要目标,优化较少– 用到了许多用到了许多 patternspatterns ,,吻合吻合WindowsWindows 应用模型应用模型– 涉及到许多类库设计技术涉及到许多类库设计技术– 与与 WizardWizard 结合产生基本代码结合产生基本代码

ATLATL– 用到了用到了 generic programminggeneric programming 中许多新的技术中许多新的技术– 模板技术模板技术– 优化比较突出优化比较突出

CORBA OverviewCORBA Overview ORB(Object Request Broker )ORB(Object Request Broker ) Interface Definition Language (IDL)Interface Definition Language (IDL) CORBA Communications Model: IIOPCORBA Communications Model: IIOP CORBA Object Model: IORCORBA Object Model: IOR CORBA Clients and ServersCORBA Clients and Servers

– client stubs and server skeletonsclient stubs and server skeletons CORBAservices and CORBAfacilitiesCORBAservices and CORBAfacilities

CORBACORBA 结构结构

CORBA Specification CORBA Specification overviewoverview

OMG IDLOMG IDL Interface:Interface:

– ORB InterfaceORB Interface 、、 DII/DSIDII/DSI 、、 Interface RepositoryInterface Repository POAPOA InteroperabilityInteroperability

– GIOPGIOP 、、 IIOPIIOP 、、 IORIOR MappingMapping

– COMCOM 、、 AutomationAutomation– C mappingC mapping 、、 C++ mappingC++ mapping 、、 SmallTalkSmallTalk

Service Specification(Service Specification( 单独的文档单独的文档 ))– naming servicenaming service 、、 event serviceevent service 、、 transaction transaction

serviceservice 、、 security servicesecurity service 、、 trade servicetrade service ……、……、

OMG IDLOMG IDL 类类 CC 风格的语言风格的语言 定义接口定义接口 : interface: interface 基本数据类型基本数据类型

– voidvoid 、、 booleanboolean 、、 charchar 、、 wcharwchar 、、 octetoctet 、 、(unsigned) short(unsigned) short 、、 (unsigned) long(unsigned) long 、、(unsigned ) long long(unsigned ) long long 、、 floatfloat 、、 doubledouble 、、 long long doubledouble 、、 stringstring 、、 anyany

常数、常量表达式常数、常量表达式 构造数据类型构造数据类型

– typedeftypedef 、、 enumenum 、、 structstruct 、、 unionunion 、数组、、数组、 sequencsequencee

OMG IDL(OMG IDL( 续续 )) InterfaceInterface,例如:,例如:

interface Account {interface Account { void deposit( in unsigned long amount );void deposit( in unsigned long amount ); void withdraw( in unsigned long amount );void withdraw( in unsigned long amount ); long balance();long balance();};};

接口方法中参数的方向属性接口方法中参数的方向属性异常:用户自定义异常和系统异常异常:用户自定义异常和系统异常 onewayoneway 操作操作 modulemodule 、、 includeinclude 允许多重继承,与实现允许多重继承,与实现 ((implementation)implementation)无关无关

C++ mappingC++ mapping 基本数据类型与基本数据类型与 C++C++ 的对应关系的对应关系

– 特殊标识符的处理特殊标识符的处理– module ——module —— 〉〉 namespacenamespace– IDLIDL 类型——〉类型——〉 CORBA::CORBA:: 中的数据类型中的数据类型– 字符串处理不用字符串处理不用 newnew 、、 deletedelete ,,而用专门的函数而用专门的函数

枚举类型枚举类型 复合类型复合类型

– 除了类型本身外,另生成一个除了类型本身外,另生成一个 __varvar 类型类型 (( 类似类似 auto_ptr)auto_ptr) 接口类型接口类型

– __ptrptr 类型、类型、 __varvar 类型类型

客户端客户端 C++ mappingC++ mapping客户通过客户通过 stubstub 调用对象的方法调用对象的方法

– 客户如何得到对象引用客户如何得到对象引用– 客户如何调用对象方法客户如何调用对象方法

客户端客户端 C++ mappingC++ mapping 客户通过客户通过 ORBORB 接口获得初始的对象引用接口获得初始的对象引用

– 首先初始化首先初始化 ORBORB 并获得并获得 ORBORB 接口接口– 然后利用字符串形式的引用获得内部的对象引用然后利用字符串形式的引用获得内部的对象引用

int main( int argc, char *argv[] )int main( int argc, char *argv[] ){{ // ORB initialization// ORB initialization CORBA::ORB_var orb = CORBA::ORB_var orb = CORBA::ORB_initCORBA::ORB_init( argc, argv, "local-orb" );( argc, argv, "local-orb" );

CORBA::Object_var obj = CORBA::Object_var obj = orb->string_to_objectorb->string_to_object( argv[1] );( argv[1] ); Account_var client = Account_var client = Account::_narrowAccount::_narrow( obj );( obj );

client->deposit( 700 );client->deposit( 700 ); client->withdraw( 250 );client->withdraw( 250 ); cout << "Balance is " << client->balance() << endl;cout << "Balance is " << client->balance() << endl; return 0;return 0;}}

服务器端服务器端 C++ mappingC++ mapping 对象与对象与 OAOA 进行通信进行通信

服务器端服务器端 C++ mapping(C++ mapping( 续续二二 )) ServantServant 和和 CORBACORBA 对象对象

客户请求ORB POA Manager POA

Servant

Servant

Servant

服务器端服务器端 C++ mapping(C++ mapping( 续续三三 ))int main (int argc, char *argv[]){ CORBA::ORB_var orb = CORBA::ORB_init (argc, argv, ”local-orb”);

CORBA::Object_var poaobj = orb->resolve_initial_references ("RootPOA"); PortableServer::POA_var poa = PortableServer::POA::_narrow (poaobj); PortableServer::POAManager_var mgr = poa->the_POAManager();

Account_impl * account = new Account_impl;

PortableServer::ObjectId_var oid = poa->activate_object (account);

…… // Write reference to file

mgr->activate (); orb->run();

poa->destroy (TRUE, TRUE); delete micocash; return 0;}

POA: Portable Object POA: Portable Object Adapter Adapter POAPOA负责创建对象引用、激活对象以及分发请求负责创建对象引用、激活对象以及分发请求 POAPOA负责从负责从 CORBACORBA 对象到对象到 servantservant 之间的对应之间的对应

– CORBACORBA 对象与对象与 servantservant 对象的生命周期相互分开对象的生命周期相互分开 POAPOA 对于对于 CORBACORBA服务器在性能、资源利用、可伸缩性等方服务器在性能、资源利用、可伸缩性等方面具有重要的意义面具有重要的意义 POAPOA策略,控制:策略,控制:

– 对象生命周期:永久对象、暂态对象对象生命周期:永久对象、暂态对象– 对象标识符:在对象标识符:在 POAPOA 范围内唯一范围内唯一– POA Active Object MapPOA Active Object Map ::从从 ObjectIDObjectID 到到 servantservant 的映射的映射– 请求处理策略:请求处理策略: servant managerservant manager– 线程模型线程模型– …………

POA: Portable Object POA: Portable Object Adapter(Adapter( 续续 ) ) POAPOA 的编程的编程

– 所有的工作都从所有的工作都从 RootPOARootPOA 开始开始– 所有的所有的 POAPOA 构成一个树状层次结构构成一个树状层次结构– 利用利用 RootPOARootPOA 的的 create_POAcreate_POA创建新的创建新的 POAPOA– 在创建在创建 POAPOA 时指定策略,时指定策略, CORBA::PolicyListCORBA::PolicyList

POAPOA 提供的功能提供的功能– 创建对象创建对象– 注册注册 servantservant ,,激活对象激活对象– 提供提供 ObjectIDObjectID 、、 ObjectReferenceObjectReference 之间的转换之间的转换

servant managerservant manager 编程编程 POA managerPOA manager ::控制来自客户的请求控制来自客户的请求

– 多个多个 POAPOA 可以共享同一个可以共享同一个 POA managerPOA manager ORBORB事件处理事件处理

服务器端服务器端 C++ mapping(C++ mapping( 续四续四 ))利用利用 idlidl生成的框架类编写生成的框架类编写 servantservant 类类 编写编写mainmain 函数函数

– 从从 ORBORB初始化开始初始化开始– 考虑考虑 POAPOA 的策略,简单的程序可以使用默认的的策略,简单的程序可以使用默认的 RootPOARootPOA– 创建创建 servantservant 并注册并注册– 处理对象引用处理对象引用– 进入主循环进入主循环

阻塞方式:阻塞方式: orb->run()orb->run() 非阻塞方式:非阻塞方式:

orb->work_pending()orb->work_pending()orb->perform_work()orb->perform_work()

用用 C++C++ 开发开发 CORBACORBA 应用 应用 基本的基本的 C++C++ 知识,包括链表结构、智能指针的知识知识,包括链表结构、智能指针的知识 针对当前使用的针对当前使用的 ORBORB产品,熟悉对于基本数据类型的产品,熟悉对于基本数据类型的支持,以及这些类型与当前平台上各数据类型的关系支持,以及这些类型与当前平台上各数据类型的关系 理解理解 CORBACORBA 的的 client/serverclient/server 应用模型应用模型 包含头文件包含头文件 链接库文件链接库文件 掌握掌握 IDLIDL 编译器编译器 掌握掌握 ORBORB 接口接口 如何传递对象引用如何传递对象引用

ORBORB 接口 接口 初始:初始: CORBA::ORB_InitCORBA::ORB_Init ,,通过命令行传递参通过命令行传递参数数 对象引用到字符串的转换操作对象引用到字符串的转换操作

– 对象引用:对象引用: CORBA::ObjectCORBA::Object获得初始接口获得初始接口

– resolve_initial_referenceresolve_initial_reference

DIIDII :: Dynamic Invocation Dynamic Invocation InterfaceInterface客户程序可以不通过客户程序可以不通过 IDLIDL 编译器生成的编译器生成的 stubstub 而调用而调用对象的方法,步骤:对象的方法,步骤:

– 客户首先得到对象引用:客户首先得到对象引用: CORBA::Object_ptrCORBA::Object_ptr– 创建一个请求对象创建一个请求对象 CORBA::Request_ptrCORBA::Request_ptr– 把调用参数放到链表中:把调用参数放到链表中: CORBA::NVList_ptrCORBA::NVList_ptr ,,指明类型指明类型和数值,也指明返回值和数值,也指明返回值– 调用调用 CORBA::Request_ptr->InvokeCORBA::Request_ptr->Invoke 方法方法

服务器并不知道客户程序是通过服务器并不知道客户程序是通过 stubstub还是还是 DIIDII 调用其调用其方法的方法的客户程序在编译时刻可以没有客户程序在编译时刻可以没有 idlidl 类型知识类型知识 比较:比较: COM AutomationCOM Automation 中中 IDispatchIDispatch 接口的用法接口的用法

用用 C++C++ 开发开发 CORBACORBA 应用:客户应用:客户 用用 IDLIDL生成生成 stubstub 代码以及类型定义头文件代码以及类型定义头文件 在客户的在客户的 mainmain 函数中,初始化函数中,初始化 orborb ,,获得获得 orborb对象对象获得对象引用,并调用获得对象引用,并调用 __narrownarrow向下转换向下转换 调用对象的方法调用对象的方法 如果使用如果使用 DIIDII ,,则需要用到请求对象,并处理参则需要用到请求对象,并处理参数数 如果不用如果不用 __varvar 类型的话,释放类型的话,释放 orborb 和对象引用和对象引用

DSIDSI :: Dynamic Skeleton Dynamic Skeleton InterfaceInterface 服务器程序可以动态实现对象,而不利用服务器程序可以动态实现对象,而不利用 IDLIDL 编译器生成的编译器生成的 skeletonskeleton代码代码 服务器实现一个对象,如下所示服务器实现一个对象,如下所示

class GenericServant : virtual public PortableServer::DynamicImplementation class GenericServant : virtual public PortableServer::DynamicImplementation {{ virtual void invoke (CORBA::ServerRequest_ptr req);virtual void invoke (CORBA::ServerRequest_ptr req); virtual CORBA::RepositoryId _primary_interface (virtual CORBA::RepositoryId _primary_interface (

const PortableServer::ObjectId &, const PortableServer::ObjectId &, PortableServer::POA_ptr);PortableServer::POA_ptr);

};}; mainmain 函数的处理不变函数的处理不变 重点在于重点在于 invokeinvoke 函数,利用函数,利用 CORBA::ServerRequestCORBA::ServerRequest 对象获得所有对象获得所有的类型信息的类型信息 对于客户透明对于客户透明 比较:比较: COM AutomationCOM Automation 中中 IDispatchIDispatch 接口的实现接口的实现

用用 C++C++ 开发开发 CORBACORBA 应用:服务器应用:服务器 用用 IDLIDL生成生成 skeletonskeleton 代码以及类型定义头文件代码以及类型定义头文件 在客户的在客户的 mainmain 函数中,初始化函数中,初始化 orborb ,,获得获得 orborb 对象对象 根据服务器应用的需要,处理根据服务器应用的需要,处理 POAPOA创建创建 servantservant 对象对象 如果使用如果使用 DSIDSI ,,那么那么 invokeinvoke 方法是方法是 servantservant 对象的对象的关键关键 如何把对象引用传递出去?字符串?名字服务?如何把对象引用传递出去?字符串?名字服务? 调用调用 orb->run()orb->run() 或者或者 orb->perform_work()orb->perform_work()

CORBA IIOPCORBA IIOP 和和 IORIOR General Inter-ORB ProtocolGeneral Inter-ORB Protocol :: CORBACORBA 定义了定义了 GIOPGIOP作为其互用性框架结构,包括数据传输、数据表示、消息格式作为其互用性框架结构,包括数据传输、数据表示、消息格式 Internet Inter-ORB ProtocolInternet Inter-ORB Protocol :: IIOPIIOP 是是 GIOPGIOP 的具体实的具体实现,建立在现,建立在 TCP/IPTCP/IP 基础上基础上 IORIOR :: Interoperable object referenceInteroperable object reference

RepositoryID Data for Protocol 1 Data for Protocol 2 …

Endpoint Info Object Key

Object ID

IORIOR 例子例子 Repo Id: IDL:GenericServer:1.0Repo Id: IDL:GenericServer:1.0

IIOP ProfileIIOP Profile Version: 1.0Version: 1.0 Address: inet:162.105.178.100:12122Address: inet:162.105.178.100:12122 Location: corbaloc::162.105.73.196:12122//25607/991958392/%5f0Location: corbaloc::162.105.73.196:12122//25607/991958392/%5f0 Key: 2f 32 35 36 30 37 2f 39 39 31 39 35 38 33 39 32 /25607/991958392Key: 2f 32 35 36 30 37 2f 39 39 31 39 35 38 33 39 32 /25607/991958392 2f 5f 30 /_02f 5f 30 /_0

Multiple Components ProfileMultiple Components Profile Components: Native Codesets:Components: Native Codesets: normal: ISO 8859-1:1987; Latin Alphabet No. 1normal: ISO 8859-1:1987; Latin Alphabet No. 1 wide: ISO/IEC 10646-1:1993; UTF-16, UCS Transformation Format 16-bwide: ISO/IEC 10646-1:1993; UTF-16, UCS Transformation Format 16-b

it formit form Key: 00 .Key: 00 .

CORBACORBA 结构结构

CORBA servicesCORBA services :: naming naming serviceservice 建立起“名称建立起“名称 --对象引用”的映射关系对象引用”的映射关系 在内部以层次结构的形式组织名字映射,类似于文件系统在内部以层次结构的形式组织名字映射,类似于文件系统的结构。的结构。 所有的类型和接口定义位于所有的类型和接口定义位于 CosNamingCosNaming 域中域中 NamingContextNamingContext 接口负责所有有关命名服务相关的功能,接口负责所有有关命名服务相关的功能,例如:例如:

– 创建新的创建新的 contextcontext、、删除删除 contextcontext– bindbind操作、操作、 unbindunbind操作操作– resolveresolve操作操作

怎样获得初始怎样获得初始 namingcontextnamingcontext ??– 通过通过 orb->resolve_initial_referenceorb->resolve_initial_reference

ORBORB厂商应该提供命名服务工具厂商应该提供命名服务工具

naming servicenaming service 示例示例 CORBA::Object_var nsobj = CORBA::Object_var nsobj = orb->resolve_initial_referencesorb->resolve_initial_references ("NameService"); ("NameService"); CosNaming::NamingContext_var nc = CosNaming::NamingContext_var nc =

CosNaming::NamingContext::_narrow (nsobj); CosNaming::NamingContext::_narrow (nsobj); CosNaming::Name nameCosNaming::Name name;; name.length (1);name.length (1); name[0].id = CORBA::string_dup ("myAccount");name[0].id = CORBA::string_dup ("myAccount"); name[0].kind = CORBA::string_dup ("");name[0].kind = CORBA::string_dup ("");

// // 服务器方服务器方 Account_ptr acc = new Account_impl ();Account_ptr acc = new Account_impl (); nc->bind (name, acc);nc->bind (name, acc);

// // 客户方客户方 CORBA::Object_var obj;CORBA::Object_var obj; obj = nc->resolve (name);obj = nc->resolve (name); Account_var client = Account::_narrow( obj );Account_var client = Account::_narrow( obj );

CORBA servicesCORBA services ::其他服务其他服务 Event serviceEvent service

– 提供松耦合事件模型的机制提供松耦合事件模型的机制 Trade ServiceTrade Service

– 提供了更加灵活的对象查找服务提供了更加灵活的对象查找服务 Time ServiceTime Service

– 提供了与时间有关的服务,统一了时间的表达方式提供了与时间有关的服务,统一了时间的表达方式 Concurrency serviceConcurrency service Security ServiceSecurity Service Transaction ServiceTransaction Service …………

ORBORB 产品产品 考察考察 ORBORB ::支持平台、支持语言、性能支持平台、支持语言、性能商业商业 ORBORB

– OrbixOrbix ,, IONAIONA公司,完全支持公司,完全支持 CORBA 2.3CORBA 2.3规范规范– VisibrokerVisibroker ,, InpriseInprise公司,公司, 4.04.0 版完全支持版完全支持 2.32.3 规范规范

Netscape communicatorNetscape communicator浏览器嵌入浏览器嵌入 VisibrokerVisibroker 自由自由 ORBORB

– ORBitORBit ,,遵循 CORBA 2.2规范,支持 C 语言,性能较高– micomico ,, GNUGNU ,, OpenSourceOpenSource– TAOTAO ,,美国华盛顿大学分布式对象计算研究小组– omniORBomniORB ,, AT&T剑桥实验室

CORBACORBA 与与 COMCOM 的比较的比较标准的层次不同标准的层次不同

– CORBACORBA 与与 JavaJava 结合的优势结合的优势 CORBACORBA跨平台优势跨平台优势 COMCOM 在在 WindowsWindows 平台上的优势平台上的优势 COMCOM 的效率有优势的效率有优势跨语言的策略不同跨语言的策略不同 COMCOM 组件丰富、组件丰富、 CORBACORBA 开发简单开发简单

– CORBACORBA 不适合开发不适合开发 UIUI 组件组件 CORBACORBA 与与 COMCOM互补策略互补策略