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

head2.gif 5.1.2 COM+の管理下にあるCOMオブジェクトから別のCOMコンポーネントを実体化するとき
 Fig.5-1は,COMクライアントからCOMコンポーネントを実体化した場合を示している。今度は,COM+の管理下にあるCOMオブジェクトから,さらに別のCOMコンポーネントを実体化する場合について考えてみよう。

 COMオブジェクトからさらに別のCOMコンポーネントを実体化する場合には,同じコンテキストを使って実体化される場合と,別のコンテキスト内で実体化される場合の2種類がある。どちらで実体化されるのかは,COMオブジェクトの状態による。アクティベータは,COMコンポーネントを実体化するときに,呼び出し元のCOMオブジェクト(COMクライアント)のコンテキストと,実体化したCOMオブジェクトが必要とするコンテキストとを比較する。もし同じコンテキストで実行可能であれば,2つのコンテキストはまとめられる。いい換えれば,実体化されたCOMオブジェクトは,呼び出し元のCOMオブジェクト(COMクライアント)と同じコンテキストで実行されるのである。そうでなければ,2つのCOMオブジェクトは互いに異なるコンテキストで実行される(Fig.5-5)。同じ環境で実行できるか否かは,コンポーネントサービス管理ツールによるCOMコンポーネントの設定(この設定はCOM+カタログに含まれる)に従う(ただし,2つのコンポーネントのプロパティにまったく同じ値を設定したからといって,必ずしも同じコンテキストで実行されるとは限らない)。

Fig.5-5 COMオブジェクトから別のCOMコンポーネントを実体化する場合
fig5_05.gif

 Fig.5-5を見るとわかるように,インタセプタが存在するのは,コンテキストの境界部分だけである。同じコンテキストで実行される場合,インタセプタは何もしない。その点では,コンテキストのことを,「COMオブジェクトの実行環境を保持するオブジェクトであるとともに,COMオブジェクトをグループ化する単位でもある」と考えると,わかりやすいかもしれない(ただし,この理解は技術的には正確ではない)。


One Point!COM+の管理下にあるCOMオブジェクトからCOM+の管理下にないCOMコンポーネントを実体化したときには,実体化されたCOMオブジェクトは常に呼び出し元のCOMオブジェクトと同じコンテキスト内に配置される(ただし,両者のスレッドモデルが異なるなど,同じコンテキスト内に配置できない場合には,例外的にCOM+のデフォルトのコンテキストが使われ,別のコンテキスト内に配置されることになる)。

One Point!MTSでは,同じコンテキスト内(MTSの用語では「オブジェクトコンテキスト」)でCOMコンポーネントを実体化させるには,オブジェクトコンテキスト(ObjectContextオブジェクト)を取得したのち,そのオブジェクトコンテキストのCreateInstanceメソッドを呼び出さなければならなかった。しかしCOM+では,同じコンテキストで実行するか否かをアクティベータが自動的に決定するため,NewキーワードやCreateObject関数によってCOMコンポーネントを実体化するだけですむ。
prevpg.gif Chapter 5-1 4/23 nextpg.gif