당신이 할 수있는 한 가지 방법은 단 하나의 행동을하는 것입니다. 경로를 "/"로 설정하고 조치를 기본 핸들러로 설정하십시오. 그런 다음 :
- 로그는 URL에서 활동
- 의 시작은
- 난 항상 모든이 작업 핸들러 엔진을 동작
의 끝을 로그 지정된 적절한 내부 핸들러 호출 조치가 등록되었습니다. 그러면 코드는 다음과 같습니다.
procedure TwmWebModule.wmWebModuleActionHandlerAction(Sender: TObject;
Request: TWebRequest;
Response: TWebResponse;
var Handled: Boolean);
var
HandlerID: string;
begin
HandlerID := StringReplace(string(Request.InternalPathInfo), '/', '', []);
FHandlerEngine.ExecuteHandler(HandlerID, Request, Response);
end;
이제 로깅을 추가하십시오. 다른 장점이 있습니다. 모든 처리기는 자체 단위로 구현되며 MVC 접근 방식을 구현합니다. 코드는 훨씬 깨끗하고 유지 관리가 쉽습니다.
골격은 다음과 같습니다
TCustomHandler = class
private
FHandlerID: string;
FHandlerSettings: ISimpleStorage;
protected
procedure Execute(const Request: TWebRequest; const Response: TWebResponse); virtual; abstract;
public
constructor Create(const ID: string);
property HandlerID: string read FHandlerID;
property HandlerSettings: ISimpleStorage read FHandlerSettings;
end;
THandlerEngine = class
private
FHandlersList: TObjectList;
FRegisteredHandlers: THashTable;
protected
public
constructor Create;
destructor Destroy; override;
procedure RegisterHandlers;
procedure AddSingleHandler(const ID: string; const Handler: TCustomHandler);
procedure ExecuteHandler(const ID: string; const Request: TWebRequest; const Response: TWebResponse);
end;
당신은이 모든에서 원리를 이해 할 수 있어야한다.
이것은 흥미로운 접근 방법입니다. 처음에는 TCustomWebDispatcher를 서브 클래 싱하려고 시도했지만 대부분의 메소드가 정적이어서 상속을 통해 확장되도록 설계되지 않았습니다. 결과를 얻는 유일한 방법은 클래스를 복제하기 위해 많은 복사/붙여 넣기를 수행하는 것이 었습니다. 솔루션 솔루션이 더 나은 선택입니다. 감사! – danhakin
문제 없습니다. 그것은 나를 위해 위대한 작품. – Runner