ro中间层设计的方案内容摘要:

附 : 开始创建数据访问类时,用了抽象工厂模式 ,本来是考虑到,不同的 连接对象,会使用不同的数据感知控件访问。 用抽象工厂,在使用不同方式访问数据库,可以配置不同的产品类。 后因 BDE 已经渐渐退出市场。 因此没对其进行完善。 原始的设计也被保留了下来。 说明: TConnDBFactory 类 type TConnDBFactory = class(TPersistent) public function CreatorConnDB() :IConnDataBase。 virtual。 abstract。 end。 主要功能: 创建一个 CreatorConnDB 得到一个 IconnDataBase 接口,抽象方法,这里是抽象工厂的用法。 抽象工厂 创建一系列产品,产口都实现 IconnDataBase 该接口,派生不同的工厂,创建不同的产品系统类型。 6) uConnDBFactory_SQLServer 工厂类单元 说明: TConnBDEDBFactory 类 主要功能: 从抽象 工厂 派生 ,创建不同的 产品系列 对象 , 即 TConnBDEDB_SQLServer 和TConnADODBFactory_SQLServer。 function () :IConnDataBase。 var connDB: TConnDB。 begin connDB :=。 Result := connDB。 end。 function () :IConnDataBase。 var connDB: TConnDB。 begin connDB :=。 Result := connDB。 end。 附: uConnDBFactory_ACCESSServer 工厂类 单元和 uConnDBFactory_Oralce 工厂类 单元和前面所述雷同。 元数据访问 模块 封装介绍 1) uMPropList RTTL 实现类 单元 说明: TMPropList 类 主要功能: 1. 实现 RTTL 信息。 2. 对 published 属性字段的读取。 3. 利用 GetProp 和 SetProp 等方法,实现对底层类属性字段的读取操作。 2) uDataTransferObjectFactory 元数据 注册工厂 单元 说明: TRegDTOFactory 类 主要功能: 1. 对系统所有的元数据类 (TdataTransferObject 及派生类 )进行注册。 2. 通过字符串,得到其已经注册的元数据的 Tclass. 3. initialization _RegDTOFactory :=。 在初始化时已经创建该对象,该对象为全局对象,在系统退出时,由操作系统回收 空间。 使用方法: 所有的元数据,都在系统初始化的时候进行注册, 比如 TbillVO 类: initialization (TBillVO)。 注册工厂对注册的元数据进行管理,查找,创建等。 3) uDataTransferObject 元数据类及元数据列表类 单元 说明: 元数据 , 传输对象, 数据载体 简称( DTO) , O/P Maping 中的数据实体。 对映数据库的映射。 元数据类型必须 要 支持数据 序列化功能和持久化功能。 在三层或多层设计中,层与层之间传输的就元数据 (传输对象 ), 从而使系统的开发,真正面向对象具有可维护,易用性 ,数 据无关性, 无数据集处理异常等优点。 序列化: 网络中传输的是字节流,我们需要把一个对象转化成字节流,传输到服务器端后,又需要再把字节流转化成对象的技术。 持久化: 需要把一个对象实体存入到介质的一种手段。 这里指(把一个对象存入 DB 数据库中,或把 DB 数据库表中数据转化成一个对象的能力)。 一个读,一个写。 数据持久化的原理: 怎么把一个对象持久化, 一般都需要语言的支持, 例如反射机制,动态运行时信息等,在 DELPHI 中 可以根据动态运行时 ,获取自己变量,能动态获得数据类型,存取数据的能力。 要设计一个通用 的底层 持久化对象往往是困难的, 因为在一个对象中,有可能它的本身一个变量就是其它的一个类,当然这个类本身也必须要支持持久化,否则,该变量无法被持久化。 关键的实现是采用了递归调用的技术,已不属本方案的讨论范围,具体请考虑有关资料。 说明:该 单元 类设计较复杂 ,详细说明如下: 1. TPersistentAdapter 类 : 主要功能: 实现了数据持久化接口的一个基类。 该类实现从 TROComplexType 派生,实现持久化功能 的基础上, 对接口进行封装,从该类派生的对象, 可以不用实现 QueryInterface 等几个方法。 另外加入 SetDestroyFlag 对接口的生命周期进行控制。 如果调用 SetDestroyFlag 设置为真,则 用完接口之后,自动释放,不 再 受接口生命周期控制,有关生命周期问题请参考( COM 原理)。 使用说明: procedure SetDestroyFlag(b_Destroy: Boolean)。 stdcall。 设置为真。 2. TDataTransferObject 类: TDataTransferObject = class(TPersistentAdapter, IDataTransferObject) private PropList : TMPropList。 FFldProperty: TDTOProperty。 DTOSQL: TDTOSQL。 DTODisplay: TDTODisplay。 说明: 元数据,传输对象,简称( DTO)。 多层应用中,层与层之间传输的实体对象。 1. TMPropList: 底层 实现 RTTL 功能 的一个辅助类。 附:在 DTO 进行序列化时,并不会 实现该类的序列化。 2. TDTOProperty 类: 声明如下: TDTOProperty = class(TPersistentAdapter) private FDTOType: TDTOInfoType。 //类型 (table, view) FMapName: String。 //名字 _Index: Integer。 //索引在 Grid 中的位置 published Property FIndex: Integer Read _Index Write _Index。 Property DTOType: TDTOInfoType Read FDTOType Write FDTOType。 Property MapName: String Read FMapName Write FMapName。 public constructor Create。 override。 destructor Destroy。 override。 end。 FDTOType: 标识实体映射的类型 (table, view), FmapName: 映射的名字, _Index: 在 Grid 中的 索引,这里要详细讲一下, 这个索引 的概念, 我们假设从服务器端获取一个 TDTOList( 数据对象列表 ) , 而每个对象在 List 中都有自己的位置, 可能被删除,新增, 但会不会和界面中的 Grid 一致呢, 不一致, 因此这个就是默认更新界面索引用的,你可能会想,我点击的时候就能判断行列,干嘛用这个 ,因为有时候你可能会在程序内部多次处理新增,删除,操作,如此一来,整个数据就乱了。 一句话,就是由于 TDTOList 里面的 DTO 索引和 Grid 中的索引可能会不一致造成的。 附:在 DTO 进行序列化时,并不会实现该类的序列化。 3. TDTOSQL 类 声明如下: TDTOSQL = class(TPersistentAdapter) private FVisSelectList: TStringList。 //隐藏生成 SQL 语句列表 (隐藏字段不生成 select 语句) FVisInsertList: TStringList。 //隐藏生成 SQL 语句列表 (隐藏字段不生成 Insert 语 句) FVisUpdateList: TStringList。 //隐藏生成 SQL 语句列表 (隐藏字段不生成 Update 语句) published Property VisSelectList: TStringList Read FVisSelectList Write FVisSelectList。 Property VisInsertList: TStringList Read FVisInsertList Write FVisInsertList。 Property VisUpdateList: TStringList Read FVisUpdateList Write FVisUpdateList。 public constructor Create。 override。 destructor Destroy。 override。 end。 功能说明: 该类可以在用代码生成工具进行配置的时候, 控制字段是否生成 SQL 语句, 可控制( Select 语句, Insert 语句, Delphi 语句)。 原因: 我们在开发的时候,有些字段 , 比如自动加 1 的字段, 我们 并不想使用这些字段。 因为生成这些字段,可能造成 insert 失败。 附:在 DTO 进行序列化时,并不会实现该类的序列化。 4. TDTODisplay 类 声明如下: TDTODisplay = class(TPersistentAdapter) private FDTOCaptionList: TStringList。 //说明列表 FHideDTOList: TStringList。 //隐藏字段列表 (隐藏字段 不显示界面 )。 FBindCtlList: TList。 //绑定控件 procedure RefVOCtlDisplay(pDTO: TDataTransferObject)。 function GetFldContent(pTO: TDataTransferObject。 i_j: Integer): String。 procedure DrawControlLabel(tmpCtl: TControl。 Caption: String)。 procedure DrawControlContent(tmpCtl: TControl。 Caption: String)。 published Property DTOCaptionList: TStringList Read FDTOCaptionList Write FDTOCaptionList。 Property HideDTOList: TStringList Read FHideDTOList Write FHideDTOList。 Property BindCtlList: TList Read FBindCtlList Write FBindCtlList。 public procedure FreeBindCtlList。 procedure BindControl(tmpCaptionCtl,tmpCtl: TControl。 fld: String)。 overload。 procedure BindControl(tmpCaptionCtl,tmpCtl: TControl。 fld, fldEx: String)。 overload。 public constructor Create。 override。 destructor Destroy。 override。 end。 功能介绍: TDTODisplay 是一个和 UI 显示相关的类。 通过代码生成工具, FDTOCaptionList 里面会自动存放上所有的 Grid 的 Caption 的显示,及需要隐藏的界面字段。 同时, BindControl。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。