InstantObjects参考 - delphi的ORM实现

概述

本文档是关于构建基于InstantObjects框架的参考手册。

主要包括以下三个部分:

l 建立业务模型

l 建立用户接口

l 使用持久化对象编程

2.0 建立业务模型

2.1 业务模型

所谓业务模型就是指domain,建立持久化类对象与数据表的映射。InstantObjects业务模型包括一系列用户定义的类,继承和关联关系。InstantObjects framework 提供了几种class attribute types方便相关类的实例的持久化。

2.1.1 Container attributes

是指下面的几种属性,称容器属性

2.1.2 ReferenceSee TInstantReference for more information

这是InstantObjects支持的一种简单对象关系。一个对象可以单向的引用到另一个对象。

2.1.3 PartSee TInstantPart for more information.

这种模式关联更加紧密。Part relation是一种双向的关联,这意味关联的双方都知道对方的存在。类似于宿主对象与从对象的关系,从对象随着主对象的销毁而销毁。

2.1.4 ReferencesSee 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。与HibernateHql类似。

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

你可能感兴趣的:(Delphi)