(57)【特許請求の範囲】
【請求項１】
コンピュータ実行可能命令を格納する１つまたは複数のコンピュータ可読記憶媒体であって、前記コンピュータ実行可能命令は、コンピュータシステムの１つまたは複数のプロセッサによって実行されると、前記コンピュータシステムにプログラムの複数のコンポーネントを作成する方法を実行させ、前記方法は、
コンポーネント領域を前記コンピュータシステムのメモリ内に生成する動作と、
前記コンポーネント領域に付随する１つまたは複数のコンポーネントから成る初期コンポーネントセットをインスタンス化する動作であって、前記初期コンポーネントセットの前記コンポーネントの各々によってインポートされるサービスがあればこれらを前記コンポーネント領域に表示し、かつ前記初期コンポーネントセットの前記コンポーネントの各々によってエクスポートされるサービスがあればこれらも前記コンポーネント領域に表示する、インスタンス化する動作と、
前記初期コンポーネントセットの中から、１つまたは複数のネストされたコンポーネントを含む任意のコンポーネントを識別する動作と、
前記識別されたコンポーネントについて、前記ネストされたコンポーネントを展開する動作であって、前記ネストされたコンポーネントによってインポートされるサービスがあればこれらが前記コンポーネント領域に表示される範囲まで前記ネストされたコンポーネントが前記コンポーネント領域に表示され、かつ前記ネストされたコンポーネントによってエクスポートされるサービスがあればこれらが前記コンポーネント領域に表示される、展開する動作と、
エクスポートされるサービスを求めて前記初期コンポーネントセットにポーリングを行う動作と、
インポートされるサービスを求めて前記初期コンポーネントセットにポーリングを行って、前記初期コンポーネントセットのうちの、少なくとも１つの前記コンポーネントの、インポートされた前記サービスのうちの少なくとも１つを満足させるサービスをエクスポートする前記初期コンポーネントセットのうちの別のコンポーネントを特定する動作と
を備え、前記展開する動作、前記ポーリングを行う動作、及び前記特定する動作は、予め定められた順番で行われ、前記予め定められた順番は、第１を前記展開する動作、第２を前記ポーリングを行う動作、及び第３を前記特定する動作とすることを特徴とするコンピュータ可読記憶媒体。
【請求項２】
前記方法が更に、
前記ポーリングを行う動作の前に、エクスポートされるサービスを求めるポーリングが開始されようとしていることを前記初期コンポーネントセットのうちの少なくともいくつかに通知する動作を含むことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項３】
前記方法が更に、
前記特定する動作の後に、前記特定する動作が完了したことを前記初期コンポーネントセットのうちの少なくともいくつかに通知する動作を含むことを特徴とする請求項２に記載のコンピュータ可読記憶媒体。
【請求項４】
前記方法が更に、
前記特定する動作の後に、前記特定する動作が完了したことを前記初期コンポーネントセットのうちの少なくともいくつかに通知する動作を含むこと特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項５】
前記展開する動作、ポーリングを行う動作、前記特定する動作を含む集合動作は、前記集合動作のうちの最初のイテレーションにおいて行なわれ、
前記方法は更に、
前記集合動作のうちの前記最初のイテレーションにおいて行なわれる前記特定する動作の後に、前記特定する動作の結果として追加された更なるサービスのインポートがあればこれを判断する動作と、
前記集合動作のうちの次のイテレーションを行う動作と
を含むことを特徴とする請求項１に記載のコンピュータ可読記憶媒体。
【請求項６】
前記集合動作は、全てのサービスのインポートを満足させるまで、複数のイテレーションについて反復して行われることを特徴とする請求項５に記載のコンピュータ可読記憶媒体。
【請求項７】
１または複数の追加のサービスインポートは、追加のコンポーネントが前記コンポーネント領域に付随する結果として追加され、前記初期コンポーネントセットのサービスインポートを満足させ、前記追加のサービスインポートの少なくとも１つは、前記追加のコンポーネントのうちの少なくとも１つのサービスインポートであることを特徴とする請求項５に記載のコンピュータ可読記憶媒体。
【請求項８】
前記追加のサービスインポートの少なくとも１つは、そのサービスインポートのうちの別のサービスインポートを満足させた後に、前記初期コンポーネントセットのうちの１つによって追加されたことを特徴とする請求項７に記載のコンピュータ可読記憶媒体。
【請求項９】
コンピュータ実行可能命令を格納する１つまたは複数のコンピュータ可読記憶媒体であって、前記コンピュータ実行可能命令は、コンピュータシステムの１つまたは複数のプロセッサで実行されると、前記コンピュータシステムに、プログラムの複数のコンポーネントを作成する方法を実行させ、前記方法は、
インスタンス化されたコンポーネントを結びつけるためのコンポーネント領域を前記コンピュータシステムのメモリ内に作成するステップと、
ランタイムにおいて、インスタンス化され前記コンポーネント領域と関連付けられた前記コンポーネントのサービスインポートとサービスエクスポートのマッチングと、論理メカニズムの使用に基づいて、ランタイムにおいて、前記コンポーネント領域に含まれるコンポーネントを動的にバインディングするために用いられる前記論理メカニズムを含むコンポーネント領域マネージャを作成するステップであって、前記コンポーネント領域マネージャはランタイムにおいて、
複数のインスタンス化されたコンポーネントを前記コンポーネント領域に関連付けるステップと、
ネストされたコンポーネントである、前記コンポーネント領域に関連付けられた任意のコンポーネントを識別し、前記ネストされたコンポーネントを展開することと、
前記ネストされたコンポーネントによってエクスポートされるサービスとインポートされるサービスを、前記コンポーネント領域の前記インスタンス化されたコンポーネントのそれぞれによって識別し、インデックスをつけることであって、前記コンポーネント領域は、前記展開されたネストされたコンポーネントの任意のエクスポートされたサービス及び任意のインポートされたサービスを含む、識別し、インデックスをつけることと、
ランタイムにおいてサービスエクスポートデータとサービスインポートデータを比較し、少なくとも特定のサービスをエクスポートする第１のコンポーネントと、少なくとも前記特定のサービスとインポートする第２のコンポーネントとを識別し、ランタイムにおいて前記第１のコンポーネントが、前記特定のサービスを前記第２のコンポーネントに対して利用可能にするように、前記特定のサービスに対する前記第１のコンポーネントと前記第２のコンポーネントとをバインディングすることと、
バインディングする必要があるインポートされた他のサービスがあるかどうかを判断し、あれば、次の前記イテレーションを続けることと
を反復して実行するステップと
を実行する、作成するステップと
を備えたことを特徴とするコンピュータ可読記憶媒体。
【請求項１０】
前記イテレーションのうちの少なくとも１つについて、前記バインディングすることは、
前記コンポーネント領域内の前記インスタンス化されたコンポーネントを探す動作と、
前記コンポーネント領域内の前記インスタンス化されたコンポーネントのうちのいずれも、少なくとも１つのほかのインスタンス化されたコンポーネントによってインポートされた少なくとも１つのサービスとバインディング可能なサービスをエクスポートしないと判断する動作と、
まだインスタンス化されておらず、前記コンポーネント領域と関連付けられていない異なるコンポーネントを見つけるためのカタログを探す動作であって、前記異なるコンポーネントは前記少なくとも１つのほかのインスタンス化されたコンポーネントによってインポートされた前記サービスとバインディング可能な前記サービスをエクスポートする、探す動作と、
前記異なるコンポーネントをインスタンス化し、前記コンポーネント領域と関連付ける動作と、
前記異なるコンポーネントの前記インスタンス化によってエクスポートされるサービスを、前記少なくとも１つのほかのインスタンス化されたコンポーネントによってインポートされる前記少なくとも１つのサービスにバインディングする動作と
を含むことを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１１】
前記展開されたネストされたコンポーネントは、少なくとも２段階ネストされたコンポーネントを含むことを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１２】
前記イテレーションのうちの少なくとも１つについて、前記ネストされたコンポーネントによってエクスポートされる前記サービスを識別する前に、前記コンポーネント領域の前記コンポーネントに通知する動作を更に含むことを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１３】
前記反復して実行するステップが完了した後に、前記コンポーネント領域の前記コンポーネントに通知する動作を更に含むことを特徴とする請求項９に記載のコンピュータ可読記憶媒体。
【請求項１４】
コンピュータ実行可能命令を格納する１つまたは複数のコンピュータ可読記憶媒体であって、前記コンピュータ実行可能命令は、コンピュータシステムの１つまたは複数のプロセッサで実行されると、前記コンピュータシステムにプログラムの複数のコンポーネントを作成する方法を実行させ、前記方法は、
コンピュータシステムメモリの一部内にコンポーネント領域を作成することであって、前記コンポーネント領域は、論理コンテナの中でインスタンス化されたコンポーネントと関連付ける、前記論理コンテナとしての機能を果たす、作成することと、
ランタイムにおいてインスタンス化され、前記コンポーネント領域に関連付けられる前記コンポーネントのサービスインポートとサービスエクスポートとをマッチングすることに基づいて、ランタイムにおいて前記コンポーネント領域内に含まれるコンポーネントを動的にバインディングするために使用される論理メカニズムを含むコンポーネント領域マネージャを作成することであって、前記論理メカニズムは、
複数のインスタンス化されたコンポーネントと前記コンポーネント領域とを関連付ける関連メカニズムと、
ネストされたコンポーネントである、前記コンポーネント領域に関連付けられた任意のコンポーネントを識別し、前記ネストされたコンポーネントを展開するネストされたコンポーネントメカニズムと、
ランタイムにおいて、前記コンポーネント領域の前記インスタンス化されたコンポーネントのそれぞれによって、前記ネストされたコンポーネントがエクスポートするサービスとインポートするサービスとを識別し、インデックスをつける、前記コンポーネント領域マネージャのサービスインベントリメカニズムであって、前記コンポーネント領域は、前記展開されたネストされたコンポーネントの任意のエクスポートされたサービス、及び任意のインポートされたサービスを含む、サービスインベントリメカニズムと、
ランタイムにおいてサービスエクスポートデータとサービスインポートデータとを比較し、少なくとも特定のサービスをエクスポートする第１のコンポーネントと少なくとも前記特定のサービスをインポートする第２のコンポーネントとを識別し、前記第１のコンポーネントが、前記第２のコンポーネントに対して前記特定のサービスを利用可能にするように、前記特定のサービスに対して前記第１のコンポーネントを前記第２のコンポーネントにバインディングする、前記コンポーネント領域マネージャのマッチングメカニズムと
を含む、作成することと
を備えたことを特徴とするコンピュータ可読記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、反復コンポーネントのバインディングに関する。
【背景技術】
【０００２】
オブジェクト指向プログラミングは、オブジェクトインスタンス、即ち「コンポーネント」の集合としてソフトウェアを構造化しており、その各々は、コンポーネントの方法及びプロパティを定義するクラスにならって形成されている。プログラミングを参照すると、「コンポーネント化」はコンポーネントを定義することを示し、コンポーネントはプログラムにとって都合がよい形に作られる。もちろん、プログラムのコンポーネントは、プログラムのより大きな目標を達成するために機能的に相互接続されている。「コンポジション」は、プログラム内のオブジェクトが互いに関連付けられる方法を定義することを示す。
【０００３】
通常、オブジェクト同士の間の相互関係は、プログラムのコンポーネント同士の間の関係を特に具体的に定義するコードまたは宣言を用いて実現される。オブジェクト指向プログラミング技術は、符号化オブジェクト同士の間の相互接続のかかる明示的なコンポジションを用いて大きく進歩した。従来の明示的なコンポジションにおいて、例えば、プログラムのコンポジション（即ち、コンポーネント同士の間の相互関係）を定義するコードは、ソースコードを用いてプログラムをオーサリングした後にコンパイルされる。よって、実行可能ファイルは、生成時から、プログラムの様々なコンポーネント及びプログラムコンポーネント同士の間の様々な相互関係を表す。
【発明の概要】
【０００４】
本明細書において説明される実施形態は、コンポーネント領域の使用に関し、コンポーネント領域に付随する様々なコンポーネント同士の間のバインディングを定義する。コンポーネント領域は、各コンポーネントによってインポートされるべき様々なサービスをトラッキングし、各コンポーネントによってエクスポートされる様々なサービスをトラッキングする。コンパイル時よりはむしろランタイムに、コンポーネント同士の間の様々な相互関係は、サービスインポートデータ及びサービスエクスポートデータを用いてバインディングされる。従って、利用可能なコンポーネント及びコンポーネントの特徴により、バインディングは異なっていてもよい。これによって、アプリケーションがより柔軟性を有するようになる。１つの実施形態において、バインディングは反復して行われる。例えば、サービスインポートをサービスエクスポートにバインディングする１つのイテレーションの後ならば、いくつかのコンポーネントはコンポーネントがエクスポートするサービスまたはコンポーネントがインポートすることを所望するサービスを展開することができる。
【０００５】
この概要は、請求された発明の重要な特徴または基本的特徴を識別することを意図しておらず、請求された発明の範囲を決定する際の助けとして用いられることも意図していない。
【０００６】
本明細書において説明される実施形態の上記の利点及び特徴並びにその他の利点及び特徴を得ることができる方法を説明するために、上記に簡潔に説明した本発明のより詳しい実施形態が、添付の図面に示される特定の実施形態を参照することによって示される。これらの図面はより上位の原理の例示的な実施形態だけを表しており、従って、本発明の範囲を限定すると見なされるべきでないという理解の下に、実施形態は、添付の図面を利用して付加的な特異性及び詳細を用いて記述されかつ説明される。
【図面の簡単な説明】
【０００７】
【図１】コンポーネント領域を動作させることができる例示的なコンピュータシステムを示す図である。
【図２】コンポーネント領域内に含まれる付随される論理及びコンポーネントを有するコンポーネント領域の例示的なアーキテクチャを示す図である。
【図３】バインディングされた後のコンポーネント領域の様々なコンポーネントの例を示す図である。
【図４】ネストされたコンポーネントの展開に付随するプロセスのフローを示す図である。
【図５】コンポーネント領域のコンポーネントを反復してバインディングする方法のフローチャートである。
【図６】ネストされたコンポーネントを有するコンポーネントをインスタンス化した後にネストされたコンポーネントを展開する方法のフローチャートである。
【図７】サービスインポートをサービスエクスポートで満足させる方法のフローチャートである。
【発明を実施するための形態】
【０００８】
本明細書において説明される実施形態によれば、コンポーネント領域は、コンポーネント領域内の様々なコンポーネント同士の間のバインディングを生成するために用いられる。コンポーネント領域は、各コンポーネントによってインポートされるべき様々なサービスをトラッキングし、各コンポーネントによってエクスポートされる様々なサービスをトラッキングする。コンパイル時よりはむしろランタイムに、コンポーネント同士の間の様々な相互関係は、サービスインポートデータ及びサービスエクスポートデータを用いてバインディングされる。従って、利用できるコンポーネント及びコンポーネントの特徴に応じて、バインディングは異なっていてもよい。これによって、アプリケーションがより柔軟性を有するようになる。１つの実施例において、バインディングは反復して行なわれる。例えば、サービスインポートをサービスエクスポートにバインディングする１つのイテレーションの後ならば、いくつかのコンポーネントはコンポーネントがエクスポートするサービスまたはコンポーネントがインポートすることを所望するサービスを展開することができる。
【０００９】
最初に、コンピュータシステムに関する一般的な導入的議論の後に、基本的なコンピュータシステムが図１に関して説明される。次に、コンポーネント領域論理を有するコンポーネント領域の様々な実施形態及びそのオペレーションの様々な実施形態が、図２乃至７に関して示されかつ説明される。
【００１０】
コンピュータシステムは、今や、ますます多種多様な形式をとっている。コンピュータシステムは、例えば、携帯端末、電化製品、ラップトップコンピュータ、デスクトップコンピュータ、メインフレーム、分散コンピュータシステム、または、従来コンピュータシステムと認められなかったデバイスであるかもしれない。本明細書および特許請求の範囲において、用語「コンピュータシステム」は、少なくとも１つのプロセッサとプロセッサが実行することができるコンピュータ実行可能命令を有することができるメモリとを含む何らかのデバイスまたはシステム（またはこれらの組合せ）を含むものとして広く定義される。メモリは、いかなる形式を取ることもでき、コンピュータシステムの性質及び形式によって決まってもよい。コンピュータシステムは、ネットワーク環境を介して分散されていてもよく、複数の構成のコンピュータシステムを含むことができる。
【００１１】
図１を参照すると、その最も基本的なコンフィギュレーションにおいて、コンピュータシステム１００は通常、少なくとも１つの処理装置１０２及びメモリ１０４を含む。メモリ１０４は物理的なシステムメモリであってもよい。物理的なシステムメモリは、揮発性、不揮発性、またはこれら２つのうちのいくつかの組み合わせであってもよい。用語「メモリ」は、また、本明細書において、物理的記憶媒体などの不揮発性の大容量記憶装置を示すために用いられる。コンピュータシステムが分散されている場合、処理能力、メモリ能力及び／または記憶能力も同様に分散されていてもよい。本明細書において用いられるように、用語「モジュール」または「コンポーネント」は、コンピュータシステムで実行するソフトウェアオブジェクトまたはルーチンを示すことができる。本明細書において説明される異なるコンポーネント、モジュール、エンジン、及びサービスは、コンピュータシステムで実行するオブジェクトまたはプロセスとして実施されてもよい（例えば、別個のスレッドとして）。
【００１２】
後に続く詳細な説明において、実施形態が、１つまたは複数のコンピュータシステムによって行なわれる動作を参照して説明される。かかる動作がソフトウェアで実施される場合、動作を行なう付随するコンピュータシステムの１つまたは複数のプロセッサは、コンピュータ実行可能命令を実行したことに応じてコンピュータシステムのオペレーションを指示する。かかるオペレーションの例は、データの操作を含む。コンピュータ実行可能命令（及び操作されたデータ）は、コンピュータシステム１００のメモリ１０４に格納されてもよい。
【００１３】
コンピュータシステム１００は、また、通信チャネル１０８を含むことができ、通信チャネル１０８によって、コンピュータシステム１００が、例えばネットワーク１１０などを介して他のコンピュータシステムと通信できるようになる。通信チャネル１０８は、通信媒体の例である。通信媒体は、通常、コンピュータ可読命令、データ構造、プログラムモジュール、または搬送波もしくは他の輸送メカニズムなどの変調されたデータ信号内の他のデータを具体化し、あらゆる情報交付媒体を含む。一例であって限定ではないが、通信媒体は、有線ネットワーク及び直接配線接続などの有線媒体、並びに音響、無線通信、赤外線及び他の無線媒体などの無線媒体を含む。本明細書において用いられる用語コンピュータ可読媒体は、記憶媒体及び通信媒体の両方を含む。
【００１４】
図１において、コンピュータシステム１００は、メモリ１０４の不揮発性部分の中にコンポーネント領域１１２を有するように示されている。図２及び図２に続く図に関して更に詳細に説明されるように、コンポーネント領域１１２は様々なコンポーネントをその中にインスタンス化する論理コンテナとして用いられる。次にコンポーネント領域論理１１４は、コンパイル時にバインディングされたコンポーネントを有するというよりは、様々なコンポーネントを動的にバインディングする。
【００１５】
本発明の範囲内の実施形態は、また、コンピュータ可読媒体を含み、該コンピュータ可読媒体に格納されるコンピュータ実行可能命令またはデータ構造を運ぶかまたはこれらを有している。かかるコンピュータ可読媒体は、汎用コンピュータまたは専用コンピュータがアクセスできるあらゆる利用可能な媒体であってもよい。一例であって限定ではないが、かかるコンピュータ可読媒体は、物理的記憶装置及び／またはメモリ媒体を含むことができ、該物理的記憶装置及び／またはメモリ媒体は、ＲＡＭ、ＲＯＭ、ＥＥＰＲＯＭ、ＣＤ−ＲＯＭもしくは他の光ディスク記憶装置、磁気ディスク記憶デバイスもしくは他の磁気記憶デバイス、またはコンピュータ実行可能命令またはデータ構造の形で所望のプログラムコード手段を運ぶかまたは格納することができかつ汎用コンピュータまたは専用コンピュータがアクセスすることができるあらゆる他の媒体などである。情報がネットワークまたは別の通信接続（配線接続による通信接続、無線による通信接続、または、配線接続による通信接続または無線による通信接続の組み合わせ）を介してコンピュータに転送されるかまたは提供されると、コンピュータは、コンピュータ可読媒体として該接続を適当に表示する。よって、いずれのかかる接続も、コンピュータ可読媒体と称されるのが適当である。上記の組合せも、コンピュータ可読媒体の範囲内に含まれなければならない。
【００１６】
コンピュータ実行可能命令は、例えば、汎用コンピュータ、専用コンピュータ、または専用処理装置に特定の機能または一群の機能を実行させる命令及びデータを含む。本発明は構造上の特徴及び／または方法論的動作に固有の言語で説明されているが、添付の特許請求の範囲において画定される本発明は、本明細書において説明されている特定の特徴または特定の動作に必ずしも限定されるわけではないと理解されなければならない。むしろ、本明細書において説明されている特定の特徴及び動作は、特許請求の範囲を実施する例の一種として開示されている。
【００１７】
図２は、コンポーネント領域２１０及び「コンポーネント領域論理」と名前を付けられた付随するコンポーネント領域マネージャ２２０を示す。図２のコンポーネント領域２１０は、例えば、図１のコンポーネント領域１１２であってもよい。コンポーネント領域２１０は、コンポーネントインスタンスを含むことができるいかなる論理コンテナであってもよい。コンポーネント領域２１０の柔軟性によって、コンポーネント領域が様々なクラスの様々なコンポーネントインスタンスを含むことができるようになる。コンポーネント領域２１０内に含まれるコンポーネントのタイプは、アプリケーション及びそのアプリケーションによって用いられる構成要素によって決まる。従って、本発明の原理は、コンポーネント領域２１０内に含まれるコンポーネントのタイプに限定されないし、コンポーネント領域内のコンポーネントの数にも限定されない。そうは言っても、例示を目的として、６つのコンポーネント２１１、２１２、２１３、２１４、２１５、及び２１６が、コンポーネント領域２１０に含まれるように示されている。
【００１８】
コンポーネント領域２１０は、実際にまたは論理的に他のコンポーネントを含むことができる何らかの論理コンテナでもあってもよい。例えば、コンポーネント領域２１０は、様々なコンポーネントインスタンスを与えられることができるコンテナクラスのインスタンスであってもよい。コンポーネントインスタンスの集合は、データ構造である。コンポーネント領域２１０は、また、直接各コンポーネントインスタンスを含まないが場合によっては付随するコンポーネントに関する情報を有するオブジェクトであってもよい。その場合でさえ、コンポーネントはコンポーネント領域２１０内で論理的とみなすことができる。例えば、１つの実施形態において、コンポーネント領域は、一群の名前と値の対である一群の値だけを含む場合もある。コンポーネント領域は、サービスをエクスポートするコンポーネントから値を与えられ、そのサービスをインポートするコンポーネントが値を与えられる。そのような状況を考慮してもなお、コンポーネントは、論理的にコンポーネント領域内にまたはその内部にあるとみなすことができる。この明細書においてかつ特許請求の範囲において、コンポーネントがコンポーネント領域内にまたはその内部にあると言う場合、このことは、コンポーネントがコンポーネント領域内に含まれるかまたは、コンポーネント領域論理２２０がコンポーネント領域に付随する様々なコンポーネントと通信しかつバインディングすることができるようなやり方でコンポーネントがコンポーネント領域に何らかの形で論理的に付随するかのいずれかであるということを意味する。
【００１９】
コンポーネント領域論理２２０は、例えば、関連メカニズム２２２、サービスインベントリメカニズム２２３、ネストされたコンポーネントの展開メカニズム２２４、付随するマッチングルール２２６を有するマッチングメカニズム２２５、抽出メカニズム２２７、及び付随するカタログ２２９を有するカタログ化メカニズム２２８を含む様々なメカニズムを含むように示されている。これらの様々なメカニズム２２２乃至２２９は、別個のメカニズムとして示されている。しかしながら、これはコンポーネント領域論理２２０の機能を説明する際に明確にすることを目的としている。これらが実際に別個のメカニズムであることを表すために用いられていない。いくつかのメカニズムを、単一のコンポーネントに組み合わすことができる。実際、コンポーネント領域論理の全ては、モノリシックであってもよい。他の例では、各メカニズムは複数のコンポーネントから構成されていてもよい。単一のコンポーネントも、複数のメカニズムに関係する論理を含むことができる。様々なコンポーネント領域論理２２０のメカニズムのオペレーションを、すぐ後に説明する。
【００２０】
しかしながら、最初に、この詳細な説明は、コンポーネント領域２１０内でインスタンス化される様々な構成コンポーネントを振り返ってみる。図示された例において、構成コンポーネントは、コンポーネント２１１乃至２１６を含む。各コンポーネントは、特定のクラスのインスタンスである。この原理を記号で表すために、各コンポーネントは、特定の形式で示されている。例えば、例において、コンポーネント２１１は正方形で示されている。コンポーネント２１２及び２１４は、これらが同じクラスのインスタンスの各々であって各インスタンスはコンポーネント２１１と同じクラスでないことを示す三角形で示されている。コンポーネント２１３は、これがコンポーネント２１１及び２１２と異なるクラスのインスタンスであることを表す円で示されている。コンポーネント２１５は、コンポーネント２１１乃至２１４と異なったクラスのインスタンスであることを表している上辺が大きい平行四辺形で示されている。最後に、コンポーネント２１６は、コンポーネント２１１乃至２１５と異なったクラスのインスタンスであるということを表している底辺が大きい平行四辺形で示されている。
【００２１】
各コンポーネントは、潜在的に１つまたは複数のサービスインポート及び潜在的に１つまたは複数のサービスエクスポートを含む。コンポーネントに関する「サービスインポート」は、コンポーネントがサービスを要求しているという表示である。コンポーネントに関する「サービスエクスポート」は、コンポーネントがサービスを提供することを提案しているという表示である。サービスインポート及びサービスエクスポートは、対応するコンポーネントから伸びたアームによって、図２において各々記号で表されている。サービスインポートは、その端部にカップの形を有するアームで表されている。サービスエクスポートは、その端部にボールの形を有するアームで表されている。図２のコンフィギュレーションにおいて、コンポーネント２１１−２１６の全ては、コンポーネント領域２１０内でインスタンス化されている。しかしながら、コンポーネントのいずれも互いに接続されていない。コンポーネントが接続されるべき方法は、ランタイムに先立ってさらには明確に特定されていない。その代わりに、サービスインポート及びサービスエクスポートが特定されている。様々なサービスのインポート及びエクスポートは、図２において文字Ａ乃至Ｆを用いて抽象的に表されている様々なサービスに対するものである。
【００２２】
例えば、コンポーネント２１１は、アームａで表されるようなサービスＢのための１つのサービスエクスポートを有する。更に、２つのサービスインポート、即ち、アームｉで表されるようなサービスＡのための１つのサービスインポート及びアームｊで表されるようなサービスＡのためのもう１つのサービスインポートを有する。コンポーネント２１２は、２つのサービスエクスポート、即ち、アームｂで表されるサービスＡのための１つのサービスエクスポート及びアームｃで表されるサービスＥのための１つのサービスエクスポートを有する。コンポーネント２１２は、サービスインポートを有していない。コンポーネント２１３は、アームｄで表されるサービスＦのための１つのサービスエクスポート及び、２つのサービスインポート、即ち、アームｋで表されるサービスＢのための１つのサービスインポート及びアームｍで表されるサービスＣのためのもう１つのサービスインポートを有する。コンポーネント２１４は、コンポーネント２１２と同じクラスである。１つの実施形態において、サービスインポート及びサービスエクスポートのタイプは、クラスによって画定される。従って、コンポーネント２１４は、サービスインポートを有しておらず、２つのサービスエクスポート、即ち、アームｆで表されるサービスＡのための１つのサービスエクスポート及びアームｅで表されるサービスＥのための１つのサービスエクスポートを有するという点で、コンポーネント２１２と同様である。コンポーネント２１５は、サービスインポートを有しておらず、アームｇで表されるサービスＤのためである１つのサービスインポートを有している。コンポーネント２１６は、アームｎで表されるサービスＤのための１つのサービスインポートと、アームｈで表されるサービスＣのための１つのサービスエクスポートを有している。
【００２３】
コンポーネント領域２１０は、コンポーネントのコンポジションの前に様々なコンポーネント２１１乃至２１６を示す。「コンポジション」は、様々なコンポーネントが相互接続されるべき方法を定義することを示す。最終的に、コンポーネント領域２１０のコンポーネントは、コンポーネントの定義された相互接続を有する。しかしながら、このことは、コンポーネント領域２１０の様々なコンポーネントで表されるアプリケーションの実行前に行われなかった。むしろ、コンポーネント領域論理２２０は、ランタイムにおける様々なコンポーネント同士の間の接続を定義する。
【００２４】
図３は、コンポジション後の様々なコンポーネント２１１乃至２１６を示す。１つの特定のマッチングオペレーションにおいて、特定のサービスのためのサービスエクスポートは、同じ特定のサービスのためのサービスインポートに連結することになっている。図３において、コンポーネント２１２のサービスＡのためのサービスエクスポートは、（アームｊに接続するアームｂで表されるように）コンポーネント２１１のサービスＡのためのサービスインポートに接続されている。これによって、コンポーネント２１２は、関連するインタフェースを用いてコンポーネント２１１にサービスＡを提供することが表されている。同じ記号で表された意味は、サービスインポート及びサービスエクスポートのそれぞれのサービスに関して図３に示されているサービスインポートとサービスエクスポートとの間の他の接続にあてはまる。例えば以下のアーム対は、接続されて示されている。即ち、サービスＡのためのアームｆとアームｉ、サービスＢのためのアームａとアームｋ、サービスＣのためのアームｈとアームｍ、及びサービスＤのためのアームｇとアームｎが接続されて示されている。コンポーネント２１２のサービスＥのためのサービスエクスポート（アームｃで表されている）は、いずれのサービスインポートにも接続されておらず、このサービスエクスポートが潜在的であることを表している。同じ記号で表された意味が、アームｄ及びアームｅにあてはまる。
【００２５】
コンポーネント同士の間の接続は前もって定義されていないが、コンポーネントのためのサービスエクスポート及びサービスインポートは示されている。サービスエクスポート及びインポートがどこでまたはどのように特定されるかは問題ではない。しかしながら、１つの考えられる場所は、クラス定義自体においてであってもよい。例えば、Ｃ＃コードで書かれた「Ｃｏｎｓｕｍｅｒ」と称されるクラスのための以下のクラス定義を検討する。
【００２６】
【数１】
0004959003.tif 000002
【００２７】
角括弧において、class Consumerは、「Consumer Report」と称されるサービスをインポートすることを宣言する。角括弧の内容は、Ｃ＃のコンパイルされたオブジェクトの機能に影響を及ぼさない。むしろ、内容は、そのデフォルト実行の一部でない方法でこれを記述するコンパイルされたタイプまたはメンバを伴うメタデータとしてコンパイルされたクラスに書き込まれるが、外部から調べることができかつ影響を与えることができる。この例では、クラスのオブジェクトがインスタンス化されることになっているときに、その事前コンパイルされた形式または事後コンパイルされた形式のいずれかのクラス定義が参照されて、そのクラスの後の特定のオブジェクトのためのサービスインポートを識別してもよい。
【００２８】
サービスインポートとサービスエクスポートとの間の１つの例示的なマッチングにおいて、サービス名は正確にマッチングすることになっているが、他のマッチングルールがあってもよい。以下は、クラスが「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」と称されるサービスをエクスポートする、Ｃ＃で表されたクラス定義を表す。
【００２９】
【数２】
0004959003.tif 000003
【００３０】
ここで、角括弧内のメタデータ表現は、クラスＲｅｐｏｒｔＥｎｖｅｌｏｐｅが「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」サービスをエクスポートすることを宣言している。例えば、ＲｅｐｏｒｔＥｎｖｅｌｏｐｅクラスのオブジェクトがＣｏｎｓｕｍｅｒクラスのオブジェクトと接続されている場合、ＣｏｎｓｕｍｅｒオブジェクトはＲｅｐｏｒｔＥｎｖｅｌｏｐｅオブジェクトからレポートを得ることができる。
【００３１】
この例では、コンパイルされているかまたは事前コンパイルされているかにかかわらず、クラス自体が参照されて、特定のオブジェクトのためのサービスエクスポート及びサービスインポートを判断することができる。別の実施形態では、オブジェクトは、コンポーネント領域論理が様々なオブジェクトにサービスインポートの識別及びサービスエクスポートの識別を要求するために用いることができるインタフェースを提供してもよい。
【００３２】
コンポーネント領域マネージャ２２０の様々なメカニズム２２２−２２９が、ここで詳細に説明される。今度も、これらのメカニズムは、機能によって分類されており、コンポーネント領域マネージャ２２０におけるいかなる実際のオブジェクト境界も表していない。下記のように、様々なメカニズム２２２−２２９のうちのいくつかは、システムで提供される基本的なランタイムによって提供されることが多いインスタンス化メカニズムを用いることもある。インスタンス化メカニズムは、クラス定義を使用する能力を有していて、そのクラスに続くコンポーネントをインスタンス化する。
【００３３】
関連モジュール２２２は、インスタンス化されたコンポーネントをコンポーネント領域２１０に付随させることができる。例えば、図２において、コンポーネント２１１乃至２１６は、コンポーネント領域２１０内に付随して示されており、該コンポーネントはまだインスタンス化されていないが、コンポーネント領域２１０に付随するというような方法で、インスタンス化されるということを表している。コンポーネント領域２１０に付随するコンポーネントは、ランタイムに特定のバインディング処理を受ける。コンポーネント領域とのコンポーネントの関連は、各コンポーネントのインスタンス化の時点で行われてもよいし、または、その後しばらくして行われてもよい。
【００３４】
サービスインベントリメカニズム２２３は、コンポーネント領域に付随するコンポーネントによってエクスポートされたサービス及びインポートされたサービスにインデックスを付ける。サービスインベントリメカニズム２２３は、これらのサービスを発見するためのメカニズムを有することができる。例えば、１つの実施形態において、特定のクラスのコンポーネントがインスタンス化される場合、サービスインベントリメカニズム２２３は、クラス定義にアクセスして、インポートされたサービス（もしくは複数のサービス）またはエクスポートされたサービス（もしくは複数のサービス）を判断することができる。別の実施形態では、コンポーネントは、発見の要求に応じるように構成されていてもよい。例えば、コンポーネントは、アプリケーションプログラムインタフェースを提供することができ、該アプリケーションプログラムインタフェースは、エクスポートしかつインポートするサービス（または複数のサービス）のクエリを行っているエンティティに通知する働きをする。あるいは、コンポーネントは、インスタンス化されると直ちに特定の場所にそのサービスインポート及びサービスエクスポートを書き込むように構成されていてもよい。
【００３５】
例えば、図２を参照すると、サービスインベントリメカニズムは、概念的に以下の表１を維持することができる。
【００３６】
【表１】
0004959003.tif 000004
【００３７】
サービスインベントリメカニズム２２３は、表として情報を表す必要はないが、表は、維持される情報のタイプを読む人に示すために役に立つ説明である。更に、サービスインベントリメカニズム２２３は、特定のコンポーネントによってエクスポートされるサービスまたはインポートされるサービスの全てを知らないかもしれない。
【００３８】
ネストされたコンポーネントの展開メカニズム２２４は、コンポーネント領域のコンポーネントがその中にネストされたコンポーネントを有しているかどうかを判断する。例えば、図４は、図２のコンポーネントのうちの１つ（即ち、コンポーネント２１５）が矢印４１０で表される展開前に、ネストされたコンポーネントの階層を含んでいることを表す。特に、図４のコンポーネント２１５は、展開前に２つのチャイルドコンポーネント４０１及び４０２を含む。これらのチャイルドコンポーネントのうちの１つ符号４０２は、展開前にこれら自身のチャイルドコンポーネント４１１及び４１２を含む。
【００３９】
ネストされたコンポーネントの展開メカニズム２２４は、ネストされたコンポーネントを発見して、該コンポーネントを展開して、ネストされたコンポーネントによってエクスポートされかつインポートされるサービスもバインディングオペレーションに対して表示させられる。例えば、展開４１０の後に、様々なネストされたコンポーネント４０１、４０２、４１１、及び４１２は、バインディングのために表示されるように示されたエクスポートされた該コンポーネントの様々なサービス（コンポーネント４１１について言えばサービスＡ及びＥ）とともに示されている。更に、インポートされた様々なサービス（コンポーネント４０１のためのサービスＡ、コンポーネント４０２のためのサービスＢ及びコンポーネント４１２のためのサービスＣ）がバインディングのために表示されるように示されている。よって、展開後に、これらのネストされたコンポーネントは、サービスインベントリメカニズム２２３によって認識される。
【００４０】
マッチングメカニズム２２５は、コンポーネントをバインディングせよという要求に実際に応ずる。バインディングを行うために、マッチングメカニズム２２５は、一組のマッチングルール２２６に従う。マッチングメカニズム２２５は、マッチングルール２２６に従って、サービスインポートをサービスエクスポートにマッチングさせて、バインディングする。例えば、図３において、コンポーネント領域２１０の様々なコンポーネントは、互いにバインディングされて示されている。
【００４１】
マッチングルールは、デフォルトの潜在的な一組のマッチングルールであってもよい。または、デフォルトのマッチングルールにオーバライディングする他のマッチングルールがあってもよい。例えばデフォルトで、サービスインポートをサービスエクスポートにマッチングさせることは、サービス名の正確なマッチングを見つけることによって行われる場合もある。例えば、上述のクラス定義の例において、クラス「Ｃｏｎｓｕｍｅｒ」は「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」と称されるサービスインポートを有する。一方、クラス「ＲｅｐｏｒｔＥｎｖｅｌｏｐｅ」は、正確に同じ名前「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」によるサービスエクスポートを有する。サービス名の正確なマッチングルールに従って、ＲｅｐｏｒｔＥｎｖｅｌｏｐｅのインスタンスのサービスエクスポートは、Ｃｏｎｓｕｍｅｒのインスタンスのサービスインポートにバインディングすることができる。
【００４２】
しかしながら、他のサービスマッチングルールが適用されてもよい。例えば、いくつかのマッチングルールにおいて無視される場合があるかもしれない。他のルールにおいて、互いにマッチングしているとみなすことができるサービス名のクラスタがあってもよい。例えば、イタリア語のサービス名、フランス語のサービス名などがあってもよく、これらは、各々マッチングしているとみなすことができる。別の一組のマッチングルールによれば、サービスインポートまたはサービスエクスポートが名前で特定されない場合、マッチングメカニズム２２４は、メンバ名、サービスインポートのタイプ及びパラメータ、対抗するメンバ名、サービスエクスポートのタイプ及びパラメータを実際に構造的に判断することができる。
【００４３】
サービスマッチングメカニズム２２５は、また、単に論理的にコンポーネントをマッチングさせないステップを取ることができるが、また、サービスインポート及びサービスエクスポートの実際の機能的なバインディングに少なくとも関係することができる。１つの実施形態において、一旦サービスマッチングメカニズム２２５がマッチングを見つけると、サービスマッチングメカニズム２２５は、サービスをエクスポートしているコンポーネントからの要求されたサービスを得ることができて、サービスをインポートしているコンポーネントにそのサービスを提供することができる。
【００４４】
別の実施形態において、サービスマッチングメカニズム２２５は、サービスをインポートしているコンポーネントにハンドルデータ構造を提供することができる。次にサービスをインポートしているメカニズムは、そのハンドルを用いて、サービスをエクスポートしているメカニズムとのバインディングを完了することができる。サービスマッチングメカニズムによって、サービスをインポートしているメカニズムがマッチングを受け入れるようにするかまたは拒絶できるようにするのは任意である。例えば、マッチングが受け入れられる場合、サービスをインポートしているコンポーネントは、サービスマッチングメカニズムに通知することができ、実際のバインディングが生じることに続く。サービスが受け入れられるとみなされない場合、サービスマッチングメカニズムは、受け入れられるマッチングが見つかってサービスをインポートしているコンポーネントによって受け入れられるまで、予備のマッチングなどを見つける場合がある。
【００４５】
例えば、ハンドルデータ構造は、ファクトリを含むことができ、該ファクトリは、サービスをインポートしているコンポーネントが、そのインポートとマッチングコンポーネントによって提案されたエクスポートとの間のバインディングオペレーションを実行するために用いることができる。ハンドルは、また、メタデータ（以後「選択メタデータ」と称される）を含むことができ、メタデータは、サービスをインポートしているコンポーネントが、バインディングを実行するためにファクトリをトリガするべきか否かを判断するために用いることができる情報を含む。１つの実施形態では、サービスをインポートしているコンポーネントは、選択メタデータを用いないかもしれないが、その代わりに自動的にバインディングを受け入れるファクトリを用いることができる。しかしながら、サービスをインポートしているコンポーネントは、提案されたエクスポートがサービスをインポートしているコンポーネントに受け入れられるかどうかを判断するために代わりに選択メタデータを用いることができる。サービスをインポートしているコンポーネントは、バインディングを受け入れることを選択する場合、サービスをインポートしているコンポーネントは、ファクトリを用いてシステムにバインディングの完了をもたらすことができる。
【００４６】
別の場合では、特定のサービスインポートに対するサービスエクスポートの複数の起こ得るマッチングがあるかもしれない。その場合、ハンドルは、ファクトリ及び潜在的なサービスエクスポートの各々のための選択メタデータを含むことができる。次にサービスをインポートしているコンポーネントは、メタデータを用いて、いずれも選択しないかまたはインポートのためのサービスエクスポートのサブセットを選択することができる場合がある。次にサービスをインポートしているコンポーネントは、選択されたサービスエクスポートの対応するファクトリを用いて、選択されたサービスエクスポートの各々とのバインディングを完了することができる。
【００４７】
例えば、コンシューマコンポーネントは、上記の例におけるように「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」と称されるサービスをインポートすることになっていると仮定する。「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」と称されるサービスを提供する複数のコンポーネントがあった場合、コンシューマコンポーネントは、潜在的なサービスエクスポートのマッチングの各々に対して、ファクトリ及び選択メタデータを与えられてもよい。選択メタデータは、例えば、１）Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔが生成された日付け、及び２）Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔが関係している製品クラスの識別、を含むことができる。コンシューマコンポーネントが、「Ｃｏｎｓｕｍｅｒ  Ｒｅｐｏｒｔ」と称される１つのサービスエクスポートだけに興味があった場合、コンシューマコンポーネントは、選択メタデータを用いて、最近生成されかつコンシューマコンポーネントに最も関連した製品クラスを示すコンシューマレポートサービスのエクスポートを識別することができる。
【００４８】
一部の例では、特定のサービスインポートにマッチングするサービスエクスポートを提供するコンポーネントがコンポーネント領域内にないかもしれない。かかる場合、バインディングはやはり潜在的に行なわれてもよい。バインディングを特定のサービスインポートについて最初に行なうことができない場合を処理する多くの方法がここで説明される。
【００４９】
ある例では、サービスインポートは、「重要性」の特性等に付随してもよく、「重要性」の特性は、サービスインポートが満足する全体的なアプリケーションの機能性に対してどれくらい緊急かについて特定する。重要性が高い場合、サービスエクスポートはどこかで見つけられなければならない。しかしながら、重要性が低い場合、アプリケーションはサービスインポートを全くバインディングすることなしにやっていくことができる場合もある。様々な中間の重要性レベルがあってもよく、これらは、バインディングオペレーションがサービスエクスポートを見つけようとすることになっている範囲まで制御することができる。
【００５０】
１つの実施形態では、特定のサービスインポートのためのサービスエクスポートが、コンポーネント領域内で見つけられない場合、抽出メカニズム２２７が、別のコンポーネント領域から別のコンポーネントを見つける場合もある。従って、単一のコンピュータシステム上で動作しているかまたは、コンピュータシステムがネットワークを介してアクセスできる多くのコンポーネント領域があってもよい。その場合、バインディングされるべきサービスインポートに対応するサービスエクスポートを提供するコンポーネントが見つかるまで、抽出メカニズム２２７は、これらの他のコンポーネント領域を求めてサービスインベントリメカニズム（または場合によってはカタログメカニズム２２８）を調べることができる。１つの実施形態では、抽出メカニズム２２７は、サービスエクスポートを提供するコンポーネントとして、自身をシミュレーションすることができる。よって、サービスインポートは、抽出メカニズム２２７自体にバインディングすることができる。サービスをインポートしているコンポーネントがサービスを求めて抽出メカニズム２２７にコールを行う場合、抽出メカニズム２２７は、その外部コンポーネントとインタフェースして、要求されたサービスを行なうことができる。
【００５１】
１つの実施形態では、コンポーネント領域は、関連するコンポーネント領域の数に付随してもよい。抽出メカニズム２２７は、適当なサービスエクスポートのためのこれらの関連するコンポーネント領域の全てを探し出すことができる。他の実施形態では、抽出メカニズム２２７は、関連するコンポーネント領域のうちのいくつかだけを探し出すことができる。例えば、コンポーネント領域２１０がコンポーネント領域の階層的ツリーのノードであった場合、抽出メカニズム２２７は、横系統のコンポーネント領域を探すよりむしろ、縦系統のノードを表しているコンポーネント領域だけを探すことができる場合もある。よって抽出コンポーネント２２７は、多くの異なるサービスエクスポートのためのサービスエクスポートを抽出することができるとともに、これによってサービスを実行する様々な外部のコンポーネントとのインタフェースに必要な基本的な処理を実行する。
【００５２】
あるいは、または更に、サービスインポートがコンポーネント領域内ですでにインスタンス化されたコンポーネントで満足されない場合、カタログ化メカニズム２２８はカタログ２２９を用いて、特定のサービスエクスポートを提供するそのときインスタンス化されていないコンポーネントを見つけることができる。例えば、カタログ２２９は、様々なクラス定義を含み、各々は、そのクラスのオブジェクトによってエクスポートされるサービスを記述するメタデータを有している。付随するメタデータについての判断に基づいて、カタログメカニズム２２８は、必要とされるサービスエクスポートを提供する特定のクラス定義を見つけることができる。次にカタログ化メカニズム２２８は、コンポーネント領域２１０内でインスタンス化されるべきそのクラスの外部のコンポーネントを選択することができる。あるいは、サービスをインポートしているコンポーネントは、カタログ化されたクラスによってエクスポートされるサービスを記述するメタデータを与えられてもよい。その結果、インポートしているコンポーネントは、エクスポートされたサービスが満足のいくものかどうかに関して自身の判断を行うことができる。これが満足のいくものである場合、サービスをインポートしているコンポーネントは、クラスのコンポーネントをインスタンス化させることができる。例えば、サービスをインポートしているコンポーネントはまた、サービスをエクスポートしているコンポーネントがインスタンス化されるようになるファクトリにアクセスする能力を提供されていてもよい。
【００５３】
図２のコンポーネント領域論理２２０の様々な機能を説明してきたが、ここで様々なプロセスが図５乃至図７に関して説明される。
【００５４】
図５はプログラムのコンポーネントを作成する方法５００のフローチャートを示す。コンポーネント領域を作成した（動作５０１）後に、最初のコンポーネントセットがインスタンス化されて、コンポーネント領域に付随させられる（動作５０２）。例えば、図２を参照すると、コンポーネント領域２１０は、付随するコンポーネント領域論理２２０のうちのいくつかまたは全てを用いて生成されてもよい。コンポーネント領域の最初のコンポーネントセットは、わずか１つであってもよいが、制限なくもっと多くてもよい。図２の例では、コンポーネント領域に６つのコンポーネント２１１乃至２１６がある。しかしながら、最初のコンポーネントセットのコンポーネントの数は、本発明のより上位の原理にとって重要でない。コンポーネント領域においてインスタンス化されなければならない、最初のコンポーネントセットの各コンポーネント及びコンポーネント領域でインスタンス化されるべきいずれかの次のコンポーネントは、コンポーネント領域に付随しており、その結果、コンポーネントのうちのいずれかによってインポートされるサービスがもしあれば当該サービス、及びコンポーネントのうちのいずれかによってエクスポートされるサービスがもしあれば当該サービスが、コンポーネント領域に対して表示される。
【００５５】
このインスタンス化プロセスの中の一部として、ネストされたコンポーネントが展開される（動作５０３）。図６は、コンポーネントのインスタンス化する方法６００のフローチャートを示す。コンポーネント自体は、最初にインスタンス化される（動作６０１）。コンポーネントがいずれかのネストされたコンポーネント（判断ブロック６０２のいいえ）を含まない場合、展開は起こらない。その一方で、ネストされたコンポーネントがある場合（判断ブロック６０２のはい）、これらのネストされたコンポーネントが展開されて（動作６０３）、その結果、ネストされたコンポーネントによってインポートされるサービスがあれば該サービスがコンポーネント領域に表示されかつネストされたコンポーネントによってエクスポートされるサービスがあればサービスがコンポーネント領域に表示される範囲までネストされたコンポーネントもコンポーネント領域に表示される。この展開の例は、図４に関して説明された。１つまたは複数のネストされたコンポーネントを有するコンポーネントがコンポーネント領域にインスタンス化されるときはいつでも、この展開を行なうことができる。あるいはまたは更に、バインディングが繰り返されるたびに、予め定められた時間にコンポーネントが展開されてもよい。例えば、図３では、ネストされたコンポーネントの展開は、各イテレーションの初めに生じる。
【００５６】
図５に戻ると、一旦コンポーネントの全てが展開されると、コンポーネント領域論理は、コンポーネント領域論理がエクスポートされるサービスを求めてコンポーネントにポーリングしようとしていると最初のコンポーネントセットのうちの少なくともいくつかのコンポーネントに通知することは任意である（動作５０４）。コンポーネント領域は、そのサービスエクスポートに関してポーリングされるのに備えてとられるようにプログラムされているいずれかのアクションをとることによって応じることができる。例えば、コンポーネントは、別のコンポーネントをコンポーネント領域にプログラム的にインスタンス化することができる。コンポーネントは、そうでなければサービスエクスポートの要求を受け取るために適当な準備状態に入ることができる。
【００５７】
次に、コンポーネント領域論理は、コンポーネントによって提供されるサービスエクスポートを求めてコンポーネント領域の各コンポーネントにポーリングする（動作５０５）。このリストから、サービスエクスポートデータが策定されてもよい。次に、コンポーネント領域論理は、サービスインポートを求めて各コンポーネントにポーリングすることができて、サービスインポートの各々をサービスエクスポートのリストで満足させることができる（動作５０６）。図７に関して更に詳細に説明されるように、サービスインポートを満足させるサービスエクスポートが見つけられない場合、コンポーネント領域論理は、サービスを提供するクラスを求めてカタログを捜し、適当であれば、カタログ化されたクラスのコンポーネントをインスタンス化させる。
【００５８】
特定のサービスインポートを満足させることができる複数のサービスエクスポートがあり、かつ複数のエクスポートがサービスインポートに受け入れられる場合、サービスエクスポートの全ては、サービスエクスポートの集合としてサービスインポートが利用できるようにされる。サービスインポートが所望するより多くのサービスインポートを満足させることができるサービスエクスポートがある場合もある。例えば、１つのサービスエクスポートだけが所望されるかまたは１つしかサービスエクスポートが所望されないことを示したサービスインポートを満足させることができる複数のサービスエクスポートがある場合がある。あるいは、４つのサービスエクスポートしか所望しないことを示したサービスインポートに対して利用可能な１０個のサービスエクスポートがある場合がある。その場合、これらの場合を処理する方法を識別するためにコンフリクトの解消が用いられる。
【００５９】
サービスインポートが所望するより多くのサービスエクスポートがある場合、１つの任意のコンフリクト解消ステップは単にコンポジションプロセスを失敗させることである。その場合、例外レポートは、コンポジションプロセスを完了できなかった理由に関していくつかのガイダンスを与えることができる。別のオプションは、特定のマッチングの許容性を示すルールを有すること及び、サービスインポートにマッチングされたより多くの受け入れ可能なサービスエクスポート（または複数のサービスエクスポート）を有することであって、その結果適当な数のサービスエクスポートがサービスインポートにバインディングされる。マッチングしているサービスエクスポートがない場合、サービスインポートはまた、中身のないマッチングが受け入れられるか否かを特定することができる。このことは、サービスのインポートによって可能にされる機能の重要性によって決まってもよい。
【００６０】
例えば、図７を参照すると、コンポーネント領域内でコンポーネントを捜すと（動作７０１）、コンポーネント領域内に特定のサービスインポートを満足させるサービスエクスポートが存在するか否かが判断される（判断ブロック７０２）。サービスエクスポートを提供するサービスコンポーネントが見つけられる場合（判断ブロック７０２のはい）、サービスインポートはコンポーネント領域内で見つけられたコンポーネントのサービスエクスポートを用いることで満足している（動作７０３）。
【００６１】
その一方で、特定のサービスインポートを満足させるサービスコンポーネントがコンポーネント領域内で見つけられない場合（判断ブロック７０２のいいえ）、適当なサービスをエクスポートするコンポーネントがコンポーネント領域の外側で見つけられる（動作７０４）。これは、例えば、コンポーネントのクラス及び該コンポーネントのクラスのエクスポートされたサービスの一覧を示しているカタログを参照することによって実現されてもよい。
【００６２】
コンポーネントがコンポーネント領域内でインスタンス化されることになっているか（判断ブロック７０５の「インスタンス化」）またはコンポーネント領域論理によって抽出されることになっているかどうか（判断ブロック７０５の「抽出」）によって、異なる動作をとることができる。
【００６３】
コンポーネントのインスタンス化が生じる場合、見つけられたコンポーネントはコンポーネント領域においてインスタンス化されることになっており（動作７０６）、新しくインスタンス化されたコンポーネントによってエクスポートされるサービスは、コンポーネント領域の前から存在するコンポーネントのサービスインポートにバインディングされる（動作７０７）。抽出が行われることになっている場合、コンポーネント領域論理の抽出メカニズムは、見つけられたコンポーネントによって提供されるサービスエクスポートを抽出することができる（動作７０８）。
【００６４】
図５に戻ると、一旦バインディングの最初のイテレーションが完了すると、様々なコンポーネントは、バインディングイテレーションが完了したことを通知される（動作５０７）。この段階で、コンポーネントは、最初のバインディングに応じて新しいサービスインポートまたはサービスエクスポートを表示させることができる。
【００６５】
この実施形態において、ネストされたコンポーネントの展開が最初に実行され、サービスエクスポートのためのポーリングが次に行われ、サービスインポートのためのポーリング及び各サービスインポートの実現が次に行われる。しかしながら、これらのステップが予め定められた順番で行なわれかつ様々なコンポーネントがその順番について理解している限り、コンポーネントは、所定の順番の中でコンポーネントがある場所に基づいて適当な処置を行うことができる。例えば、上記の例では、コンポーネントはサービスエクスポートのポーリングの前にネストされたコンポーネントを最初に展開することになっていた。更に、サービスは、例えばプログラムで他のコンポーネントをインスタンス化することによって、自身にポーリングの準備をさせる立場にあった。最後に、一旦最初のバインディングが完了したならば、コンポーネントは、イテレーションを繰り返すことができるということを知り、従って、コンポーネントは次のイテレーションのための新しいサービスインポート及び新しいサービスエクスポートを公開する機会を有していた。
【００６６】
図５に戻ると、次に、最後のイテレーションからのバインディングオペレーションによってバインディングオペレーションの別のイテレーションを必要とする何らかの副次的な影響が生じたか否かが判断される（判断ブロック５０８）。例えば、バインディングオペレーションにおいて、新しいコンポーネントは、コンポーネント領域にインスタンス化されてもよい。例えば、コンポーネントは、カタログの中で見つけられてコンポーネント領域にインスタンス化される場合もあった。これらの新しくインスタンス化されたコンポーネントは、該コンポーネント自体サービスインポートを有することができる。更に、コンポーネントがサービスバインディングを有する場合、該コンポーネントは自身が新しいサービスエクスポートを提供することができるということを発見することができ、新しいサービスインポートを公開する必要があるかもしれない。
【００６７】
反復が要求される場合（判断ブロック５０８のはい）、コンポーネント領域論理は、（最初のインスタンス化の間にすでに展開されていないならば）もう一度あらゆる新しくインスタンス化されたコンポーネントのうちのあらゆるネストされたコンポーネントを展開し（動作５０３）、次にそのサービスエクスポートのポーリングが開始されようとしていることをコンポーネントの各々に通知する（動作５０４）。再イテレーションが行なわれるべきであるという判断は、最初のコンポーネントセットがすでにバインディングされた後に行なわれてもよい。例えば、コンポーネントの各々についての再バインディングオペレーションを必要とするプログラムの新しいバージョンを、利用できるようになるかもしれない。
【００６８】
再イテレーションが要求されていない場合（判断ブロック５０８のいいえ）、コンポーネントはバインディングオペレーションが完了したことを通知される（動作５０９）。コンポーネントのこのコンポジションは、コンパイル時にではなく、ランタイムに行なわれ、サービスインポート及びサービスエクスポートの厳密でない識別に基づいていた。これによって、新しいコンポーネントを追加することが可能になり、古いコンポーネントを修正しかつ出荷後の時期にシステムを追加することが可能になる。例えば、新しいコンポーネントが特定のプログラムに利用できるようになるときに、カタログが更新されてもよい。プログラムが次に動作するときに、特定のサービスを提供しているコンポーネントを、例えばプログラムベンダからネットワークを介してなど、遠隔位置から得ることができてもよい。
【００６９】
一部の例では、イテレーションは終了されるかもしれない。例えば、インポートをエクスポートで満足させようとするプロセスにおいて（動作５０６）、いくつかのインポートは、利用できるコンポーネントから成る最新のセットを用いて我慢できるほどに満足させることができないということが発見されてもよい。その場合、該プロセスは終了してもよい。コンピュータシステムは、自動的にまたは場合によってはユーザのヘルプでもしくは場合によってはいくつかのポリシルールに従って、１つまたは複数のコンポーネントを除去することによってかつ／または１つまたは複数のコンポーネントをコンポーネント領域に追加することによって、コンポーネントセットを変更することができる。次に、コンポジションプロセスは、再び再起動されてもよい。コンポジションプロセスの再起動の時点で、いくつかのインポートがいくつかのエクスポートにすでにバインディングされている場合、再バインディングは、別のエクスポートに再バインディングしようと試みることなしにそのバインディングを履行することができることは任意である。あるいは、コンポジションプロセスは、既存のバインディングを尊重せずに再び最初からやり直すかもしれない。これらの２つの手段の間で、既存のバインディングを尊重する様々な異なるレベルがある。
【００７０】
本発明は、その精神または主要な特徴から逸脱することなく、他の特定の形式で具体化することができる。説明された実施形態は、例示的であってかつ限定的でないと、あらゆる点で考慮されなければならない。従って、本発明の範囲は、前述の詳細な説明によってよりはむしろ添付の特許請求の範囲によって示される。特許請求の意義の範囲内及び特許請求の範囲の同等の範囲内で生じる全ての変更は、特許請求の範囲の中で受け入れられることになっている。
【図１】
0004959003.tif 000005
【図２】
0004959003.tif 000006
【図３】
0004959003.tif 000007
【図４】
0004959003.tif 000008
【図５】
0004959003.tif 000009
【図６】
0004959003.tif 000010
【図７】
0004959003.tif 000011