我正在使用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
分配给实例化组件的实例?
答案 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.