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

head2.gif 5.1.1 コンテキストとインタセプタ
 コンテキストとは,COMオブジェクトの実行環境を保持するCOMオブジェクトである。このCOMオブジェクトは,Fig.5-1に示したとおり,利用したいCOMコンポーネントを実体化するときにアクティベータによって生成される。具体的にコンテキストが保持する情報には,セキュリティ情報やトランザクションの状態などがある。

 コンテキストが備える値のいくつかは,アクティベータによってコンポーネントサービス管理ツールで設定された値(設定された値はCOM+カタログに格納されている)に初期化される。たとえば,「どのロールに属するユーザーがCOMコンポーネントを呼び出すことができるのか」,「トランザクションを必要とするか否か」などがこれにあたる。COM+の管理下にあるCOMオブジェクトは,実体化されているあいだは必ずコンテキストを伴う(Fig.5-2)。

Fig.5-2 コンテキスト
fig5_02.gif

 インタセプタは,コンテキストとCOMオブジェクトを包み込むCOMオブジェクトである。COM+では,インタセプタに包まれているCOMオブジェクトを外部から参照することはできない。Fig.5-1でも説明したように,COMコンポーネントをCOMクライアントから実体化した場合,COMクライアント側には実体化されたCOMオブジェクトのインタフェースではなく,インタセプタのインタフェースが戻る。そのため,COMクライアントがインタセプタ内のCOMオブジェクトにアクセスするには,まずインタセプタに対してアクセスしなければならない。するとインタセプタは,自分が包み込んでいるCOMオブジェクトに代理でアクセスし,これを呼び出す。この仕組みは,Fig.4-36で説明したプロキシとスタブの関係と同じである(Fig.5-3)。

Fig.5-3 インタセプタとプロキシ/スタブとの対比
fig5_03.gif

 ただしインタセプタはプロキシ/スタブとは違い,COMオブジェクトを代理で呼び出すときに,コンテキストの内容を調べ,「呼び出し可能かどうか」,「呼び出すときに何か処理をしなければならないかどうか」を判別する。「呼び出し可能かどうか」とは,たとえば適切なセキュリティ権限(ロールによる権限)があるか否かを指す。「呼び出すときに何か処理をしなければならないかどうか」とは,たとえばデータベースエンジンにトランザクションの開始や終了を告げる必要があるかどうかを指す。

 つまりインタセプタは,COMクライアントからの呼び出しを,そのまま内部に含んでいるCOMオブジェクトに引き渡すのではなく,その呼び出しを横取りして,必要な処理を加えるのである。これが,単なる「プロキシとスタブ」ではなく,「インタセプタ(Intercepter:奪う,横取りする)」と呼ばれている所以である(Fig.5-4)。

Fig.5-4 インタセプタによる呼び出しの横取り
fig5_04.gif

 以上の説明をまとめておこう。COM+を理解するために重要なことは,次の2点である。

1)COMオブジェクトはコンテキストを伴う
 COM+の管理下にあるCOMオブジェクトは,必ず「コンテキスト」と呼ばれるCOMオブジェクトを伴う。コンテキストには,COMオブジェクトの実行状態が保存されている。
 
2)COMオブジェクトはインタセプタによって隠される
 COM+の管理下にあるCOMオブジェクトは,必ず「インタセプタ」と呼ばれるCOMオブジェクトで隠され,外部から直接参照されることはなくなる。COMオブジェクトを呼び出したときには,コンテキストの持つ情報と照合され,セキュリティをチェックしたり,必要であればトランザクションを開始または停止したりする処理が実行される。

 ただし,インタセプタはあくまでも概念的なCOMオブジェクトである。インタセプタはCOM+によって隠蔽されており,開発者はその実体を目にすることはないし,直接それを意識して操作することもない。COM+の管理下にあるCOMコンポーネントを実体化したときには,実体化されたCOMオブジェクトが戻ってくるのではなく,インタセプタが戻ってきている。しかし,そのインタセプタは,あたかも実体化されたCOMオブジェクトのように振る舞う。表現は悪いが,開発者はCOM+に騙されているのである。本当はインタセプタを掴まされているのに,COMオブジェクトを掴んでいるように見えているのである。よって,COMクライアントからCOM+の管理下にあるCOMオブジェクトを使うときには,「それがインタセプタであるかどうか」を意識する必要はまったくない。


One Point!COM+の場合,「COM+の管理下にあるCOMオブジェクトを直接参照できない」という点には注目してほしい。COM+の前身であるMTSにおいても,インタセプタと同様の機能を提供する「コンテキストラッパー」と呼ばれるオブジェクトが存在していた。しかし,MTSにおけるコンテキストラッパーは,完全にCOMオブジェクトを隠蔽するものではなく,コンテキストラッパーを飛ばして直接COMオブジェクトを参照することもできた。そのためクライアントは,わずかながらもそれがMTSの管理下にあるのかどうかを意識する必要があった。実際,MTSの管理下にあるCOMオブジェクトを扱う場合には,必ず明示的にコンテキストラッパーを取得するなど,特殊な操作が必要となった。だが,COM+においてはCOMオブジェクトが完全に隠蔽されており,いかなる場合もインタセプタしか得られない。COMコンポーネントの実体化などに伴って必要となる処理は,すべてCOM+サービスで自動的に実行される。そのためCOM+では,COMオブジェクトがCOM+で管理されていようといまいと,COMクライアントからCOMオブジェクトをまったく同じ操作で扱える。
prevpg.gif Chapter 5-1 3/23 nextpg.gif