クライアントサーバーモードでは、サーバー上でホストされているリソースがロジックの実行に必要なことがよくあります。これまで、サーバー上でコードを実行するには、専用のプロジェクトメソッドや ORDAデータモデル関数を記述するのが一般的でした。
これにより、必ずしも必要とは言えない大量のプロジェクトメソッドや ORDAデータモデル関数が大量に生成されてしまう原因になっていました。
4D 21 R3 では、一部のシングルトンにおいて、 関数をサーバー上で実行できるようになりました。
コードの構成を改善する方法について、ぜひ読み進めてください!
デスクトップアプリケーションでは、接続中の 4Dクライアントすべてに共有されるデータを読み取ったり更新したりするため、コードの一部はサーバー上で実行する必要があります。たとえば、接続中のクライアント間でメモリ内のデータを共有するために、現在はサーバー上の Storage を使用しているかもしれません。
また、ロジックによっては、サーバーでホストされるリソース(データのクエリなど)が必要になる場合もあります。
サーバー上でコードを実行するために、以前は次の方法が使用されていました:
- “サーバー上で実行” プロパティを有効にしたプロジェクトメソッド
- “Execute on server” コマンド
- ORDAデータモデル関数(デフォルトでサーバー上で実行されます)
4D 21 R3からは、一部のシングルトンに、 常にサーバー上で実行される関数を含めることができるようになりました。
共有およびセッションシングルトンにおける server キーワード
共有およびセッションシングルトンの関数が、server キーワードをサポートするようになりました。
この server キーワードを使用して関数を宣言すると、そのシングルトンが 4Dクライアント上でインスタンス化されている場合でも、その関数は常にサーバー上で実行されます。
例題
以下の例では、Administration 共有シングルトンが Process activity() コマンドを実行する server 関数を定義しています。
このシングルトンは 4Dクライアント上でインスタンス化され、そこから関数が呼び出されます。そして、サーバーからアクティビティ(プロセスおよびセッション)を返します。
Administration 共有シングルトン:
shared singleton Class constructor
// この関数はサーバー上で実行されます
server Function processActivity() : Object
return Process activity()
// この関数はローカル(クライアント側)で実行されます
Function localProcessActivity() : Object
return Process activity()
4Dクライアント上で実行されるコード:
var $localActivity; $serverActivity : Object
var $administration : cs.Administration
ASSERT(Application type()=4D Remote mode)
// Administration シングルトンが 4Dクライアント上でインスタンス化されます
$administration:=cs.Administration.me
// 4Dクライアント上で実行されているプロセスを取得します
$localActivity:=$administration.localProcessActivity()
ASSERT($localActivity.sessions=Null)
// 4D Server 上で実行されているプロセスとセッションを取得します
$serverActivity:=$administration.processActivity()
ASSERT($serverActivity.sessions.length>=1)
セッションシングルトンのさらなる活用
この文脈において、セッションシングルトンは大きな利点を提供します。セッションシングルトンは、セッション内のすべてのプロセスに対して一意の共有インスタンスを持ちます。
セッションシングルトンがサーバー上でロジックを実行できるようになれば、効果的に Session コマンドの機能を拡張できます。
例題
ユーザー情報を Usersテーブルに格納し、カスタム認証を実装する場合、この目的でセッションシングルトンを使用できます。
以下の例では、UserSessionセッションシングルトンが、サーバー上で実行される checkUser() 関数を持っています。ユーザーID は、セッションの storage 共有オブジェクトに保存されます。
server Function checkUser($credentials : Object) : Boolean
var $user : cs.UsersEntity
var $result:=False
If ($credentials#Null)
$user:=ds.Users.query("Email === :1"; $credentials.identifier).first()
If (($user#Null) && (Verify password hash($credentials.password; $user.Password)))
Use (Session.storage)
Session.storage.userInfo:=New shared object("userId"; $user.ID)
End use
$result:=True
End if
End if
return $result
すべての 4Dクライアントに現在のユーザー情報を提供するために、セッションシングルトンは、サーバーから取得した user 計算プロパティを公開します。
session singleton Class constructor()
server Function get user() : cs.UsersEntity
return ds.Users.get(Session.storage.userInfo.userId)
添付の HDI を実行して、具体的な例題を確認してください。次のステップは、関連するロジックを適切なクラスに配置してコードを整理することです。そして…4Dセッションの活用を今すぐ始めてみましょう!
現在、この投稿へのコメント機能は利用できません。