この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head1.gif 5.7 コンストラクタ文字列

 唐突だが,COMコンポーネントのプロパティの[アクティブ化]ページには,[コンストラクタ文字列]という指定項目がある(Fig.5-59)。

Fig.5-59 コンストラクタ文字列
fig5_59.gif

 [オブジェクトの構築を有効にする]にチェックを付けると,[コンストラクタ文字列]の欄に任意の文字列を入力できるようになる。ここに入力した文字列は,COMオブジェクトがアクティブ化されたときにCOMオブジェクト側に伝わる。すなわち,管理者がこの項目に入力した情報をCOMオブジェクトが参照し,その値によって動作を変更するような処理を実装できるのである。実際の用途としては,たとえばデータベースへの接続文字列を記述することが考えられる。データベースへの接続文字列は,データベースの環境によってまちまちである。従来のCOMの開発スタイルでは,データベースに対する接続文字列をプログラムの内部にハードコーディングしてしまうほかなかった。汎用性を高めるためにレジストリに書き込んで,その値を書き換えられるようにするという手法もあるが,かなり手間がかかる。しかし,COM+のコンストラクタ文字列を使えば,管理者が容易に接続先のデータベースを変更できるようになる。もちろん,コンストラクタ文字列をどのように利用するのかはCOMコンポーネント次第である。コンストラクタ文字列は,COM+によって提供された文字入力エリアでしかないので,実際にどのように解釈するのかは開発者の自由である。

 [オブジェクトの構築を有効にする]にチェックを付けた場合,そのCOMオブジェクトがアクティブ化されるときに,COMオブジェクトが備えているIObjectConstructインタフェースのConstructメソッドが呼び出される。そのため,コンストラクタ文字列を受け取ろうとするCOMコンポーネントには,IObjectConstructインタフェースを用意し,Constructメソッドを実装しなければならない。具体的には,次のような手順で実装する。

  1)IObjectConstructインタフェースを用意する
 COMコンポーネントにIObjectConstructインタフェースを備えるようにするため,クラスモジュールの先頭に次の文を記述する。
Implements IObjectConstruct
  2)Constructメソッドを実装する
 次のような書式でConstructメソッドを実装する。
Private Sub IObjectConstruct_Construct(ByVal pCtorObj As Object)
End Sub

 Constructメソッドは,COMオブジェクトがアクティブ化されるときに呼び出されるメソッドである。管理者が入力した[コンストラクタ文字列]の値は,引数pCtorObj変数が指すオブジェクトに格納されている。この変数が指すオブジェクトはConstructStringというプロパティを備えていて,このプロパティを参照することで,コンストラクタ文字列を取得できる。実際には,ConstructStringプロパティに格納されている値をCOMオブジェクト内の変数に保存しておき,あとで使うという方法が一般的である。


One Point! IObjectConstruct_Constructメソッドは,COMオブジェクトが実体化されるときではなく,アクティブ化されるときに呼び出される。すでに説明したように,ジャストインタイムアクティベータが有効である場合,非アクティブ化によってCOMオブジェクト内部の変数はクリアされてしまう。しかし,IObjectConstruct_Constructメソッド内でコンストラクタ文字列を読み取ってCOMオブジェクト内の変数に保存する実装にしておけば,非アクティブ化されるたびに変数の内容はクリアされてしまうものの,アクティブ化されるたびにIObjectConstruct_Constructメソッドが呼び出され,変数が再設定されることになるから,問題ない。

 以上の2つの操作を使った例が,List 5-15である。List 5-15の4〜7行目が,COMオブジェクトがアクティブ化されるときにコンストラクタ文字列を受け取る部分である。6行目でCOMオブジェクト内の変数ConstructStringにコンストラクタ文字列を代入し,あとから利用できるようにしている。9〜12行目は,本当にコンストラクタ文字列を受け取ったかどうかを確かめるためのテスト用プロパティである。COMクライアントがConstStrプロパティを参照すると,変数ConstructStringで保存している内容(管理者が設定したコンストラクタ文字列)を返す。

 List 5-15は,コンストラクタ文字列を返すようにしているだけだが,もしこの値をデータベースの接続文字列として使いたいのであれば,COMオブジェクト内の変数に保存しておいた値を,ADODB.ConnectionオブジェクトのOpenメソッドを呼び出すときに利用すればよい。ただし,List 5-15は比較的簡単な処理である。もし,もっと多くの情報を管理者に設定させたいのであれば,適当な区切り文字を元にコンストラクタ文字列を分割し,解析するような処理が必要となるかもしれない。

 いずれにせよコンストラクタ文字列は,汎用性を高めるという点において,利用したい実装である。コンストラクタ文字列を利用するようにCOMコンポーネントを実装すれば,管理者は個々のサーバー環境やネットワーク環境に併せて,COMコンポーネントの動作を決めることができるようになる。逆に開発者から見ると,COMコンポーネントの実装時には不確定な設定項目や将来的に変更されそうな設定項目をプログラム内に固定された値としてプログラミングしなくてすむため,開発したCOMコンポーネントの柔軟性が増す。以上のような理由から,開発者は必要に応じてコンストラクタ文字列を利用するようなCOMコンポーネントを実装することが望ましい。

prevpg.gif Chapter 5-2 13/16 nextpg.gif