软件开发框架设计说明书
发布时间:2024-08-25
发布时间:2024-08-25
软件开发框架设计说明书、软件开发、框架设计说明书
目 录
1
文档介绍.............................................................................................................................................. 2 1.1 1.2 1.3 1.4 2
文档目的 ...................................................................................................................................... 2 读者对象 ...................................................................................................................................... 2 参考文档 ...................................................................................................................................... 2 术语与缩写解释 .......................................................................................................................... 2
框架介绍.............................................................................................................................................. 3 2.1 框架整体组织结构 ...................................................................................................................... 3 2.1.1 数据库层 .............................................................................................................................. 4 2.1.2 Web层 ................................................................................................................................. 4 2.1.3 表示层 ................................................................................................ 错误!未定义书签。 2.1.4 应用层 .................................................................................................................................. 4 2.2 框架内部组织结构 .................................................................................................................... 32 2.2.1 框架依赖关系 .................................................................................................................... 32 2.2.2 框架目录结构 .................................................................................................................... 37 2.3 框架配置文件说明 .................................................................................................................... 38
软件开发框架设计说明书、软件开发、框架设计说明书
1 文档介绍
1.1 文档目的
本文档的目的在于提供开发团队一个底层的架构体系,使团队的成员把开发重点更多地移到对业务逻辑的开发和用户体验上,而无需考虑其他(如数据库,日志等)底层的操作上。从而进一步规范代码的编写和提升代码的质量。使被开发的系统更容易维护和重用。 有什么好的建议的话,敬请提出.,^_^.
1.2 读者对象
本文档提供给软件事业部全体人员
1.3 参考文档
《Nhibernate开发框架》 http://www.77cn.com.cn/Default.aspx 《Spring开发框架》http://www.77cn.com.cn/
1.4 术语与缩写解释
软件开发框架设计说明书、软件开发、框架设计说明书
2 框架介绍
2.1 框架整体组织结构
客户端
Web
.NET程序集
数据库
用FrameworkCore开发框架开发的应用程序的主要结构如上图所示。
按部署情况将应用程序分为三层: 数据库层 应用服务层 表示层
其中:应用服务层是FrameworkCore框架的核心。每一层的逻辑调用主要按图中箭头方向所示。
软件开发框架设计说明书、软件开发、框架设计说明书
2.1.1 数据库层
数据库层主要是依赖于数据库来帮应用程序完成工作。如:存储数据,处理并发,视图,存储过程,数据备份和恢复等。FrameworkCore框架支持多种主流的数据库,如:MS SQL Server,Oracle,DB2,Sybase,Infomix,MySql等等。这一层主要部署在数据库服务器上。
2.1.2 表示层
表示层主要是对界面的处理。包括对web和win界面的访问、页面的布局、控件的操作等处理。FrameworkCore框架在这一层主要是获取页面的权限信息提供Web层处理。 这一层B/S架构的主要部署在Web服务器上,C/S架构的部署在客户端上。
2.1.3 应用服务层
应用服务层是FrameworkCore的核心所在,也是业务逻辑应用的核心类库。 首先,我们先了解一下应用FrameworkCore框架的应用层的层体系结构:
2.1.3.1 业务外观
业务外观是表示层与应用服务层交互的接口。他提供给表示层统一的接口调用。在FrameworkCore框架中定义了FacadeManager类,它通过反射机制实例化业务方法名所对应的业务外观对象,然后将调用结果返回给web层。它提供了一个统一调用的方法:
软件开发框架设计说明书、软件开发、框架设计说明书
调用有返回对象的业务外观方法
/// <summary>
/// 调用对象的业务外观方法 /// </summary>
/// <param name="projectName">项目名称</param> /// <param name="facadeName">业务方法名</param> /// <param name="paramObject">统一参数对象</param> /// <returns>统一返回对象</returns>
public static ReturnObject InvokeMethod(string projectName, string facadeMethodName, ParamObject paramObject)
其中第一个参数定义了调用的业务方法名;第二个参数定义了一个业务方法名;第三个参数是一个统一参数对象;返回只是一个统一返回对象。 这样做的目的是:
1) 当业务逻辑的接口发生变化时不影响web页面调用的方法。 2) 当业务实体变化时不会影响调用参数的改动。
3) 在web层和应用层之间建立了了统一的调用接口,便于维护和web服务调用。
ParamObject对象定义如下:
/// <summary>
/// 业务外观统一参数对象类 /// </summary> [Serializable()]
public class ParamObject {
private DataSet data; /// <summary> /// DataSet类型参数 /// </summary> public DataSet Data { get {
return data; } set {
data = value; } }
private ParamInfo[] param; /// <summary>
/// ParamInfo[]类型参数
软件开发框架设计说明书、软件开发、框架设计说明书
/// </summary>
public ParamInfo[] Params { get {
return param; } set {
param = value; } }
private string sql; /// <summary> /// SQL字符串类型参数 /// </summary> public string SQL { get {
return sql; } set {
sql = value; } }
private string userID; /// <summary> /// 用户ID /// </summary> public string UserID { get {
return userID; } set {
userID = value; } }
软件开发框架设计说明书、软件开发、框架设计说明书
private string corpID; /// <summary> /// 公司ID /// </summary> public string CorpID { get {
return corpID; } set {
corpID = value; } }
private string orgID; /// <summary> /// 机构ID /// </summary> public string ORGID { get {
return orgID; } set {
orgID = value; }
} }
其中DataSet用于Web界面向业务层传递对象;ParamInfo[]用于Web界面向业务层传递查询参数;SQL用于Web界面向业务层传递SQL语句;UserID、CorpID、ORGID用于Web界面向业务层传递用户、公司、机构等相关信息,以便后谈可以判断此操作的权限和处理相应的日志信息。
ReturnObject对象定义如下:
/// <summary>
/// 业务外观统一返回对象类
软件开发框架设计说明书、软件开发、框架设计说明书
/// </summary> [Serializable()]
public class ReturnObject
{
/// <summary> /// 构造函数 /// </summary> public ReturnObject() {
}
private int flag; /// <summary> /// 返回类型的标示 /// </summary>
public int Flag { get { return this.flag;
} set { this.flag = value; }
}
private string msg; /// <summary> /// 返回类型的信息 /// </summary> public string Msg { get { return this.msg;
} set { this.msg = value; }
}
private object values;
软件开发框架设计说明书、软件开发、框架设计说明书
}
/// <summary>
/// 返回类型的值(可以是对象数组,也可以是DataSet) /// </summary> public object Values { }
get { } set { }
this.values = value; return this.values;
其中Flag用于业务层返回Web界面的操作成功标示,表示此次操作是否成功;MSG用于业务层返回Web界面的成功或错误提示信息;Values用于业务层返回Web界面的返回值,可以是对象数组。 业务外观对象必须将web页面传递来的ParamObject参数转换成相应的对象,然后再通过业务代理调用业务逻辑。其中FrameworkCore框架提供了这种soap与业务实体相互转换的接口。接口在FrameworkCore框架下的DaoUntility对象中被定义。具体如下:
1) 将对象转换成DataTable
/// <summary>
/// 将对象转换成DataTable /// </summary>
/// <param name="models">对象</param> /// <returns>DataTable</returns>
public static DataTable ConvertToTable(IModel model)
2) 将对象数组转换成DataTable
/// <summary>
/// 将对象数组转换成DataTable /// </summary>
/// <param name="models">对象数组</param> /// <returns>DataTable</returns>
public static DataTable ConvertToTable(IModel[] models)
3) 将对象集转换成DataTable
/// <summary>
/// 将对象集转换成DataTable /// </summary>
/// <param name="list">对象集</param>
软件开发框架设计说明书、软件开发、框架设计说明书
/// <returns>DataTable</returns>
public static DataTable ConvertToTable(IList list)
4) 根据对象类型将DataTable转换成对象列表
/// <summary>
/// 根据对象类型将DataTable转换成对象列表 /// </summary>
/// <param name="dt">DataTable</param> /// <param name="modelType">对象类型</param> /// <returns>对象列表</returns>
public static IList ConvertToIList(DataTable dt,Type modelType)
5) 根据对象类型将DataTable转换成对象数组
/// <summary>
/// 根据对象类型将DataTable转换成对象数组 /// </summary>
/// <param name="dt">DataTable</param> /// <param name="modelType">对象类型</param> /// <returns>对象数组</returns>
public static IModel[] ConvertToIModel(DataTable dt,Type modelType)
6) 根据对象类型将DataRow转换成对象
/// <summary>
/// 根据对象类型将DataRow转换成对象 /// </summary>
/// <param name="dr">DataRow</param> /// <param name="modelType">对象类型</param> /// <returns>对象</returns>
public static IModel ConvertDataRowToIModel(DataRow dr, Type modelType)
当然业务外观对象也可以用New的方式直接创建,然后调用(这里就不在详细阐述)。
2.1.3.2 业务逻辑
业务逻辑是系统业务的主体。他不直接操作数据库去处理业务实体,而是通过数据访问来使业务实体数据持久化。业务逻辑的方法接受的参数不再是基于soap的消息了,而是业务实体对象。在业务外观调用业务逻辑的时候,可以直接调用,也可以通过AOP代理调用,这取决于您在哪一层(外观层/逻辑层)上起事务。例如:某业务方法假设在业务逻辑层起事务,那么FrameworkCore框架约定该业务方法必须能找到他所对应的方法接口(即该方法所在的业务对象类必须继承于有该方法接口的接口)。不满足这个条件的业务方法调用将产生错误。这在后面的业务方面单元内会作很详细地介绍。
软件开发框架设计说明书、软件开发、框架设计说明书
2.1.3.3 业务实体
业务实体是所有业务逻辑用来存储数据库数据所需的一种有结构定义的对象。在FrameworkCore中定义了所有的业务实体对象的基类IModel对象。 IModel定义如下: /// <summary>
/// 实体对象的基类 /// </summary>
[Serializable(),EntityType()] public abstract class IModel { /// <summary>
/// 实体对象数组的定义 /// </summary>
[Column(FromTable=false)]
protected IModel this[int i] { get { return this[i]; } set { this[i] = value; }
}
private string loginUserID; /// <summary>
/// 使用业务实体对象的用户ID /// </summary>
[Column(FromTable=false)]
public string LoginUserID { set {
this.loginUserID = value;
} get { return this.loginUserID; }
}
/// <summary>
/// 将IModel对象转换成字符串 /// </summary>
/// <returns>IModel字符串</returns> public override string ToString()
软件开发框架设计说明书、软件开发、框架设计说明书
{
return SerializableConvertor.ConvertObjectToString(this); }
/// <summary>
/// 将IModel字符串转换成IModel对象 /// </summary>
/// <param name="modelStr">IModel字符串</param> /// <returns>IModel对象</returns> public IModel FromString(string modelStr) {
object obj = SerializableConvertor.ConvertStringToObj(modelStr); if (obj != null) {
return obj as IModel; } else {
return null; } }
}
所有继承IModel对象的业务实体对象都能被FrameworkCore框架识别出并进行处理。 FrameworkCore框架还定义了一个自增长序号EntitySerialNO对象,它能提供所有业务实体对象ID的自增长序号。 EntitySerialNO定义如下: /// <summary>
/// 自定义主键对象 /// </summary> [Serializable()]
public class EntitySerialNO : IModel {
private System.String _memo; /// <summary> /// 自定义主键的备注 /// </summary>
public System.String memo { }
private System.String _entity_prefix;
get { return _memo; } set { _memo = value; }
[Table(TableName = "EntitySerialNO")]
软件开发框架设计说明书、软件开发、框架设计说明书
/// <summary> /// 自定义主键的前缀 /// </summary>
public System.String entity_prefix { }
private System.Int32 _entity_seq_length; /// <summary>
/// 自定义主键的自增长数字的长度 /// </summary>
public System.Int32 entity_seq_length { }
private System.String _entity_type; /// <summary>
/// 自定义主键的对象类别 /// </summary>
public System.String entity_type { }
private System.String _entity_date; /// <summary>
/// 自定义主键的生成日期 /// </summary> { }
private System.Int32 _entity_value; /// <summary>
/// 自定义主键的下一个值 /// </summary>
get { return _entity_date; } set { _entity_date = value; } get { return _entity_type; } set { _entity_type = value; } get { return _entity_seq_length; } set { _entity_seq_length = value; } get { return _entity_prefix; } set { _entity_prefix = value; }
[Column(IsIdentity=true)]
public System.String entity_date
软件开发框架设计说明书、软件开发、框架设计说明书
public System.Int32 entity_value { get { return _entity_value; } set { _entity_value = value; }
}
private System.Int32 _CorpID; /// <summary> /// 公司ID /// </summary>
public System.Int32 CorpID {
get { return _CorpID; } set { _CorpID = value; } }
private String _date_format; /// <summary>
/// 自定义主键生成日期的格式 /// </summary>
public String date_format {
get { return _date_format; } set { _date_format = value; } }
private Int32 _add_value; /// <summary> /// 自增长位的递增数 /// </summary>
public Int32 add_value {
get { return _add_value; } set { _add_value = value; } }
private String _entity_suffix; /// <summary> /// 自定义主键的后缀 /// </summary>
public String entity_suffix {
get { return _entity_suffix; } set { _entity_suffix = value; }
软件开发框架设计说明书、软件开发、框架设计说明书
}
private Int32 _default_value; /// <summary> /// 自增长位的初始值 /// </summary>
public Int32 default_value {
get { return _default_value; } set { _default_value = value; } }
private Int32 _serial_no; /// <summary> /// int类型自增主键值 /// </summary>
public Int32 serial_no {
get { return _serial_no; } set { _serial_no = value; } }
}
另外,如果用NHibernate做数据访问层,那所有的业务实体对象不仅要有结构定义,还要有与数据库中表的关系映射(即O/R Mapping)。
EntitySerialNO的O/R Mapping文件定义如下:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.0">
<class name="FrameworkCore.Entity.EntitySerialNO, FrameworkCore" table="EntitySerialNO"> <id name="entity_type" column="entity_type" type="String" > <generator class="assigned" /> </id>
<property name="CorpID" column="CorpID" type="Int32" />
<property name="entity_prefix" column="entity_prefix" type="String" /> <property name="entity_value" column="entity_value" type="Int32" /> <property name="entity_date" column="entity_date" type="String" /> <property name="date_format" column="date_format" type="String" />
<property name="entity_seq_length" column="entity_seq_length" type="Int32" /> <property name="add_value" column="add_value" type="Int32" /> <property name="default_value" column="default_value" type="Int32" /> <property name="serial_no" column="serial_no" type="Int32" />
<property name="entity_suffix" column="entity_suffix" type="String" /> <property name="memo" column="memo" type="String" /> </class>
软件开发框架设计说明书、软件开发、框架设计说明书
</hibernate-mapping>在
<class name="FrameworkCore.Entity.EntitySerialNO, FrameworkCore" table="EntitySerialNO">中属性
name定义的是实体对象类名,以“命名空间+类名,装配件名”表示,table属性定义的数据库中的表名。在<id name="entity_type" column="entity_type">中name属性定义的是实体对象中的属性名,column属性定义的是数据库表中的主键名。在<property name="entity_prefix" column="entity_prefix" />中name属性定义的仍然是实体对象中的属性名,而column属性定义的是数据库表中的字段名。 由于FrameworkCore框架在数据持久层采用Nhibernate框架,所以上面的O/R Mapping内容将被保存在名为EntitySerialNO.hbm.xml的文件中,且要在VS2003中被设为潜入的资源,以便被Nhibernate调用。
EntitySerialNO的数据库定义如下:
create table dbo.EntitySerialNO (
entity_type nvarchar(50) not null, CorpID int not null, entity_prefix nvarchar(50) null, serial_no int not null, entity_value int null, entity_date datetime null, date_format nvarchar(50) null, entity_seq_length int null, add_value int null, default_value int null, entity_suffix nvarchar(50) null, memo nvarchar(50) null, constraint PK_ENTITYSERIALNO primary key (entity_type) ) go
2.1.3.4 数据访问
数据访问对象的目的是将业务逻辑与数据库进行隔离,以便使业务逻辑能支持更多的数据库而无需修改一行代码。FrameworkCore框架主要是使用Nhibernate和http://www.77cn.com.cn交互来支持这一块的功能。在FrameworkCore框架中共定义了四种Dao对象类型接口,具体如下:
1) IDao:定义所有对象访问数据库的操作接口。 /// <summary>
/// Dao定义接口 /// </summary> public interface IDao {
/// <summary> /// 插入对象 /// </summary>
/// <param name="model">对象</param> void Insert(IModel model);