DELPHI三层架构设计方案
- 格式:doc
- 大小:36.50 KB
- 文档页数:6
随便说说最近项目中的三层架构吧。讲点实际的东西。我最讨厌空讲道理。网上讲道理的太多了,不喜欢举例子。
大多数文章中都或多或少的讲到了三层架构。表示层,业务层,数据层。又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。
今天主要讨论一下业务层吧。举个最简单的例子。客户端获取数据。
业务层要与表示层尽量解藕, 我的方法是:首先我们在中间层TLB_中定义一个接口
IBusinessService, 定义一个方法。getvoList,我要得到一个VO的列表, VO即ValueObject,
例如:
TValueObject= class(TPersistent)
private
b_insertFlag :Boolean;
b_updateFlag :Boolean;
b_deleteFlag :Boolean;
d_rowVersion :double;
procedure setInsertFlag(pInsertFlag :Boolean);
function getInsertFlag: Boolean;
procedure setUpdateFlag(pUpdateFlag :Boolean);
function getUpdateFlag: Boolean;
procedure setDeleteFlag(pDeleteFlag :Boolean);
function getDeleteFlag: Boolean;
procedure setRowVersion(pRowVersion :double);
function getRowVersion:double;
protected
function GetOLEData: OleVariant; virtual;
procedure SetOLEData(const Value: OleVariant); virtual;
published
property bInsertFlag: Boolean read getInsertFlag write setInsertFlag;
property bUpdateFlag: Boolean read getUpdateFlag write setUpdateFlag;
property bDeleteFlag: Boolean read getDeleteFlag write setDeleteFlag;
property dRowVersion: double read getRowVersion write setRowVersion;
property POLEData:OleVariant read GetOLEData write SetOLEData;
end;
TUserVO = class(TValueObject)
private
id: string;
name: string;
password: string;
。。。。。。。。。。。。。。。
VO的列表:
TValueObjectList = Class(TObjectList) private
ValueObject: TValueObject;
ClassName: TClass;
procedure setClassName(pTmpClsName :TClass);
function getClassName: TClass;
procedure setValueObject(pTmpVO :TValueObject);
function getValueObject: TValueObject;
protected
function GetOLEData: OleVariant; virtual;
procedure SetOLEData(const Value: OleVariant); virtual;
published
function AddItem(index: integer; AObject: TObject ):Integer; virtual;
function GetItem(index, itemid: integer ): TObject; virtual;
function CountItem:Integer; virtual;
public
constructor Create; virtual;
destructor Destroy; override;
procedure AfterConstruction; override;
property PClassName: TClass read getClassName write setClassName;
property POLEData: OleVariant read GetOLEData write SetOLEData;
property PValueObject: TValueObject read getValueObject write setValueObject;
end;
TValueObjectList就是VO的装载器。在 JAVA中有一个好听的叫法,
VOList值列表组装器,具体的功能是可以管理VO, 当然你可以进行扩充,比如后来我加入了OLE<->TOBJECT<->TDataset互换的功能。
主键生成机制,分页存取功能,生成子集功能,及懒装载功能,压缩传输流功能等,同步数据更新问题等。这要你自己去发挥吧。
说了这么多,话题转回来吧。现在说客户端怎么去存取数据。
在前面中间层已经定义了IBusinessService, 定义一个方法。getvoList,这个就是通用存取数据的接口了。
下面看看他的完整形式:
procedure getvoList(const sBOName: WideString; const sBOService: WideString;
out voListObj: OleVariant);
这里有三个参数,sBOName:sBOService:voListObj:
干什么用的?第一个就是业务对象名称, 第二个是业务对象服务名称,
第三个是传回来的olevariant;
强调一点。sBOName:sBOService:这两个参数并不直接对应中间层的业务对象。之间加了一个转换层。也就是service定位层。这个东西把客户传来的两个参数定位到相应的业务对象中。有什么好处呢。其实就相当于客户端和中间层的一个简单的协议,客户端发一个boname,一个服务名,这都是约定的。也就是不变的。以后该业务要变,就十分方便,只需要在中间层的定位器,配置一下就可以了,如果采用XML或文件配置,不需要修改任何程序,客户的业务已经发生改变。当然会采用名字调用等技术了。相关代码如下:
TBOService= class(TServiceObject)
private
//srvOBName : String;
IBasBO: IBaseBO;
BOPool: TBOPrototype; //业务对象持久池:
public
constructor Create;
procedure getvoList(const sBOName: WideString; const sBOService: WideString;
out voListObj: OleVariant); safecall;
。。。。。。。。。。。。。。。。。。。。。
再说说TBOPrototype吧 ,这个东西是管理业务对象池的。由他统一创建业务对象。采用的是单例模式。
之后具体的调用,相关代码如下:
if FindClass(fClsPer.ClassName) <> nil then
begin
tmpPer := TPersistentClass(FindClass(fClsPer.ClassName)).Create;
Supports(tmpPer, StringToGUID('{3AE5EA91-41EA-41E7-B40C-CF00F8B75F8A}'),
IBasBO);
try
IBasBO.InitBusinessObj;
voListObj := IBasBO.GetDAOValueObject.getDAOValueList;
finally
IBasBO := nil;
end;
end
else
ShowMessage('no found!');
其中IBasBO,是一个接口定义,
IBaseBO = interface(IUnknown)
['{3AE5EA91-41EA-41E7-B40C-CF00F8B75F8A}']
function GetObject: TObject;
procedure SetObject( value: TObject );
function GetDAOValueObject: TDAOValueObject;
procedure SetDAOValueObject(tmpDAOVO: TDAOValueObject);
procedure InitBusinessObj;
end;
呵呵,现在可以看到冰山一角了吧。 经过业务对象初始化之后,他就去创建DAO了。。。呵呵。 如果你不了解DAO,看看相关的资料吧。。。。。
主要功能就是把数据存储隐藏起来,调用SQL, ORACLE,之类。我主要是用它调用数据库工厂创建。
大致看一下代码吧。
//--------------------------------------------------------------------------
//1.工厂基类(SQLServer工厂类)