ゲートウェイのアーキテクチャ
.NET 用 Caché Object Gateway (このドキュメントでは単に “.NET ゲートウェイ” と呼びます) を使用すると、Caché と Microsoft .NET Framework コンポーネントとの間で容易に相互運用が実現します。.NET ゲートウェイは、外部の .NET オブジェクトをインスタンス化し、Caché 内のネイティブ・オブジェクトのように操作できます。
.NET ゲートウェイ は、EnsembleOpens in a new tab プロダクションでも使用できます (Ensemble のドキュメント ".NET 用 Object Gateway の使用法" を参照)。このドキュメントの説明のとおり、Caché で .NET ゲートウェイ・クラスを作成してテストした後、Ensemble .NET ゲートウェイ・ビジネス・サービスを使用して、これらのクラスをプロダクションに追加できます。
プロキシ・クラスの使用法
外部 .NET オブジェクトは、Caché 内で、プロキシ・クラスによって表されます。プロキシ・オブジェクトの外観および動作は、他の Caché オブジェクトと同様ですが、プロキシ・オブジェクトは、TCP/IP 接続でローカルまたはリモートで .NET の Common Language Runtime (CLR) に対してメソッド呼び出しを発行できます。Caché プロキシ・オブジェクト上でメソッド呼び出しがあると、CLR 内の .NET オブジェクトの対応するメソッドがトリガされます。
以下の図に、Caché と .NET ゲートウェイの実行時の概念を示します。
.NET ゲートウェイ・サーバのインスタンスは CLR 内で実行されます。Caché と CLR は同じマシンでも、異なるマシンでも実行できます。図 .NET ゲートウェイのオペレーショナル・モデル にある番号付きの項目は、以下の関係を示します。
-
Caché のネームスペースは、.NET ゲートウェイ・サーバのインスタンスにアクセスします。アクセスは、Caché の %Net.Remote.ServiceOpens in a new tab クラスのインスタンスによって制御されます。
-
各Caché セッションは、ゲートウェイ・サーバ内の別のスレッドに接続されます。この接続は、Caché の %Net.Remote.GatewayOpens in a new tab クラスのインスタンスによって制御されます。
-
各プロキシ・オブジェクトは、対応する .NET オブジェクトと通信します。
あらゆる Caché プロキシ・メソッドの呼び出しにより、以下の一連のイベントが開始されます。
-
Caché は、TCP/IP 接続を介して .NET ゲートウェイ・ワーカ・スレッドにメッセージを送信します。メッセージには、メソッド名、パラメータのほか、その他の情報が含まれることもあります。
-
.NET ゲートウェイ・ワーカ・スレッドは、適切なメソッドまたはコンストラクタの呼び出しを検索し、.NET リフレクションを使用して呼び出します。
-
メソッド呼び出しに結果が存在する場合は、同じ TCP/IP チャネルを使用して Caché プロキシ・オブジェクトに返されます。プロキシ・メソッドは、この結果を Caché アプリケーションに返します。
Caché Basic または ObjectScript で記述したコードを持つプロキシ・クラスにアクセスできます。このドキュメントの例では ObjectScript を使用しています。
.NET API を使用したラッパ・クラスの使用法
ほとんどの場合、カスタムの .NET コンポーネント用にプロキシ・クラスを作成して .NET ゲートウェイを使用します (詳細は、“プロキシ・クラスの作成” の章を参照)。ただし、サードパーティの .NET アプリケーション・インタフェース仕様全体にプロキシ・マッピングを作成することもできます。
非常に大きい API (ADO、Remoting、ASP.Net など) 用にマッピングを作成し、任意の数のアプリケーションで再利用できるようにしたいと思うかもしれませんが、これはお勧めしません。このようなマッピングは、数百のプロキシ・クラスを作成できますが、ご使用のアプリケーションで必要なのはその中のわずかです。プロキシ・ジェネレータでマップしないクラスのリストを指定できますが、非常に大きな除外リストを作成して管理するのは困難です。
サードパーティの DLL をアプリケーションで使用する場合、最適な手法は、これに小さなラッパ・クラスを作成し、このラッパ用のプロキシを作成することです。ラッパ・クラスは、必要な機能のみを公開します。その結果、Caché と .NET フレームワークの間のインタフェースが非常にすっきりし、多くの潜在的な問題が除去されます。ラッパ・クラスで実現するメリットは以下のとおりです。
-
プロキシ・クラスの数が少なくなる — 大きな .NET DLL を直接インポートすると、数百のプロキシ・クラスが生成されることがあります。アプリケーションで実際に必要なのは、これらのクラスのうちわずかである場合があります。インポートの除外リストを調査して定義するには、非常に多くの作業が必要になることがあります。インポートして管理するクラスを最少に抑えるには、ラッパを定義することがはるかに簡単な方法です。
-
依存に関する問題が減少する — インポートされた DLL は、正常にコンパイルするためには外部クラスに依存する場合があります。これらのクラスを格納するファイルおよびディレクトリは、プロキシ・ジェネレータを実行するときに包含リストで指定できますが、これを行うと、不要なプロキシ・クラスがさらに多く生成されます。ラッパを使用すると、依存ファイルおよびそのクラスは、インポートを行うプログラムから見えなくなり、包含リストと除外リストが不要になります。
-
パフォーマンスの向上 — ラッパを使用すると、DLL に対して行う呼び出し数を減らすことができる可能性があります。例えば、インポートされた DLL に、一度に 1 バイトを読み取る readByte() メソッドを備えたクラスがあるとします。このクラスを直接インポートすると、このメソッドを呼び出すたびに別の DLL 呼び出しが必要になります。.NET 内で内部的に readByte() メソッドを繰り返し呼び出す readManyBytes() メソッドを備えたラッパ・クラスを定義すると、効率が大幅に上がります。
-
従来の DLL を使用できる — ActiveX DLL は、64 ビット Windows 環境では直接使用できません。また、.NET アセンブリとして書き込まれなかった DLL は、32 ビット 環境でも .NET ゲートウェイで使用できません。ただし、DLL を間接的に呼び出すために、.NET ゲートウェイが使用できるラッパを作成することは可能です。
ゲートウェイ・サーバの作成および実行
.NET ゲートウェイを使用するには、その前に .NET ゲートウェイ・サーバのインスタンスを起動し、このサーバが稼動しているホスト名を Caché に通知する必要があります。起動したサーバは、明示的にシャットダウンするまで稼動します。
.NET ゲートウェイ・サーバが起動した後、.NET クラス・メソッドを呼び出す必要がある Caché セッションはそれぞれ、以下の図に示すようにサーバとの専用の接続を作成する必要があります。
-
Caché Basic または ObjectScript のコードで接続要求を送信します。
-
.NET ゲートウェイ・サーバは、この要求を受信するとワーカ・スレッドを開始します。このスレッドで .NET クラスのメソッドが続いて実行されます。
-
この .NET ゲートウェイ・ワーカ・スレッドと対応する Caché セッションとの間の接続は、明示的に切断されるまで、確立した状態に維持されます。接続が維持されている限り、接続に割り当てられたポートは “使用中” のままになり、他の接続では使用できません。
.NET ゲートウェイ・サーバのプロパティ定義の作成方法に関する詳細は、"ゲートウェイ・サーバのプロパティ設定" を参照してください。サーバを起動、接続、切断、および停止する方法の詳細は、"ゲートウェイ・サーバの実行" を参照してください。
プロキシ・クラスのインポート
Caché プロキシ・クラスは、クエリを .NET ゲートウェイ・サーバに送信することにより生成されます。.NET ゲートウェイ・サーバは、プロキシ・クラスを必要とするメソッドに関する情報を返します。その後、インポートされるメソッドの情報は、以下の図に示すようにプロキシ・クラスの構築に使用されます。
-
Caché セッションがインポート要求を送信します。
-
要求を受信した .NET ゲートウェイ・ワーカ・スレッドは、.NET の指定されたアセンブリおよびクラスをイントロスペクトします。
-
また、このスレッドは、ローカル・ディレクトリまたはグローバル・アセンブリ・キャッシュ (GAC) から、依存アセンブリをロードします。
-
新しい .NET クラス、変更された .NET クラス、または Caché 側にプロキシ・クラスがない .NET クラスが見つかると、.NET ゲートウェイ・ワーカ・スレッドは、Caché セッションへのイントロスペクションの結果を返し、この情報を使用して新しいプロキシ・クラスを生成します。
プロキシ・クラスを生成する方法の詳細は、"プロキシ・クラスの作成" を参照してください。
.NET ゲートウェイ API
以下のクラスには、Caché .NET ゲートウェイ・アプリケーションで使用されるほとんどの機能が用意されています。
-
%Net.Remote.ObjectGatewayOpens in a new tab — ObjectGateway オブジェクトには、.NET ゲートウェイ・サーバのインスタンスの実行および監視に必要なプロパティ設定が含まれています。詳細は、"ゲートウェイ・サーバの定義" を参照してください。
-
%Net.Remote.ServiceOpens in a new tab — Service オブジェクトは、Caché のネームスペースと .NET ゲートウェイ・サーバのインスタンスの間のインタフェースを制御します。詳細は、"ゲートウェイ・サーバの実行" を参照してください。
-
%Net.Remote.GatewayOpens in a new tab — Gateway オブジェクトは、Caché セッションと .NET ゲートウェイ・サーバのインスタンス内のワーカ・スレッドの間の接続を制御し、プロキシ・クラスを生成するメソッドを提供します。詳細は、"サーバへの接続" および "プログラムによるプロキシ・クラスの生成" を参照してください。
-
%Net.Remote.ImportHelperOpens in a new tab — ImportHelper クラスは、アセンブリの検査およびプロキシ・クラスの生成に使用する追加のクラス・メソッドを提供します。詳細は、"Caché プロキシ・クラスの生成" を参照してください。
これらの各クラスに関する最新情報の詳細は、Caché クラス・ライブラリ・ドキュメントを参照してください。