シングルトンは、4D 20 R5の目玉機能のひとつです。以前は、開発者は2種類のシングルトンを利用することができました:
- プロセス・シングルトンは、各プロセスに固有ですが、プロセス間で異なります、
- と、アプリケーション全体でユニークな共有シングルトンです。
4D 20 R7では、新しいタイプのシングルトン、セッション・シングルトンをリリースします!
セッション・シングルトンとは?
セッション・シングルトンは、セッション全体で共有されますが、セッション間で異なります。セッション・シングルートンは、セッション全体で共有されますが、 セッション間では変化します。セッション・シングルートンは、一人のユーザーのリクエストが毎回異なるプロセスで処理されるようなウェブ環境で特に有用です。クライアントサーバー環境では、セッションシングルトンは、サーバー上でユーザーごとに1つのシングルトンを作成することを簡素化し、どのプロセスがそれを使用しているかという心配をなくします。
4Dのセッション
4Dには4種類のセッションがあります:
- クライアントサーバーセッションは、新しいユーザーが4Dリモートに接続するたびに4Dサーバー上に作成されます。
- ウェブセッションは、ユーザーのHTTPリクエストを処理するためにウェブサーバーによって作成されます。
- RESTセッションは、ユーザーのRESTリクエストを処理するためにRESTサーバーによって作成されます。
- ストアドプロシージャセッションは、すべてのストアドプロシージャの実行を処理する4Dサーバーのセッションです。
第5のエッジケースは、セッションが全く存在しない場合に発生します。これは、4D Monoを実行し、Web/RESTリクエストの外部でコードを実行した場合にのみ発生します。
典型的なユースケース:アイテムのインベントリ
セッションのシングルトンは、ショッピングカートや要素のリスト、つまり商品在庫のようなユースケースで輝きます。例えば、各ユーザのインベントリが一意であるようなアイテムインベントリを考えてみましょう:
//class ItemInventory
property itemList : Collection:=[]
session singleton Class constructor()
shared function addItem($item:object)
This.itemList.push($item)
ItemInventoryクラスをセッションシングルートンとして定義することで、全てのセッション、ひいては全てのユーザが独自のItemInventoryを持つことになります。ユーザのItemInventoryにアクセスするのは、他のシングルトンと同様に簡単です:
$myItemInventory:=cs.ItemInventory.me
これは、アプリケーションのどこからでも現在のセッションのItemInventoryを返す。このItemInventoryを、例えばアイテムを追加したり削除したりして変更すると、現在のセッションの、つまり現在のユーザのItemInventoryのみが変更されます。
セッションのシングルトンに関する主な考慮事項
共有クラス:
最も重要なことは、セッション・シングレットンは複数のプロセスで使用されるため、共有クラスであることを理解することです。
共有セッション:
共有セッション(Shared sessions):最後になりましたが、決して重要ではありません:ウェブ接続と REST 接続で同じクッキーを再利用する場合、同じセッション(ウェブセッションから REST セッションに切り替わる)にアクセスすることになり、同じセッションシングレットンになります。
結論
まとめると、セッションシングルトンは、4Dの異なるセッション間でユーザー固有のデータを管理するためのシンプルで効率的な方法を提供します。この新機能は、セッション間のデータを効率的に管理するアプリケーションを構築するための、簡単でスケーラブルなソリューションを提供します。
質問があったり、サポートが必要な場合は、4Dフォーラムで議論に参加してください。