命名服务的本质是:将名字与corba对象引用绑定,即:名字与corba对象引用之间的一个映射关系。一个名字对应一个对象引用,一个对象引用可以对应多个名字。(关系为一对多)
功能:实现给定一个名字,就可以获得绑定到该名字的对象引用。
优点:不需要知道对象的物理位置,只根据名字就可获取该对象的引用。对应用程序而言,实现了网络透明。
命名服务的名字:
命名服务的名字是由上下文环境组成的。表现形式为:aaa/bbb/ccc/ddd(aaa/bbb/ccc/ddd为一个命名服务的名字)。一个名字可以分为几个子名字(aaa,bbb,ccc,ddd)。结构如下图所示,该结构可称为“命名树”或“命名环境”:
名字在corba中的结构定义为:
module CosNaming {
typedef string Istring;
struct NameComponent {
Istring id;
Istring kind;
}
typedef sequence <NameComponent> name;
}
其中,一个名字对应结构:name;一个子名字对应结构:struct NameComponent。id为子名字的名称,kind为该子名字的属性描述。
name类型的名字在使用时,类型名为:CosNaming::Name_var;
字符串类型的名字在使用时,类型名为:CosNaming::NamingContextExt::StringName
命名服务中提供的操作:(均由接口CosNaming::NamingContextExt提供)
1. to_name()
类型转换:将字符串形式的名字转换为CosNaming::name类型的名字
2. to_string()
类型转换:将CosNaming::name类型的名字转换为字符串形式的名字
3. resolve_str()
根据字符串形式的名字,从命名树中获取该名字对应的对象引用。
例如:
CosNaming::Name_var name(4);
name.length(4);
//注意:下标从0开始。
name[0].id = CORBA::string_dup(“aaa”);
name[0].kind = CORBA::string_dup(“”);
name[1].id = CORBA::string_dup(“bbb”);
name[1].kind = CORBA::string_dup(“”);
name[2].id = CORBA::string_dup(“ccc”);
name[2].kind = CORBA::string_dup(“”);
name[3].id = CORBA::string_dup(“ddd”);
name[3].kind = CORBA::string_dup(“”);
//调用to_string
CosNaming::NamingContextExt::StringName strName;
strName = root_cxt->to_string(name);
//调用to_name
name = root_cxt->to_name(“aaa/bbb/ccc/ddd”);
命名服务的具体过程示例:
/************* 1.初始化部分 ***************/
//初始化orb
CORBA::ORB_var orb = CORBA::ORB_init(argc,argv);
//初始化命名服务,即初始化命名树或初试化命名环境
CORBA::Object obj = orb->resolve_initial_references(“NameService”)
CosNaming::NamingContextExt_var root_cxt;
root_cxt = CosNaming::NamingContextExt::_narrow(obj);
/************* 2.将名字帮定到命名环境中 ***************/
//区分:名字和命名环境是两个不同概念。
//名字为:CosNaming::Name_var,命名环境为:CosNaming::NamingContext。
//方法一:
//创建一个新的命名环境
CosNaming::NamingContext_var aaa_cxt;
aaa_cxt = root_cxt->new_context();
//初始化名字
CosNaming::Name_var name;
name.length(1);
name[0].id = CORBA::string_dup(“aaa”);
name[0].kind = CORBA::string_dup(“”);
//在初始化环境中绑定新的名字
root_cxt->bind_context(name, aaa_cxt);
//方法二:
//定义一个新的命名环境
CosNaming::NamingContext_var aaa_cxt;
//初始化名字
CosNaming::Name_var name;
name.length(1);
name[0].id = CORBA::string_dup(“aaa”);
name[0].kind = CORBA::string_dup(“”);
//绑定
aaa_cxt = root_cxt->bind_new_context(name);
/************* 3.绑定对象引用 ***************/
//绑定,obj_ref为对象引用
aaa_cxt->bind(name, obj_ref);
/************* 4.获得对象引用 ***************/
//设置名字(方法一)
CosNaming::Name_var name;
name.length(1);
name[0].id = CORBA::string_dup(“aaa”);
name[0].kind = CORBA::string_dup(“”);
//获得引用
CORBA::Object_var obj;
obj = root_cxt->resolve(name);
//再使用narrow即可.
//获得引用(方法二)
CORBA::Object_var obj;
obj = root_cxt->resolve(“aaa”);
其他方法:
1. rebind()
重新绑定应用对象
2. rebind_context()
重新绑定命名环境