【发布时间】:2014-09-05 14:54:16
【问题描述】:
使用德尔福 XE6 / XE7
我有一个带有两个服务器模块的 DataSnap 独立服务器。
第一个服务器模块有“会话”生命周期:
object DSServerSession: TDSServerClass
OnGetClass = DSServerSessionGetClass
Server = DSServer1
LifeCycle = 'Session'
end
procedure TServerContainer1.DSServerSessionGetClass(
DSServerClass: TDSServerClass; var PersistentClass: TPersistentClass);
begin
PersistentClass := uSM.TSM;
end;
第二个服务器模块有“服务器”生命周期:
object DSServerGlobal: TDSServerClass
OnGetClass = DSServerGlobalGetClass
Server = DSServer1
LifeCycle = 'Server'
end
procedure TServerContainer1.GlobalGetClass(DSServerClass: TDSServerClass;
var PersistentClass: TPersistentClass);
begin
PersistentClass := uSMGlobal.TSMGlobal;
end;
然后,客户端应用程序可以访问服务器模块上的全局对象(如用户控制功能),同时使用会话服务器模块向数据库发出请求。在应用程序的客户端,我使用 SQLConnection 和 TDSProviderConnection。
我的问题是,从同一服务器上的会话服务器模块访问全局服务器模块(生命周期 = 会话)的最佳方式是什么?请注意,我们没有对模块的全局引用(变量),例如使用 DataModules 的客户端/服务器应用程序。最重要的是,我需要确保客户端应用程序和会话服务器模块都使用相同的全局服务器模块实例。
【问题讨论】:
-
我只会使用 1 个具有生命周期 = 会话的服务器模块。然后使用您的全局函数创建一个不同的数据模块类。然后创建一个对此数据模块的静态引用。在客户端第一次连接时创建它。