【问题标题】:Datasnap and TObject referencesDatasnap 和 TObject 引用
【发布时间】:2012-05-16 09:00:47
【问题描述】:

如何处理datasnap服务器中的对象引用?

我有返回 TUser 对象的 Datasnap 服务器方法

TServerMethods.CurrentUser(const AId: Integer): TUser
begin
  Result := GlobalCurrentUser; // <- Don't want to free this object
  Result.AddReference;
end;

TReferencedObject 子类中的 TUser

TReferencedObject = class(TObject)
private
  FReferenceCnt:     integer;
public
  procedure AddReference; virtual;
  procedure RemoveReference; virtual; // Frees object if reference count goes to 0
  property ReferenceCnt: integer Read FReferenceCnt Write FReferenceCnt;
end;

当前 DataSnap 服务器释放 TUser 对象,但我想为 TReferencedObject 后代调用 RemoveReference。

【问题讨论】:

    标签: delphi delphi-xe2 datasnap


    【解决方案1】:

    我将DataSnap文件Data.DBXJSONReflect.pas和Datasnap.DSReflect.pas复制到项目目录,添加到项目中,做了三处修改。

    Data.DBXJSONReflect 中的两个更改以设置正确的 ReferenceCount

    1) TJSONUnMarshal.CreateObject

      if HasObject(ObjId) then
      begin
        Obj := GetObject(ObjId);
        if Obj is TReferencedObject then {Framework}
          TReferencedObject(Obj).AddReference; {Framework}    
        exit(Obj);
      end
    

    2) TJSONPopulationCustomiser.PostPopulate

      if Data is TReferencedObject then {Framework}
        TReferencedObject(Data).AddReference; {Framework}
    

    Datasnap.DSReflect 中的一个更改以发布参考

    1) TDsMethodValues.ClearReferenceParameters

    FUserObject.Clear 更改为 ClearUserObjects(FUserObjects); 并添加了本地函数

      procedure ClearUserObjects(const AUserObjects: TObjectList<TObject>); {Framework}
      var
        i: Integer;
      begin
        FUserObjects.OwnsObjects := False;
        for i := FUserObjects.Count - 1 downto 0 do
          if FUserObjects.Items[i] is TReferencedObject then
          begin
            TReferencedObject(FUserObjects.Items[i]).RemoveReference;
            FUserObjects.Delete(i);
          end;
        FUserObjects.OwnsObjects := True;
        FUserObjects.Clear;
      end;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2014-10-04
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多