如何使Web模块知道所在的所有者?

时间:2013-02-27 00:13:17

标签: delphi delphi-xe2 indy indy10 httpserver

我正在使用HTTP服务器而我正在使用带有TIdHTTPWebBrokerBridge的Indy TWebModule。我将所有服务器功能封装到一个组件中,这包括Indy Server组件及其相应的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;

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

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

如何让Web模块能够读取其所有者组件的属性?或者一般来说,如何将此私有字段FOwner分配给实例化组件的实例?

1 个答案:

答案 0 :(得分:0)

在提出这个问题后我发现了一段时间

由于不建议创建TIdHTTPWebBrokerBridge的多个实例,因此您不一定需要担心TMyComponent的多个不同实例的存在。但是,您需要执行自己的检查以确保首先不存在多个实例。但是,由于您只有一个此Component的实例,因此您可以放心地在组件的单​​元中声明一个全局变量并将其暴露给您的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.