{ CopyRight (c) 2006.10.27 咏南工作室 ToDo: 使用DLL封装企业业务逻辑 作者: 陈新光 邮箱: hnxxcxg@yahoo.com.cn }
{ 界面部分和业务部分物理分离。将业务部分和界面部分分别编译成dll和exe可执行文件。
定义一个接口部分以实现界面部分和业务部分之间通讯。接口部分可使用接口或抽象类来实现。一定要保持接 口的稳定,轻易不要改变接口单元中的内容。还可通过预留接口来满足未来功能增长的需求。
经常变动的通常是业务部分,通过修改DLL封装对象的实现方法来升级DLL,无需重新修改和编译界面部分的Exe文件。 }
//---------- { 业务逻辑单元 }
unit cl;
interface
uses sysutils, dialogs, classes, forms, it; //引用接口单元
type tTest = class(Tinterfacedobject, Ii) public procedure say; procedure say2; procedure say3; //预留接口 end;
implementation
{ tTest }
procedure tTest.say; begin showmessage('hello'); end;
procedure tTest.say2; begin application.MessageBox('hello', 'dll', 64); end;
procedure tTest.say3; begin //showmessage('预留接口'); { 预留接口是为了应付未来客户对新功能的增加需求. 例如: 将第一行的"//"注释符去掉. 然后只要重新编译"dll.dll", 无须重新编译客户端程序. 客户端即增加了此项新功能. } end;
end. //----------
//---------- { 接口单元 也可使用抽象类作接口单元,但接口是最好的。 }
unit It;
interface
type Ii = interface ['{8C8C7999-0B73-4A85-B89E-3D8A8336FF06}'] //GUID可注释掉(可要可不要),非com项目建议去掉 procedure say; procedure say2; procedure say3; end;
implementation
end. //----------
//---------- { 动态链接库工程文件 请注意这里使用DLL封装对象的技巧, 对象在dll建立 }
library dll;
uses SysUtils, dialogs, Classes, cl in 'cl.pas', //引用业务单元 It in 'It.pas'; //引用接口单元
{$R *.res}
function hello: Ii; begin result := tTest.Create; end;
exports hello;
begin end. //----------
//---------- { 客户端工程文件 } program Project1;
uses Forms, Unit1 in 'Unit1.pas' {Form1}, It in 'It.pas'; //引用接口单元
{$R *.res}
begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end. //----------
//---------- { 客户端界面单元 真正的瘦客户端,不包含任何企业逻辑代码 }
unit Unit1;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, it; //引用接口单元
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; Button3: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private m: Ii; //定义变量 public { Public declarations } end;
var Form1: TForm1; function hello: ii; external 'dll.dll'; //装载dll.dll
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject); begin m := hello; m.say; m := nil; end;
procedure TForm1.Button2Click(Sender: TObject); begin m := hello; m.say2; m := nil; end;
procedure TForm1.Button3Click(Sender: TObject); begin m := hello; m.say3; m := nil; end;
end. //---------- |