我可以为TWebActionItem或TWebRequest使用类助手吗?

时间:2013-08-14 10:31:34

标签: web-services delphi delphi-xe2

我有大约20多个TWebActionItems以及相关的OnAction事件处理程序:

procedure TWebModuleWebServices.WebModuleWebServicesTTLoginAction(Sender: TObject;
  Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);

在TWebModuleWebServices =类(TWebModule)上。 (注意:发件人是TWebActionItem)

这些处理程序都有一些相同的局部变量,'初始化'和'终结'代码。

我已设法将一些代码移动到TWebModuleWebServices的AfterDispatch和BeforeDispatch处理程序。

如果我想移动更常见的代码,我需要在BeforeDispatch中的(对象)变量中存储数据(并在OnAction处理程序和AfterDispatch中访问这些变量)。

由于AfterDispatch和BeforeDispatch具有与OnAction处理程序相同的Sender: TObject; Request: TWebRequest; Response: TWebResponse;参数,我正在考虑为TWebActionItem或TWebRequest编写类助手。
类助手不允许有数据成员(“方法或属性后不允许使用E2169字段定义”),但有一个trick with class vars/constructors/destructors
在本文中,作者通过使用TDictionary:

来规避类变量是全局的这一事实
TPanelHelper2 = class helper for TPanel
public
  class var
    MetaData: TDictionary<TPanel, string>; //store some strings - an example
  procedure PutData(aData: string);
  function ReadData: string;
  class constructor SetUp;
  class destructor TearDown;
end;

implementation

procedure TPanelHelper2.PutData(aData: string);
begin
  MetaData.AddOrSetValue(Self, aData);
end;

function TPanelHelper2.ReadData: string;
begin
  if MetaData.ContainsKey(Self) then
    Result:=MetaData.Items[Self]
  else
    Result:=''; //or whatever
end;

class constructor TPanelHelper2.SetUp;
begin
  MetaData:=TDictionary<TPanel, string>.Create;
end;

class destructor TPanelHelper2.TearDown;
begin
  MetaData.Free;
end;

要使用此功能,请在表单上放置2个面板,然后:

Panel1.PutData('panel1string');
Panel2.PutData('panel2string');
ShowMessage('Panel 1 metadata: ' + Panel1.ReadData);
ShowMessage('Panel 2 metadata: ' + Panel2.ReadData);

一个很好的技巧,但它让我想知道我是否可以在我的TWebModuleWebServices上执行此操作。我对Delphi(VMT等)的内部工作原理没有足够的了解来回答这些问题:

  1. 这样安全吗?
  2. 是否有更好的方法(班级助手有其缺点,例如Understanding Delphi Class (and Record) Helpers中的 Class Helpers Go和NoGo )?
  3. 修改
    上述问题存在错误:
    由于AfterDispatch和BeforeDispatch具有相同的Sender:TObject;要求:TWebRequest;回复:TWebResponse; OnAction处理程序的参数不正确。
    发件人是AfterDispath / BeforeDispatch的TWebModuleWebservices和OnAction处理程序的TWebActionItem。我要离开它,因为它需要重写一个大问题而且对答案来说并不重要。

2 个答案:

答案 0 :(得分:2)

  

这些处理程序都有一些相同的局部变量

您也可以将这些局部变量简单地转换为Web模块的私有字段。

答案 1 :(得分:0)

这是安全的,但不一定是提出问题的最佳选择。

在你的位置,我会去继承。我将从TWebModule创建一个子类,并添加所有其他TWebModule在此类中具有的所有常规功能。然后我会将其他TWebModules的当前祖先更改为新的。

这种方法的好处是你可以慢慢地,谨慎地采用它。您可以为应用程序创建基本TWebModule,为其添加一些行为,并选择其中一个其他TWebModule来体验继承优势。您可以调整,重新设计和测试您选择的单个TWebModule。

之后,你可以选择另一个和另一个,直到完成所有工作。