命名服務的本質是:将名字與corba對象引用綁定,即:名字與corba對象引用之間的一個映射關系。一個名字對應一個對象引用,一個對象引用可以對應多個名字。(關系為一對多)
功能:實作給定一個名字,就可以獲得綁定到該名字的對象引用。
優點:不需要知道對象的實體位置,隻根據名字就可擷取該對象的引用。對應用程式而言,實作了網絡透明。
命名服務的名字:
命名服務的名字是由上下文環境組成的。表現形式為:aaa/bbb/ccc/ddd(aaa/bbb/ccc/ddd為一個命名服務的名字)。一個名字可以分為幾個子名字(aaa,bbb,ccc,ddd)。結構如下圖所示,該結構可稱為“命名樹”或“命名環境”:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiYUSH5SoKWejcaejQWevRW+LclGbfFGdpJ3LcRXZu9lbkN3Yfd2bsJ2Xw9CXzV2Zh1WavwFdl5mLuR2cj5yZvxmYtA3Lc9CX6MHc0RHaiojIsJye.gif)
名字在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”);
命名服務的具體過程示例:
//初始化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);
//區分:名字和命名環境是兩個不同概念。
//名字為: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);
//綁定,obj_ref為對象引用
aaa_cxt->bind(name, obj_ref);
//設定名字(方法一)
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()
重新綁定命名環境