HS 系统开发模式
文档类别 管理规范
文档编号 T03-00003-050205
来源部门 技术部研发部门
应用范围 技术部
保密级别 ★★★
修订历史记录
日期 版本 说明 作者
2005-3-22
[修订 01]:将 BD 对象的维护接口将自身往 DA 传递,更新为传
递直接参数,即传递需要的数据属性参数。
董应群
2005-2-5 Create 董应群
目 录
1、 目的 ........................................................................................................................................................2
2、 系统命名空间的命名体系 ....................................................................................................................2
3、 系统中的对象数据组织模式 ................................................................................................................4
4、 系统中的对象数据的处理方式 ............................................................................................................5
5、 HS 信息处理模式原理图 ....................................................................................................................11
6、 对象数据类基本接口 ..........................................................................................................................12
7、 DS 层信息处理模式 ............................................................................................................................13
8、 UI 层的检测逻辑实现规则 .................................................................................................................14
9、 代码示例 ..............................................................................................................................................15
1、 目的
规范化系统的开发模式;
规范化系统中对象的组织;
提高系统的开发效率;
提高系统的维护效率;
降低系统的 BUG 率。
2、 系统命名空间的命名体系
在 HS 环境中进行对象和工具集的再次组合的体系。便于合理地组织各类对象和个
性化工具集合。
基本命名体系
所有的 HS 环境中的对象和工具全部在 Hotsales 命名空间下。按如下形式进行展开:
Hotsales.子系统命名空间/全局共享层次空间.下级子系统命名空间/系统对象逻辑层次
命名空间
全局共享层次命名空间
//全局系统框架命名空间,在子系统中也可以
提供自己的系统框架命名空间。
//全局系统工具集合命名空间,在子系统中也有自己的
通用工具集合命名空间。
系统对象逻辑层次命名空间
具体层次描述见“T03-00005《HS 软件系统的实现规则.doc》”
层名 命名 标识 层描述 备注
业务外观层
BusinessFacade
BusinessFacade BF
提供业务处理的集成化接口,起 UI 层和业务
逻辑处理层的交互代理。
业务规则层
BusinessRule
BusinessRules BR 系统中个性化业务逻辑处理中心 采用复数形式
业务数据对象层
BusinessData
BusinessData BD 系统中业务数据的对象层
具体子系统的通用层
Common
Common CM 系统中的工具集合体
数据访问层
DataAccess
DataAccess DA
系统中数据访问层,是对象化数据与关系型数
据的交互代理。
数据存储层
DataStore
DataStore DS
数据处理层,提供存储过程处理/访问数据,甚
至包含部分业务逻辑的处理。
在 DB 中实现
系统框架层
SystemFramework
SystemFramework SF 系统框架层,提供系统配置信息的处理
系统通用层 SystemCommon SC 系统通用工具集合
SystemCommon
Web 层
Web
Web UI
系统中用户接口,提供页面逻辑的处理,结合
业务逻辑进行部分离散业务逻辑的处理。
服务器端处理工具 Server SS
各类自动化性质的工具的服务器端处理工具
集合
Web 方式提供的服务 HttpProvider HP 采用 WEB 方式提供服务的工具集合
HS 的所有系统中各子系统命名空间总揽
该信息需要与“F05-00006《系统架构.xls》”中的命名空间保持一致。
子系统名称
及编号、代号
命名空间头部 备注
人事管理 M01、HotHR 目前主要包含企业组织结构、人员
系统管理 M02、HotUM* 系统体系结构、权限等管理
业务处理 M03、HotBiz 销售订单(业务)、合同管理
M04、HotSaleClew
销售管理
M45 SaleManage M05、HotSaleChance
—
—
销售线索、销售机会
客户管理 M06、HotCustomer
客户资料管理(涉及全面客户资料:客
户、供应商等)
服务与支持 M07、HotService 服务与支持
财务管理 M08、HotFinance 财务管理
T01、HotSMS
T02、HotREMIND
T03、HotMESSAGE
T04、HotSE
T05、HotWF
T06、HotWP
T07、HotMailer
短信服务
提醒服务(通过内部消息、短信、邮件
来实现)
内部消息服务
系统事件
工作流(目前主要涉及到审批流和审批
工具)
工作计划(包含计划安排,同时调用提
醒工具)
邮件工具(群发、定向发送)
办公基础辅助
工具 T00
T08、HotGTask
T09 HotFax 传真管理中心
T20、HotAdvice 建议中心
T21、HotNews 新闻中心内部交流
T22、Hotbbs BBS
产品管理 M09、HotProd 产品管理
市场管理 M10、HotMark 市场管理
系统设置 M30、SysSetup 系统设置管理
系统框架
T90、HotSystemFramework
系统框架
通用工具
HotCRMCommon
通用工具
编号规则:
1、 M 开头,企业信息化管理系统
2、 P 开头,企业信息化生产过程管理信息系统,车间生产管理、生产跟踪
3、 E 开头,企业信息化工程技术子系统,如,CAD、CAPP 等
4、 T 开头,企业信息化工具系统
5、 S 开头,企业信息化管理集成系统
HS 体系中的商用系统代码
集成商用系统
编号 代号 名称
S01 HotCRM 客户关系管理系统
3、 系统中的对象数据组织模式
系统中特定对象数据采用两类数据对象进行封装和传递。
存放单一对象信息的特定对象数据,采用实际的对象,对象的属性是该对象
对应的 HSF 规范视图的所有属性和特定大字节属性(具体定义见“T03-00007
《HS DB 管理规范.doc》”)。命名规范为:XXData
存放多个对象信息的对象集合数据,采用 DataTable 对象来存储该对象集的
列表数据。其中不能包含特定的大字节属性。命名规范为:XXTable
用于 UI 显示的信息传输模式
所谓信息传输模式:指函数参数的类型范围。在 UI 中显示的信息仅仅来源于两类
信息载体,DataTable 和特定的对象。
用于数据表格/DataGrid、下拉列表框、列表框、控件数组等信息显示,采用
通用 DataTable 作为信息的载体进行信息的传输。信息的传输方向:“DS——》
UI”;
用于非上述页面元素的显示,采用特定的对象作为信息的载体进行信息的传
输。信息传输方向“DS《——》UI”
特定统计性质的数据的显示,可能来源于 DataTable 或特定的函数参数,甚
至函数的返回值。
非 UI 显示(逻辑处理需要)的信息传输模式
用于逻辑处理需要进行信息的获取,可以根据需要进行信息的传递,但一般采用“用
于 UI 显示的信息传输模式”。特殊情况根据需要用户可以自行决定信息传输模式。
4、 系统中的对象数据的处理方式
系统中任何对象都对应一个对象数据类,所有特定对象信息的传输是通过该类的
对象进行传输的。该对象的属性是该对象对应的数据表的所有属性,和该数据表
对应的视图扩充过来的属性。
与特定对象相关的类及其基本功能
假设对象名为 Object。
层次 类名 功用
BusinessFacade ObjectSystem
提供 UI 需要的所有个性化接口,包含简单的参数
规范性检测。一般没有属性,纯粹的方法封装体。
BusinessRules Object
提供个性化业务逻辑处理引擎。没有参数检测。一
般没有属性,纯粹的方法封装体。
BusinessData ObjectData
提供当前对象的个性化属性封装体。属性范围:该
对象对应的数据表的所有属性,和该数据表对应的
视图扩充过来的属性。提供基于编号的属性获取接
口,集成到类的初始化方法中。同时提供基于独立
命名的基本信息维护接口(新建、基于主键的修改)
Common ObjectTool
与特定子系统相关的通用工具封装体。一般没有属
性,纯粹的方法封装体。
DataAccess Objects
提供与特定对象相关的数据表的访问接口。系统通
过该层连接远程 DB,执行 DS 层的 SP,进行系统
需要的数据处理。
特定对象的个性化类
系统中将提供基本属性和控制属性。在所有的属性获取接口中需要自己再生
成 SQL 代码片段,应全面防止注入式 SQL 病毒。
属性
提供了该对象对应的数据表的所有属性,和该数据表对应的视图扩充过
来的属性。即该对象对应的视图的所有属性和大字节属性。
某些类还提供了个别特殊的统计属性,这些属性的设置需要通过非编号
的扩展信息获取接口来进行信息的设置。
定义属性的时候需要初始化属性,根据不同的类型进行如下初始化
数值类型:初始化为“0”
字符型:初始化为“""”
日期型:初始化为“1990-1-1”
引用型:初始化为“null”
构造函数
系统提供了基于配置的属性初置构造函数,即提供通过编号和 XML 文件
配置的初始化类时应该设置的属性值。
如果用户提供的构造函数和扩展函数中编号没有定义,则统统默认为“2”。
即指定了无效的编号,则初始化为全部视图属性。
基本编号:内置的构造函数编号
0:空对象,初始化一个空对象,不从 DS 层获取任何信息。用
于创建和修改对象信息时使用。
1:全部直接属性,获取所有视图/数据表中有对应字段的属性,
含大字节属性。
2:全部视图属性,获取所有视图属性,不含大字节属性。这是
默认方式,即无参构造函数默认采用该编号。
3:名称属性,仅仅 ID 属性和名称/描述属性。
4:大字节属性,仅仅 ID 属性和所有大字节属性。
5:其它属性,仅仅 ID 属性和其它非视图/数据表属性。
扩展编号:又称配置编号,基于配置文件的信息获取接口。配置文件参
见“T03-00010《系统属性设置配置策略.doc》”
扩展属性设置接口
基于配置文件进行和特定的命名属性串进行对象属性的设置。扩展信息
获取接口支持所有编号的对象属性设置。系统中所有编号的属性设置都是通
过一个统一的函数来进行的。
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
标准扩展方式设置对象属性(根据配置编号或直接命名属性串设置特定对
象的属性)
成功设置特定对象属性,无返回值(void)。
否则抛出错误(M3000209F)
接口参数:
配置编号:int attributeNo
关键字:int keyword //具体命名和类型采用该对象对应的关键字的
名称和类型
命名属性串:string attributeString //重载接口参数
参数格式:
命名属性串:string attributeString,用逗号隔开的命名属性串
处理方法:
直接调用 DA 层同名同参接口
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:public void ExtendSetAttribute(int keyword, int attributeNo){}
处理方法:public void ExtendSetAttribute(int keyword, string
attributeString){} //重载接口
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
扩展属性获取接口
通过属性方式访问特定对象的属性,需要通过构造函数、扩展属性设置
函数事先进行对象属性的赋值。同时还需要保证执行了正确的属性设置方法,
即应用了正确的属性设置编号。否则可能获取系统默认的属性值,而非实际
的属性值。此种方法为事先设置方式。
此处提供的扩展属性获取接口,是即时属性获取接口。该接口将即时调
用对应的 DA 层接口取获取相关属性。并返回对应属性加载的 Hashtable 对象。
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
标准扩展方式获取对象属性(根据直接命名属性串获取特定对象的属性)
成功返回特定属性加载的 Hashtable 对象。
否则抛出错误(M3000210F)
接口参数:
关键字:int keyword //具体命名和类型采用该对象对应的关键字的
名称和类型
命名属性串:string attributeString
参数格式:
命名属性串:string attributeString,用逗号隔开的命名属性串
处理方法:
直接调用 DA 层同名同参接口
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:public Hashtable ExtendGetAttribute(int keyword, string
attributeString){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
维护接口
系统提供了创建对象和根据对象关键字进行信息的更新的接口。注意:创建
和更新的逻辑条件在 BR 层进行,此处的接口仅仅进行实际的创建和更新操作。
此时需要利用该对象作为函数参数,进行相关处理:
在 UI 层给对象的属性赋值
通过 BF 层传输到 BR 层
在 BR 层处理完相关逻辑条件后,再执行该对象的特定维护接口。
辅助接口,私有接口
获取指定属性编号/用户化属性串对应的标准命名属性串
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
获取指定属性编号/用户化属性串对应的标准命名属性串
成功返回特定的命名属性串。
否则抛出错误(M3000211F)
接口参数:
属性编号:int attributeNo
命名属性串:string attributeString //重载接口参数
参数格式:
命名属性串:string attributeString,用逗号隔开的命名属性串
处理方法:
内置编号采用类常量模式
非内置编号采用从 XML 文件获取,然后解析命名属性串
命名属性串需要进行解析。
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private string ParseAttributeString(int attributeNo){}
处理方法:private string ParseAttributeString(string attributeString){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
依据命名属性串从 DA 层获取对应的数据
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
依据命名属性串从 DA 层获取对应的数据
成功返回特定属性数据。
否则抛出错误(M3000212F)
接口参数:
关键字:int keyword //具体命名和类型采用该对象对应的关键字的
名称和类型
命名属性串:string attributeString
参数格式:
命名属性串:string attributeString,用逗号隔开的命名属性串
处理方法:
直接调用 DA 层同名同参接口
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private DataTable GetGrivenAttributeInfos(int keyword,
string attributeString){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
将获取的数据加载到对象对应的属性中
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
将获取的数据加载到对象对应的属性中
成功将特定的属性加载到对象的特定属性中。
否则抛出错误(M3000213F)
接口参数:
属性数据:DataTable attributeData
处理方法:
直接将数据表中的信息加载到对象的属性中,采用逐一加载法进行加
载
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private void SetAttributesFromDataTable(DataTable
attributeData){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
将获取的数据加载到 Hashtable 中
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
将获取的数据加载到 Hashtable 中
成功返回特定属性加载的 Hashtable 对象。
否则抛出错误(M3000214F)
接口参数:
属性数据:DataTable attributeData
处理方法:
直接调用 DA 层同名同参接口
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private Hashtable CreateHashtableFromDataTable(DataTable
attributeData){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
依据命名属性串和对象关键字实例化加载对象属性
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
依据命名属性串和对象关键字实例化加载对象属性
成功将加载当前对象的属性。
否则抛出错误(M3000218F)
接口参数:
关键字:int keyword //具体命名和类型采用该对象对应的关键字的
名称和类型
命名属性串:string attributeString
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private void LoadObjectAttribute(int keyword, string
attributeString){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
依据属性编号和对象关键字实例化加载对象属性
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
依据属性编号和对象关键字实例化加载对象属性
成功将加载对象的属性。
否则抛出错误(M3000219F)
接口参数:
关键字:int keyword //具体命名和类型采用该对象对应的关键字的
名称和类型
属性编号:string attributeNo
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private void LoadObjectAttribute(int keyword, int
attributeNo){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
检测属性的获取是否合法,即是否初始化了
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
检测属性的获取是否合法,即是否初始化了
合法将直接进行过程下一步操作。
不合法和出现错误都将抛出错误(M3000220F)
接口参数:
属性名称:string fieldName
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private void CheckAttributeIsInitialized(string fieldName){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
复位对象数据相关属性
/////////////////////////////////////////////////////////////////////////////////////////////
函数说明:
复位对象数据相关属性
成功将直接复位对象的相关属性,即按标准设置对象属性的初始化值。
出现错误都将抛出错误(M3000221F)
接口参数:
无
具体调用:
命名空间:Hotsales.子系统命名空间.BusinessData
系统类名:ObjectData
处理方法:private void ResetDataRelaAttributes(){}
参考用例:
直接见接口模型(调用说明处出现)
/////////////////////////////////////////////////////////////////////////////////////////////
5、 HS 信息处理模式原理图
UI层/对象接口元素
(非数组的TextBox等)
UI层/列表接口元素
(数据表格/DataGrid、下拉列表框、
列表框、控件数组等)
对象数据
(基于编号的信息设置)
DataTable数据
(基于命名接口的信息获取)
业务逻辑处理
数据访问代理
公用处理方法
配置处理方法
某一对象信息处理模式
6、 对象数据类基本接口
类名:ObjectData
基本常量和非公开域
SYSTEM_NO
定义该对象隶属的子系统编码,具体子系统编码见《系统架构.xls》
globalAtrributeArray[]
全局属性数组,与全局属性串对应
作用:提高检测效率使用的
基本管理/控制属性
CurrentAttributeNo
只读
提供当前设置对象属性的属性编号
如果是采用命名属性串的方式,则值为“-1”
作用:使用户能够检测其在初始化对象的时候使用哪个初始化编号
GlobalAttributeString
只读
提供当前对象的用逗号隔开的全部命名属性串
作用:用于生成标准 SQL 语句的命名属性参考。
CurrentAttributeString
只读
提供设置当前对象属性的命名属性串
如果用户提供的内置编号,系统需要提供所有内置编号对应命名属
性串;
如果用户提供的是扩展编号,系统将从“T03-00010《系统属性设置配
置策略.doc》”配置文件中获取命名属性串;
如果用户采用的命名属性串方式的扩展设置接口,则直接为扩展设
置方式的命名属性串。
如果用户初始化空对象,则给对象属性赋值时,系统将自动装配该
属性值。即用户给了哪几个属性赋了值,系统将自动生成这几个对
象的命名属性串。
作用:用户利用属性值的时候可以检测该利用是否合法。
CheckReadProperty
可读写,默认为“false”
控制用户利用对象属性值的时候,系统是否需要检测,用户是否设置
了特定的属性值。
构造函数
带参数:ObjectData(int keyword, int attributeNo) //主键的具体命名和类型采用
该对象对应的关键字的名称和类型
无参数:ObjectData(int keyword):this(keyword,2)
扩展属性设置函数
属性编号:ExtendSetAttribute(int keyword, int attributeNo)
命名属性串:ExtendSetAttribute(int keyword, string attributeString)
扩展属性获取函数
public Hashtable ExtendGetAttribute(int keyword, string attributeString)
维护函数
void CreateObject("具体的数据属性参数") [修订 01]//创建对象
void ModifyObject("具体的数据属性参数") //综合修改对象
void ModifyObjectXX("具体的数据属性参数") //修改对象指定的属性,其中 XX
代表指定的属性
辅助接口
private string ParseAttributeString(int attributeNo){} //获取指定属性编号/用
户化属性串对应的标准命名属性串
private string ParseAttributeString(string attributeString){} //获取指定属性编
号/用户化属性串对应的标准命名属性串
private DataTable GetGrivenAttributeInfos(int keyword, string
attributeString){} //依据命名属性串从 DA 层获取对应的数据
private void SetAttributesFromDataTable(DataTable attributeData){} //将获取
的数据加载到对象对应的属性中
private Hashtable CreateHashtableFromDataTable(DataTable attributeData){}
//将获取的数据加载到 Hashtable 中
private void LoadObjectAttribute(int keyword, string attributeString){} //将依
据命名属性串和对象关键字实例化加载对象属性
private void LoadObjectAttribute(int keyword, int attributeNo){} //依据属性
编号和对象关键字实例化加载对象属性
private void CheckAttributeIsInitialized(string fieldName){} //检测属性的获取
是否合法,即是否初始化了
private void ResetDataRelaAttributes(){}//复位对象数据相关属性
7、 DS 层信息处理模式
系统通过 SP 来处理和访问数据,禁止任何程序中传递硬编码;
系统需要的特殊处理,需要尽量避免通过函数参数直接传递不经检验的 SQL 代
码或代码片段。目前仅仅需要直接传递配置文件中配置的和 HSF 查询规范生成
的 SQL 代码或代码片段。其余的只能传递特定字符串,再在 DS 层中生成 SQL
代码或代码片段。
所有的信息检索必须通过视图来进行,尽量避免不通过视图去访问其它对象对应
的数据表。
DS 层的实现模式如下:
8、 UI 层的检测逻辑实现规则
系统中的检测逻辑
系统的检测逻辑允许出现冗余,主要表现为 UI 层与逻辑层冗余。
系统中要求在 UI 层需要实现尽可能全面的检测逻辑。
检测逻辑的分布
UI:全面的检测逻辑
BF:分担函数参数逻辑的检测
BD:分担了对象属性参数逻辑的检测
BR:分担了复杂的检测逻辑
DS:分担了部分检测逻辑
系统中的处理逻辑
系统中的处理逻辑不能出现冗余,否则将造成逻辑错误;
处理逻辑分布
BR:关联业务逻辑处理
特定对象关联的STORE PROC
各类辅助处理对象
(触发器、约束、索引、
级联更新、删除)
特定对象对应的数据视图
(用于对象信息的批量检索)
特定对象对应的数据表
公用处理方法
DS层信息处理模式
DS:部分跨对象数据的复杂的批量数据处理的业务逻辑
9、 代码示例
环境假设
DS 层有两个数据表:Ta,Tb
属性关系,用底色表示了依赖关系
Ta Tb
字段 类型/标识 字段 类型/标识
F1 int/P F3 int/P
F2 varchar(100) F6 varchar(100)
F3 int F7 varchar(100)
F4 int([0,100])
F5 varchar(2000)
Ta 从 Tb 关联过来附属描述属性 F6。
具体代码参见《HS_DEV 》