コントラクト、ビュー、およびアダプター
このトピックでは、アドイン パイプラインの両側に共通するセグメントであるビューとアダプター、およびホストとアドインの両方が使用するコントラクトについて説明します。 次の図は、アドイン パイプラインのセグメントを示しています。
アドイン パイプライン
コード例については、「チュートリアル : ホスト変更時の下位互換性の確保」および「チュートリアル : アドインとホスト間でのコレクションの受け渡し」を参照してください。
コントラクト
通信パイプラインの開発の最初のステップは、IContract インターフェイスから派生するコントラクトを定義することです。 ホストとアドインが別個のアプリケーション ドメインに読み込まれる場合、パイプラインのアドイン側とホスト側の間に分離の境界が存在します。 コントラクトはバージョン管理をしないインターフェイスであり、分離の境界を越えて型の通信を行うためのプロトコルを定義します。 コントラクトを使用して分離の境界を越えた通信を行うことによって、アドイン モデルはホストとアドインの型の実装のために、境界を越えたリークによってバージョン管理の問題が発生することがないようにします。
アプリケーション ドメイン間で通信の対象となるオブジェクトはリモート処理可能にする必要があります。 リモート処理可能オブジェクトの詳細については、「Remotable and Nonremotable Objects」を参照してください。
ContractBase クラスは、IContract メンバーの既定の実装を提供します。 コントラクト インターフェイスはこのクラスも継承できます。
コントラクトの必要条件
コントラクト内で表現されるすべての型をタイプ セーフで、バージョン管理可能で、ホストとアドイン間の分離の境界を越えて受け渡し可能にするには、コントラクトは一連の必要条件に従う必要があります。
コントラクトは、IContract から継承されて、以下に示す型のみを使用する必要があります。
IContract から派生する他のコントラクト。
プリミティブ データ型: 整数およびブール型。
コントラクト アセンブリに定義されているシリアル化可能な型。
シールされたシリアル化可能な参照型。 たとえば、String オブジェクトはシールされたシリアル化可能な参照型であるため、このオブジェクトは分離の境界を通して受け渡しできます。
コントラクトまたは Mscorlib.dll 内で定義されている列挙体。
AddInToken オブジェクト
上述の型の配列 (コントラクトの配列を除く)。
オブジェクト コレクションを渡すには、ジェネリック IList<T> インターフェイスを実装する型を使用します (List<T>、ArrayList コレクションなど)。 これらのコレクションを分離の境界を越えて受け渡すには、一時的に IListContract<T> インターフェイスに変換する必要があります。 「チュートリアル : アドインとホスト間でのコレクションの受け渡し」トピックでは、コレクションを渡す方法を示します。
パイプラインを構築するには、アドインを表すコントラクトを AddInContractAttribute 属性で識別する必要があります。
パイプラインの開発の次のステップは、パイプラインの両側のビューとアダプター セグメントの作成です。 これらのセグメントは、ホスト アプリケーションとアドインにそれぞれのオブジェクト モデルのビューを提供し、それらのビューとコントラクトとの間の変換を行うアダプターを提供します。
ビュー
ホストのアドイン ビューとアドインのホスト ビューは、インターフェイスまたは抽象クラスが入ったアセンブリです。インターフェイスまたは抽象クラスは、相互のビュー、およびそれらの間でやり取りされる型のビューを表します。 ビューは、相互の通信に使用されるコントラクトに依存しません。 さらに、ビューはアドインとホストを相互の実装から分離します。 これにより、ホストまたはアドインに影響を与えずにアダプターとコントラクトを変更できます。
パイプラインを構築するために、アドインが実装または継承するアドイン ビュー内の型は AddInBaseAttribute 属性によって識別され、アドイン ベースと呼ばれます。 ホスト ビューは FindAddIns メソッドに渡されるため、ホスト ビューには検出のための属性は必要ありません。
アダプター
アドイン側アダプターとホスト側アダプターは、ビューとコントラクトの間の変換に使用されるアダプター クラスを含むアセンブリです。 "側" という用語は、アダプターが存在するパイプラインの側を指します。 呼び出しの方向に応じて、アダプターはビューからコントラクトへ、またはコントラクトからビューへの変換を行います。 両方向の呼び出しがある、つまり、ホストがアドインへの呼び出しを行い、アドインがホストへの呼び出しを行う場合、パイプラインのそれぞれの側に 2 つのアダプターがあることになります。 この結果、アダプターには次の 2 種類があります。
ビューからコントラクトへのアダプター
ビューをコントラクトに変換するアダプター アセンブリのクラス。 このクラスはコンストラクターに渡されるビューを呼び出すことによってコントラクトを実装し、境界を越えてコントラクトとしてマーシャリングされます。 このクラスは、ContractBase を継承し、コントラクトを実装する必要があります。
コントラクトからビューへのアダプター
コントラクトをビューに変換するアダプター アセンブリのクラス。 このクラスは、ビューがインターフェイスと抽象基本型のどちらであるかに応じて、変換するビュー セグメントを実装または継承し、アダプターのコンストラクターに渡されるコントラクトを呼び出すことによってビューのメンバーを実装します。
パイプラインを構築するには、AddInAdapterAttribute 属性を適用することによってアドイン側アダプター クラスを識別し、HostAdapterAttribute 属性を適用することによってホスト側アダプター クラスを識別する必要があります。
アダプターはパブリックである必要はありません。