天天看點

CORBA(命名服務)

    命名服務的本質是:将名字與corba對象引用綁定,即:名字與corba對象引用之間的一個映射關系。一個名字對應一個對象引用,一個對象引用可以對應多個名字。(關系為一對多)

       功能:實作給定一個名字,就可以獲得綁定到該名字的對象引用。

       優點:不需要知道對象的實體位置,隻根據名字就可擷取該對象的引用。對應用程式而言,實作了網絡透明。

       命名服務的名字:

       命名服務的名字是由上下文環境組成的。表現形式為:aaa/bbb/ccc/ddd(aaa/bbb/ccc/ddd為一個命名服務的名字)。一個名字可以分為幾個子名字(aaa,bbb,ccc,ddd)。結構如下圖所示,該結構可稱為“命名樹”或“命名環境”:

CORBA(命名服務)

    名字在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()

    重新綁定命名環境

繼續閱讀