009.Delphi插件之QPlugins,服务的热插拔

这个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.

 

posted @ 2019-09-10 11:58  像一棵海草海草海草  阅读(357)  评论(0编辑  收藏  举报