畅享博客 > 我的工厂生活 > [转帖]使用DLL封装业务逻辑----利用interface接口,使界面代码和函数分离。
2008-5-12 13:56:10

[转帖]使用DLL封装业务逻辑----利用interface接口,使界面代码和函数分离。

使用DLL封装业务逻辑
--界面部分
--业务部分,,即函数部分编译成DLL
--接口单元

看实际运行之源代码
按照下述步骤一步步硬做吧。
00.生成名为opeDataSet的DLL框架
01.往框架内添加两个UNIT,
   一个名为Idata,为接口单元定义,最好取名Iinterfacedata.
   一个名为untOpeDataSet,为函数定义部分。
02.Idata之内容
   使用接口类,先仅仅做一个接口。
   type
     Idb=interface //这里Idb不知为何,是一个接口实例??
   end;  
   包含的函数和过程先省略。
03.untOpeDataSet之内容
   uses Idata;//使用Idata单元
   type
     TopeDataSet = class(Tinterfacedobject, Idb)//
   end;  
   函数和过程都定义为public
04.opeDataSet之DLL编写
   声明一个函数,此函数返回值为

还是不看此源程序,看说明文档更清晰。
作为模板来使用。cl,,It,,Ii,,等等。

{
 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.
//----------


推荐到鲜果:

评论

您正在以 匿名用户 的身份发表评论  快速登录
(不得超过 50 个汉字)
       看不清,换一个
提示消息
(输入完内容可以直接按Ctrl+Enter提交)