本文档是关于构建基于InstantObjects框架的参考手册。
主要包括以下三个部分:
l 建立业务模型
l 建立用户接口
l 使用持久化对象编程
2.0 建立业务模型
2.1 业务模型
所谓业务模型就是指domain,建立持久化类对象与数据表的映射。InstantObjects业务模型包括一系列用户定义的类,继承和关联关系。InstantObjects framework 提供了几种class attribute types方便相关类的实例的持久化。
2.1.1 Container attributes
是指下面的几种属性,称容器属性
2.1.2 Reference(See TInstantReference for more information)
这是InstantObjects支持的一种简单对象关系。一个对象可以单向的引用到另一个对象。
2.1.3 Part(See TInstantPart for more information.)
这种模式关联更加紧密。Part relation是一种双向的关联,这意味关联的双方都知道对方的存在。类似于宿主对象与从对象的关系,从对象随着主对象的销毁而销毁。
2.1.4 References(See TInstantReferences for more information.
与Reference一样,也是单向关联。但它通过定义与关联对象的一对多关系,可以关联到多个对象。
2.1.5 Parts(See TInstantParts for more information)
是Part的一对多关系表现。
2.2 The InstantObjects Model Explorer
它是IDE设计器,用于建立类和关系以定义业务模型.
<shapetype stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600" id="_x0000_t75"><stroke joinstyle="miter"></stroke><formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f></formulas><path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></path><lock aspectratio="t" v:ext="edit"></lock></shapetype><shape type="#_x0000_t75" style="width: 174.75pt; height: 199.5pt;" id="_x0000_i1025"><imagedata o:title="{58D72F98-E8FC-481B-BAAF-C239445AE764}" src="file:///C:%5CDOCUME%7E1%5CPANYU%7E1.505%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_image001.png"></imagedata></shape>
通过设计器可以方便地手工定义一个类。
2.3 增加业务规则
通过在业务对象的BeforeStore方法上描述。
procedure TContact.AfterCreate;
var
vCategory: TCategory;
begin
inherited;
Id := InstantGenerateId;
vCategory := TCategory.Retrieve('CAT000');
try
Category := vCategory;
finally
vCategory.Free;
end;
可重载的方法有:
AfterRetrieve, BeforeStore, AfterCreate
2.4 Building/Evolving the Business Model
l Build 删除所有的表后重建
l Evolution 尽量保留原有的数据,它的效果取决于所使用的数据库
l 从己有的业务对象映射生成物理数据表,步骤如下:右键新增一种类型的连接器,重定义为一个有意义的名字,按ctrl+E或修改连接器的属性,接着按build进入数据库建立向导画面,点击show Build Sequence,显示出所有的数据库操作,包括建立数据表和索引。点击build database就会自动生成所需的数据库。
实现原理类似于java里的Docklet,数据表的元数据定义在代码的注释中。
<shape type="#_x0000_t75" style="width: 415.5pt; height: 249pt;" id="_x0000_i1026"><imagedata o:title="" src="file:///C:%5CDOCUME%7E1%5CPANYU%7E1.505%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_image003.png"></imagedata></shape>
<shape type="#_x0000_t75" style="width: 276pt; height: 205.5pt;" id="_x0000_i1027"><imagedata o:title="" src="file:///C:%5CDOCUME%7E1%5CPANYU%7E1.505%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_image005.png"></imagedata></shape>
3.0 建立用户接口
第二阶段的工作是定义用户与业务对象交互的接口。
3.1 Persistence by RAD
允许使用原有的数据感知控件持久化。
3.2 The Connector
Connector充当你的应用和数据库之间的网关,负责一切与数据库之间的操作。
3.2 TConnectionManager
通过将connection数据保存在外部文件中,可以自动建立多个Connector
3.3 The Exposer
TInstantExposer是数据集组件,它负责把实体对象映射到用户接口上。它将published属性映射到字段上。
3.4 The Selector
TInstantSelector是一个数据集组件,可以从数据库中选择对象,并有选择地将它们暴露给用户接口。这种查询语言叫做Instant Query Language。与Hibernate的Hql类似。
如
SELECT [DISTINCT] *|<Attribute>
FROM [ANY] <Class>
[WHERE <Expression>]
[ORDER BY <Attribute list>]
4.0 Programming with Persistent Objects
基本InstantObjects的编程模型有一些规范或者说限制,业务对象类必须从TInstantObject继承,并且包含业务逻辑的方法,类似于一个DAO类。
保存对象调用store方法,id值在存储前给值。
查询时如果没有指定connector 参数,将使用默认的Connector。
5.0 小结
在java世界里,实现对象关系映射的框架非常多,如Hibernate,IBatis,TopLink,JDO,Ofbiz中的实体引擎等。但由于java本身的特性,如虚拟机,动态代理,AOP的存在,使得它能做出很强大的功能,如声明式事务。这些是VCL框架所不具备的。所以从这点上来看InstantObjects这个基于VCL的轻量级框架,已经很优秀,对于中小型的桌面系统,可以将service层和Data access层合并在InstantObject中,当然也可以使用RemoteObject作为Service层,发布为WebService应用。
有了InstantObject之后,就不用再直接面对字段,可轻易变更数据源,更重要的是编码是更加OO。
之所以研究InstantObjects,是因为打算用它做一个“个人信息管理”的应用程序,主要包括个人财务管理,人际关系管理,知识管理,计划行程等方面的内容。有兴趣的朋友可以联系我。
6.0 参考资料
InstantObjects Guid 2.0