1

我正在使用 HTTP 服务器,并且正在使用 IndyTIdHTTPWebBrokerBridgeTWebModule. 我将所有服务器功能封装到一个组件中,这包括 Indy 服务器组件及其相应的 Web 模块。但是,我在弄清楚如何让 Web 模块知道调用它的组件时遇到了一些问题。

假设我有这个组件:

type
  TMyComponent = class(TComponent)
  private
    FServer: TIdHTTPWebBrokerBridge;
  end;

implementation

uses
  MyWebModule;

我知道我必须通过设置请求处理程序来初始化它,我已经通过向initialization这个单元添加一个部分来处理它:

initialization
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass:= WebModuleClass;

然后我将 Web Module 类放在一个单独的单元中:

uses
  MyWebServer;

type
  TMyWebModule = class(TWebModule)
  private
    FOwner: TMyComponent;
  end;

请注意我在此 Web 模块中的私有字段FOwner: TMyComponent。这是我无法确定去哪里的地方。如何将其分配给适当的所有者?Web Module 是由 Indy HTTP Server 自动创建和管理的,据我所知,我没有任何控制权来设置这样的东西。

我需要访问其所有者的原因是因为我在那里设置了 Web 模块需要能够读取的属性。例如,我在我的组件上拥有的一个属性RootDir是一个根目录,可以在其中读取/写入文件。我需要能够从 Web 模块中读取此属性。

如何使 Web 模块能够读取其所有者组件的属性?或者一般来说,我如何将这个私有字段分配给FOwner我的组件实例,从它被实例化的地方?

4

1 回答 1

0

在问了这个问题后我发现了我的答案

由于不建议创建 的多个实例TIdHTTPWebBrokerBridge,因此您不必担心存在多个不同的TMyComponent. 但是,您确实需要执行自己的检查以确保首先不存在多个实例。但是由于您只有一个该组件的实例,因此您可以放心地在组件的单​​元中声明一个全局变量并将其公开给您的 Web 模块。

不要直接在你的单元中声明一个全局var变量。interface相反,你应该保护这个......

function MyComponent: TMyComponent;

implementation

uses
  MyWebModule;

var
  _MyComponent: TMyComponent;

function MyComponent: TMyComponent;
begin
  Result:= _MyComponent;
end;

constructor TMyComponent.Create(AOwner: TComponent);
begin
  inherited;
  _MyComponent:= Self;
end;

destructor TMyComponent.Destroy;
begin
  _MyComponent:= nil;
  inherited;
end;

initialization
  _MyComponent:= nil;
  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass:= WebModuleClass;
end.
于 2013-02-27T00:49:15.290 回答