1

私はHTTPサーバーで作業しており、Indyをで使用TIdHTTPWebBrokerBridgeしていTWebModuleます。すべてのサーバー機能を単一のコンポーネントにカプセル化しています。これには、Indyサーバーコンポーネントとそれに対応するWebモジュールが含まれます。ただし、Webモジュールにそれが呼び出されたコンポーネントを認識させる方法を理解するのにいくつかの問題があります。

私がこのコンポーネントを持っていると仮定します:

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

implementation

uses
  MyWebModule;

リクエストハンドラーを設定してこれを初期化する必要があることはわかっています。initializationこのユニットにセクションを追加することで、これを処理しました。

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

次に、別のユニットにWebModuleクラスがあります。

uses
  MyWebServer;

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

このWebモジュールにあるプライベートフィールドに注意してくださいFOwner: TMyComponent。これは私がどこに行くべきかを理解するのに苦労しているところです。これを適切な所有者に割り当てるにはどうすればよいですか?WebモジュールはIndyHTTPサーバーによって自動的に作成および管理されるため、私が知る限り、そのような設定を行うための制御はありません。

その所有者にアクセスする必要がある理由は、Webモジュールが読み取ることができる必要があるプロパティが設定されているためです。たとえば、コンポーネントにあるプロパティの1つRootDirは、ファイルの読み取り/書き込みを行うルートディレクトリです。Webモジュール内からこのプロパティを読み取れるようにする必要があります。

Webモジュールがその所有者コンポーネントのプロパティを読み取れるようにするにはどうすればよいですか?FOwnerまたは、一般的に、このプライベートフィールドを、インスタンス化された場所からコンポーネントのインスタンスに割り当てるにはどうすればよいですか?

4

1 に答える 1

0

この質問をした後、しばらくして自分の答えを見つけました

の複数のインスタンスを作成することはお勧めしませTIdHTTPWebBrokerBridgeんので、の複数の異なるインスタンスの存在について必ずしも心配する必要はありませんTMyComponent。ただし、そもそも複数のインスタンスが存在しないことを確認するために、独自のチェックを実行する必要があります。ただし、このコンポーネントのインスタンスは1つしかないため、コンポーネントのユニットでグローバル変数を宣言し、それを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 に答える