2.5.3 ファクトリでのファクトリ・ベース・ルーティングの実装

ファクトリは、TP::create_object_reference()操作に対する呼出しの実装と同様の方法でファクトリ・ベース・ルーティングを実装します。この操作には、次のコード・スニペットに示すように、create_object_referenceのC++バインディングがあります。

CORBA::Object_ptr  TP::create_object_reference (
                       const char* interfaceName,
                       const PortableServer::oid &stroid,
                        CORBA::NVlist_ptr criteria);

この操作に対する3番目のパラメータであるcriteriaは、ファクトリ・ベース・ルーティングに使用される、名前付きの値のリストを指定します。ファクトリ内でファクトリ・ベース・ルーティングを実装するには、NVlistをビルドする必要があります。ファクトリ・ベース・ルーティングの使用はオプションであり、この引数に依存します。ファクトリ・ベース・ルーティングを使用するかわりに、この引数に0(ゼロ)の値を渡すこともできます。

前述のように、Productionサンプル・アプリケーションのRegistrarFactoryオブジェクトは、値STU_IDを指定します。この値は、UBBCONFIGファイルの次の項目と正確に一致する必要があります。

  • INTERFACESセクションのFACTORYROUTING識別子で指定される、ルーティング名、タイプ、および使用できる値。
  • ROUTINGセクションで指定される、ルーティング基準名、フィールド、およびフィールド型。

RegistrarFactoryオブジェクトは、次のコード・スニペットに示されているコードを使用して、学生IDをNVlistに挿入します。

// put the student id (which is the routing criteria)
// into a CORBA NVList:
CORBA::NVList_var v_criteria;
TP::orb()->create_list(1, v_criteria.out());
CORBA::Any any;
any <<= (CORBA::Long)student;
v_criteria->add_value("student_id", any, 0);

次のコード・スニペットに示すように、RegistrarFactoryオブジェクトはTP::create_object_reference()操作を呼び出します。次のコード・スニペットは、作成されたNVlistを渡します。

// create the registrar object reference using
// the routing criteria :
CORBA::Object_var v_reg_oref =
    TP::create_object_reference(
        UniversityP::_tc_Registrar->id(),
        object_id,
        v_criteria.in()
    );

Productionサンプル・アプリケーションはまた、TellerFactoryオブジェクトでもファクトリ・ベース・ルーティングを使用し、口座番号に基づいてTellerオブジェクトがインスタンス化されるべきグループを決定します。