.NET 逆プロキシ・オブジェクトの使用法
.NET Native SDK は .NET 外部サーバ接続を最大限に活用して、InterSystems IRIS と .NET アプリケーション間の完全に透過的な双方向接続を可能にします。
逆プロキシ・オブジェクトは、外部サーバ・ゲートウェイ接続を介して ObjectScript ターゲット・オブジェクトを制御するための .NET オブジェクトです。逆プロキシ・オブジェクトを使用してターゲットのメソッドを呼び出して、ターゲットのプロパティ値を取得または設定し、ネイティブの .NET オブジェクトのように簡単にターゲット・オブジェクトを操作できます。
このセクションでは、以下のトピックについて説明します。
外部サーバの概要
外部サーバ接続によって、InterSystems IRIS ターゲット・オブジェクトと .NET オブジェクトは同じ接続を使用して、同じコンテキスト (データベース、セッション、トランザクション) で自由に相互作用することができます。外部サーバのアーキテクチャについては "InterSystems 外部サーバの使用法" で詳しく説明していますが、ここでは、外部サーバ接続を、一方の側のプロキシ・オブジェクトがもう一方の側のターゲット・オブジェクトを制御できる単純なブラック・ボックスとして考えることができます。
外部サーバ接続
図に示すように、フォワード・プロキシ・オブジェクトは .NET オブジェクトを制御する ObjectScript プロキシです (詳細は、"InterSystems 外部サーバの使用法" の “外部言語の操作” を参照)。.NET 逆プロキシは反対方向に動作し、.NET アプリケーションが InterSystems IRIS ターゲット・オブジェクトを制御できるようにします。
逆プロキシ・オブジェクトの作成
逆プロキシ・オブジェクトを作成するには、ObjectScript クラス・インスタンスの OREF を取得して (通常は、クラスの %New() メソッドを呼び出して)、IRISObject にキャストします (詳細は、“ObjectScript メソッドおよび関数の呼び出し” を参照)。以下のメソッドを使用して、逆プロキシ・オブジェクトを生成できます。
%New() メソッドが新しいターゲット・インスタンスを正常に作成すると、そのインスタンスの逆プロキシ・オブジェクトが生成されます。例えば、以下の呼び出しによって、ObjectScript クラス Demo.Test のインスタンスを制御する、test という逆プロキシ・オブジェクトが作成されます。
IRISObject test = (IRISObject)iris.ClassMethodObject("Demo.Test","%New");
-
ClassMethodObject() は、Demo.Test という ObjectScript クラスの %New() メソッドを呼び出して、そのクラスの新しいターゲット・インスタンスを作成します。
-
%New() への呼び出しでクラスの有効なインスタンスが返された場合、新しいインスタンスの逆プロキシが生成され、classMethodObject() はそれを Object として返します。
-
.NET では、Object は IRISObject にキャストされ、逆プロキシ変数 test が作成されます。
変数 test は、Demo.Test の新しいターゲット・インスタンスの .NET 逆プロキシ・オブジェクトです。以下のセクションでは、test を使用して Demo.Test ターゲット・インスタンスのメソッドとプロパティにアクセスします。
ターゲット・オブジェクトの制御
逆プロキシ・オブジェクトは IRISObject のインスタンスです。ターゲット・インスタンス・メソッドを呼び出すメソッド Invoke() と InvokeVoid()、およびターゲットのプロパティの読み取りと書き込みを行うアクセサ Get() と Set() を提供します。このセクションの例では、逆プロキシを使用して、ObjectScript クラス Demo.Test のターゲット・インスタンスを制御します。このクラスには、メソッド initialize() と add()、およびプロパティ name の宣言が含まれています。
ObjectScript クラス Demo.Test のメソッドとプロパティの宣言
Class Demo.Test Extends %Persistent
Method initialize(initialVal As %String)
Method add(val1 As %Integer, val2 As %Integer) As %Integer
Property name As %String
以下の例では、最初の行で Demo.Test の新規インスタンスの test という名前の逆プロキシ・オブジェクトを作成します (前のセクションの説明を参照)。残りのコードでは、test を使用して Demo.Test ターゲット・インスタンスを制御します。
逆プロキシ・オブジェクトによる Demo.Test のインスタンスの制御
// Create an instance of Demo.Test and return a proxy object for it
IRISObject test = (IRISObject)iris.ClassMethodObject("Demo.Test","%New");
// instance method test.initialize() is called with one argument, returning nothing.
test.InvokeVoid("initialize", "Test One");
// instance method test.add() is called with two arguments, returning an int value.
int sum = test.Invoke("add",2,3); // adds 2 plus 3, returning 5
// The value of property test.name is set and then returned.
test.Set("name", "Einstein, Albert"); // sets the property to "Einstein, Albert"
String name = test.Get("name"); // returns the new property value
この例では、以下の IRISObject メソッドを使用して、Demo.Test インスタンスのメソッドとプロパティにアクセスしました。
-
ClassMethodObject() は、Demo.Test クラス・メソッド %New() を呼び出します。このメソッドは Demo.Test のインスタンスを作成し、test という名前の IRISObject プロキシを返します (“リバース・プロキシ・オブジェクトの作成” で前述しています)。
-
InvokeVoid() は、initialize() インスタンス・メソッドを呼び出します。このメソッドは、内部変数を初期化しますが、値は返しません。
-
Invoke() は、add() インスタンス・メソッドを起動します。このメソッドは、2 つの整数の引数を受け入れて、合計を整数として返します。
-
Set() は、name プロパティを新しい値に設定します。
-
Get() は、name プロパティの値を返します。
また、これらのメソッドのデータ型固有のバージョンもありますが、これらについては以下のセクションで説明します。
IRISObject のサポートされているデータ型
前のセクションの例では、汎用の Set()、Get()、および Invoke() メソッドを使用しましたが、IRISObject クラスでサポートされるデータ型用にデータ型固有のメソッドも提供します。
IRISObject set() および get() メソッド