2013-02-27 88 views
1

我正在使用HTTP服務器,我正在使用Indy的TIdHTTPWebBrokerBridgeTWebModule。我將所有服務器功能封裝到單個組件中,其中包括Indy Server組件及其相應的Web模塊。但是,我遇到了一些問題,想知道如何讓Web模塊知道它被調用的組件。如何讓Web模塊知道它從何處被調用的所有者?

假設我有這個組件:

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

implementation 

uses 
    MyWebModule; 

我只知道我必須通過設置請求處理程序初始化這一點,我已經通過添加initialization節本單位的照顧它:

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

然後,我有在一個單獨的單元中的Web模塊類:

uses 
    MyWebServer; 

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

請注意我在此Web模塊FOwner: TMyComponent中的私人字段。這是我無法找出去哪裏的地方。我該如何將其分配給適當的所有者? Web模塊是由Indy HTTP Server自動創建和管理的,據我所知,我沒有任何控制來設置這樣的事情。

我需要訪問其所有者的原因是因爲我在那裏設置了Web模塊需要能夠讀取的屬性。例如,我的組件中有一個屬性是RootDir,它是讀取/寫入文件的根目錄。我需要能夠從Web模塊中讀取此屬性。

如何讓Web模塊能夠讀取其所有者組件的屬性?或者一般情況下,我怎樣才能將這個專用字段FOwner分配給我的組件實例?

+0

爲什麼知道是誰叫它很重要?這些信息在做什麼?我傾向於遵循咒語調用者可以知道它所調用的很多內容,但被調用者應該永遠不需要知道誰在調用它。有助於保持東西分離。 – 2013-02-27 07:00:16

+0

聽起來像一個問題,你不能有,如果你使用http://xxm.sf.net/ – 2013-02-27 09:55:20

+0

@Marjan我通常保持東西分離,但在這種情況下Web模塊應該知道其設置?由於它全部包裝在此組件中,並且組件的屬性是主要存儲此信息的位置,因此Web模塊還可以知道這些設置?我相信下面的答案是這種情況的唯一合法解決方案。在我的情況下,這兩個單元彼此直接相關,所以它們不需要分離,它們是爲了彼此。 – 2013-02-27 15:42:20

回答

0

我發現我的答案一會兒問這個問題

,因爲它是不建議創建TIdHTTPWebBrokerBridge多個實例後,你不一定需要擔心的TMyComponent多個不同實例的存在。但是,您需要執行自己的檢查以確保首先不存在多個實例。但是因爲你只有這個組件的一個實例,所以你可以放心地在你的組件單元中聲明一個全局變量並將它暴露給你的Web模塊。

不要直接在您的單位的interface中聲明全局var變量。相反,你應該保護這...

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. 
+0

在一個側面說明,也不建議以這種方式將這個Indy組件包裝在一個組件中,但我仍然這樣做。另一個解決方案是根本不公開組件,私有,並添加'InitMyServer'和'UnInitMyServer'程序。 – 2013-02-27 01:00:04

相關問題