这个DEMO用来演示服务的替换,用起来总是怪怪的感觉,效果图如下
代码如下
unit Frm_Main; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls, Vcl.StdCtrls, qplugins_base, QPlugins; type // 定义一个接口,方法由子类来实现 IEchoService = interface ['{E9A9E0D8-F278-46CC-9AA4-7FCD9CDAB77F}'] function Echo(S: string): string; end; // Echo接口的实例 TEchoService = class(TQService, IEchoService) function Echo(S: string): string; end; TEchoReplacement = class(TInterfacedObject, IEchoService) function Echo(S: string): string; end; TForm_Main = class(TForm) Button1: TButton; Memo1: TMemo; Panel1: TPanel; Button2: TButton; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private declarations } FReplaced: IEchoService; public { Public declarations } end; var Form_Main: TForm_Main; implementation {$R *.dfm} // 按钮_调用服务 procedure TForm_Main.Button1Click(Sender: TObject); var AService: IEchoService; begin // PluginsManager函数返回全局PluginsManager实例 AService := PluginsManager as IEchoService; // 服务存在,则调用 if Assigned(AService) then begin Memo1.Lines.Add(AService.Echo('服务插件')); end; end; // 按钮_替换服务 procedure TForm_Main.Button2Click(Sender: TObject); var AService: IQService; begin // 在指定的父结点下,查找指定路径的服务 AService := FindService('/Services/Echo'); // 如果服务存在 if Assigned(AService) then begin // 撤销替换服务 if Assigned(FReplaced) then begin AService.RemoveExtension(FReplaced); FReplaced := nil; Button2.Caption := '替换服务'; end else begin // 替换服务 FReplaced := TEchoReplacement.Create; AService.AddExtension(FReplaced); Button2.Caption := '撤销替换'; end; end; end; { TEchoService } // 原Echo函数 function TEchoService.Echo(S: string): string; begin Result := Format('类名[%s]: %s', [ClassName, S]); end; { TEchoReplacement } // 新Echo函数 function TEchoReplacement.Echo(S: string): string; begin Result := Format('新类名[%s]: %s', [ClassName, S]); end; // 创建 procedure TForm_Main.FormCreate(Sender: TObject); begin // 注册TEchoService服务 RegisterServices('/Services', [TEchoService.Create(IEchoService, 'Echo')]); end; end.