我们编写Com+数据服务模块的一般方法是,
新建一个ActiveX Library,
新建一个Transaction DataModule
然后,在这个工程的类型库编辑器中增加自定义的接口方法,
实现这些接口方法.
一旦我们写了很多这类服务,会发现,我们总是重复类似的服务接口,同时也重复编写
类似的实现代码,自然会想到继承。
首先,我们考虑到接口的继承,非常不幸,在类型库编辑器中,从接口的Parent Interface下拉列表中,除了系统预定义的标准接口可以继承外,我们似乎找不到自己的接口基类。
另一方面,实现单元,对象继承自TMtsDataModule,单元的Initilization部分使用了对象工厂创建自动化对象,这种方式,让我们很难用传统方法使用实现继承。
针对实现继承的需求,我们建立的服务基类,不要继承自Transactional DataModule,而是使用Transactional Object,配合一个普通的DataModule,来实现类似Transactional DataModule的功能,这样,普通DataModule的实现代码就可以被继承了。
当然,这种方法牺牲了IAppServer预定义的As_*这类接口,事实上,我从来不在客户程序中调用这些接口。
理解了上述基本思路后,对于熟悉Com+数据服务模块编写方法者,从以下文档可以理解我的基本设计思想:
本基类提供子母表datamodule的基础框架和接口框架
被继承的数据模块:
dMasterDetailBase.pas
被继承的接口声明:
mtsMsterDetailBase_TLB
继承后的mts实现单元代码模板:
MasterDetailImpl.pas
下面是使用这个基类来继承子母表服务的基本方法:
1、准备工作:
为了使用这个基类,做好以下准备:
regsvr32 mtsMsterDetailBase.dll -----使这个接口可以被类型库编辑器继承
2、继承的基本步骤:
2.1 建立服务工程文件:
新建一个Active Libruay
保存为 mtsXXX
在工程中加入单元:dMasterDetailBase.pas,mtsMsterDetailBase_TLB
dMasterDetailBase.TdmMasterDetail是准备被继承的datamodule
工程属性设置(最好设为默认):
Packages:钩选Build with Run Time Package ,仅包含 vcl;rtl;vclx
编译路径: ../../发行包/server
2.2 继承数据模块(TdmMasterDetail):
file/new/other
找到本工程页,选择dmMasterDetail,按ok继承它
这时,一个datamodule被创建,把它保存为dXXX.pas
datamodule对象命名为dmXXX
这时,我们就可以修改这个datamodule中各个query的sql语句,使它访问新的模块的树据库对象
2.3继承Com接口:
为了不重复写类型库中的接口方法声明,可以继承IMasterDetail接口
继承IMasterDetail接口的步骤:
file/new/other/ActiveX/Transactional Object
CoClass Name: XXX
支持事务
把这个文件命名为XXXImpl.pas
在类型库编辑器中,点击根节点,打开Uses页
右键,Show All Type libruaries
找到mtsMasterDetailBase,打勾(如果找不到,是你没有注册mtsMsterDetailBase.dll)
右键,Show Selected
在类型库编辑器中点击IXXX节点,在Attributes页,将Parent Interface改为IMasterDetail
刷新类型库
这样,IMasterDetail接口的所有方法都被继承了
关闭类型库编辑器
2.4 实现服务接口:
下面,来实现XXXImpl.pas中的对象方法,基本上是抄MasterDetailImpl.pas中的样本代码
为了方便抄写代码,可以在IDE中打开MasterDetailImpl.pas,但不要把它加到工程中
首先,在XXXImpl.pas中的interface部分的uses中加入dMasterDetailBase
在对象 Txxx的私有部分加入以下声明:
private
FDM:TdmMasterDetail;
在公有部分加入以下声明:
public
//声明下列方法并实现他们
procedure Initialize;
override;
destructor Destroy;override;
实现:
procedure TXXX.Initialize中
FDM 使用你继承后的datamodule来创建,即,
FDM:=TMasterDetailBase.Create(nil);
改为:FDM:=TdmXXX.Create(nil);
为了上面的代码能够调试通过,你还要在实现部分uses dXXX
其他实现代码照抄MasterDetailImpl.pas中的相应部分
至此,一个继承的masterdetail服务模型就出来了
2.5 细化数据模块的逻辑
这个工作主要是在Query组件中编写各个SQL代码
为了方便调试DataModule中的细节,可以新建一个测试exe文件,加入dMasterDetailBase和dXXX.pas
在执行文件中调试数据模块就比较容易了
2.6 编译mts服务
数据模块细化并调试成功后,简单打开mt工程,编译它就可以了
其他说明:
如果在新的服务中需要扩充接口,可以在类型库中自行扩充