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

head2.gif 5.6.3 共有プロパティの用途
 以上が簡単な共有プロパティの使い方であるが,では共有プロパティはどのような場面で実際に使われるのだろうか。

 まず1つの可能性として考えられるのは,COMオブジェクトが持つべきデータの保存である。ジャストインタイムアクティベータによって非アクティブ化されたときには,COMオブジェクトが保持しているデータが破棄されてしまう。そこで,共有プロパティにデータを格納して,非アクティブ化されたあとも継続して値を保存できるようにするのである。

 もう1つの可能性として考えられるのは,COMオブジェクト間のデータの共有である。たとえば,あるCOMオブジェクトが設定した値を別のCOMオブジェクトが取得して処理を続けたいような場合である。具体的にいえば,COMオブジェクトが呼び出される順番によって,連番を返したいような処理が考えられる。連番を返したい場合には,共有プロパティとして連番を保持する領域を用意しておき,COMオブジェクトが呼び出されるたびに保持している値をインクリメントしたのちに取得して,COMクライアントに返すように実装すればよい。実際にそのようなプログラムを例示すると,List 5-14のようになる。

 List 5-14では,11行目で第3引数にProcess定数を指定して,CounterGroupという名前のSharedPropertyGroupオブジェクトを作成している。Process定数を指定しているので,このSharedPropertyGroupオブジェクトはCOM+アプリケーションがシャットダウンされるまで破棄されない。そして,13行目でそのSharedPropertyGroupオブジェクトの配下にmyCounterという名前のSharedPropertyオブジェクトを作る。もし,まだmyCounterという名前のSharedPropertyオブジェクトが存在しなければ,CreatePropertyメソッドの第2引数の値はFalseに設定される。そこで,16行目でその値を調べ,Falseであれば(すなわち,13行目のCreatePropertyメソッドの呼び出しによってmyCounterという名前のSharedPropertyオブジェクトを新規に作成したならば),その値を0に初期化している。そして,19行目以降の処理で,SharedPropertyオブジェクトが保持している値に1を加えたものを,Counterプロパティの戻り値に設定している。実際にList 5-14に示したプログラムをCOM+アプリケーションに登録したのちに呼び出すと,順に,1,2,3,……という値が得られる。もし,このCOM+アプリケーションをシャットダウンすると,共有プロパティは破棄されるので,それ以降の呼び出しにおける戻り値は,1,2,3,……のように再び1からスタートする。

 また,共有プロパティは,アクセスするときに排他ロックがかかることから,COMオブジェクト間でちょっとした同期処理をするのにも利用できる(ただし,本格的な同期処理を実現したいのであれば,トランザクション処理にすべきである)。

 しかし,共有プロパティは,あまり多用すべきではない。なぜなら,共有プロパティを利用しているあいだは,排他ロックがかかるため,別のCOMオブジェクトが同じ共有プロパティにアクセスする場合に待たされることになり,パフォーマンスが落ちるからである。よって,共有プロパティの利用は,できれば最小限に抑えたい。また,共有プロパティを利用する場合,ロックがかかる時間を短くするため,SharedPropertyGroupオブジェクトやSharedPropertyオブジェクトは握りっぱなしにせず,利用が終わった時点でできるだけ速やかに解放(オブジェクトを保持している変数にNothing定数を代入する)すべきである。

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