目录
1文档介绍 (2)
1.1 文档目的 (2)
1.2 读者对象 (2)
1.3 参考文档 (2)
1.4 术语与缩写解释 (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开发框架》https://www.doczj.com/doc/531824420.html,/Default.aspx
《Spring开发框架》https://www.doczj.com/doc/531824420.html,/
1.4术语与缩写解释
2框架介绍
2.1框架整体组织结构
客户端https://www.doczj.com/doc/531824420.html,程序集数据库
用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层。它提供了一个统一调用的方法:
调用有返回对象的业务外观方法
///
///调用对象的业务外观方法
///
///项目名称
///业务方法名
///统一参数对象
///
public static ReturnObject InvokeMethod(string projectName, string facadeMethodName, ParamObject paramObject)
其中第一个参数定义了调用的业务方法名;第二个参数定义了一个业务方法名;第三个参数是一个统一参数对象;返回只是一个统一返回对象。
这样做的目的是:
1)当业务逻辑的接口发生变化时不影响web页面调用的方法。
2)当业务实体变化时不会影响调用参数的改动。
3)在web层和应用层之间建立了了统一的调用接口,便于维护和web服务调用。
ParamObject对象定义如下:
///
///业务外观统一参数对象类
///
[Serializable()]
public class ParamObject
{
private DataSet data;
///
/// DataSet类型参数
///
public DataSet Data
{
get
{
return data;
}
set
{
data = value;
}
}
private ParamInfo[] param;
///
/// ParamInfo[]类型参数
///
public ParamInfo[] Params {
get
{
return param;
}
set
{
param = value;
}
}
private string sql;
///
/// SQL字符串类型参数
///
public string SQL
{
get
{
return sql;
}
set
{
sql = value;
}
}
private string userID;
///
///用户ID
///
public string UserID
{
get
{
return userID;
}
set
{
userID = value; }
}
private string corpID;
///
///公司ID
///
public string CorpID
{
get
{
return corpID;
}
set
{
corpID = value;
}
}
private string orgID;
///
///机构ID
///
public string ORGID
{
get
{
return orgID;
}
set
{
orgID = value;
}
}
}
其中DataSet用于Web界面向业务层传递对象;ParamInfo[]用于Web界面向业务层传递查询参数;SQL用于Web界面向业务层传递SQL语句;UserID、CorpID、ORGID用于Web 界面向业务层传递用户、公司、机构等相关信息,以便后谈可以判断此操作的权限和处理相应的日志信息。
ReturnObject对象定义如下:
///
///业务外观统一返回对象类
[Serializable()]
public class ReturnObject
{
///
///构造函数
///
public ReturnObject()
{
}
private int flag;
///
///返回类型的标示
///
public int Flag
{
get
{
return this.flag;
}
set
{
this.flag = value;
}
}
private string msg;
///
///返回类型的信息
///
public string Msg
{
get
{
return this.msg;
}
set
{
this.msg = value;
}
}
private object values;
///返回类型的值(可以是对象数组,也可以是DataSet)
///
public object Values
{
get
{
return this.values;
}
set
{
this.values = value;
}
}
}
其中Flag用于业务层返回Web界面的操作成功标示,表示此次操作是否成功;MSG用于业务层返回Web界面的成功或错误提示信息;V alues用于业务层返回Web界面的返回值,可以是对象数组。
业务外观对象必须将web页面传递来的ParamObject参数转换成相应的对象,然后再通过业务代理调用业务逻辑。其中FrameworkCore框架提供了这种soap与业务实体相互转换的接口。接口在FrameworkCore框架下的DaoUntility对象中被定义。具体如下:
1)将对象转换成DataTable
///
///将对象转换成DataTable
///
///对象
///
public static DataTable ConvertToTable(IModel model)
2)将对象数组转换成DataTable
///
///将对象数组转换成DataTable
///
///对象数组
///
public static DataTable ConvertToTable(IModel[] models)
3)将对象集转换成DataTable
///
///将对象集转换成DataTable
///
///对象集
///
public static DataTable ConvertToTable(IList list)
4)根据对象类型将DataTable转换成对象列表
///
///根据对象类型将DataTable转换成对象列表
///
///DataTable
///对象类型
///
public static IList ConvertToIList(DataTable dt,Type modelType)
5)根据对象类型将DataTable转换成对象数组
///
///根据对象类型将DataTable转换成对象数组
///
///DataTable
///对象类型
///
public static IModel[] ConvertToIModel(DataTable dt,Type modelType)
6)根据对象类型将DataRow转换成对象
///
///根据对象类型将DataRow转换成对象
///
///DataRow
///对象类型
///
public static IModel ConvertDataRowToIModel(DataRow dr, Type modelType)
当然业务外观对象也可以用New的方式直接创建,然后调用(这里就不在详细阐述)。
2.1.
3.2 业务逻辑
业务逻辑是系统业务的主体。他不直接操作数据库去处理业务实体,而是通过数据访问来使业务实体数据持久化。业务逻辑的方法接受的参数不再是基于soap的消息了,而是业务实体对象。在业务外观调用业务逻辑的时候,可以直接调用,也可以通过AOP代理调用,这取决于您在哪一层(外观层/逻辑层)上起事务。例如:某业务方法假设在业务逻辑层起事务,那么FrameworkCore 框架约定该业务方法必须能找到他所对应的方法接口(即该方法所在的业务对象类必须继承于有该方法接口的接口)。不满足这个条件的业务方法调用将产生错误。这在后面的业务方面单元内会作很详细地介绍。
2.1.
3.3 业务实体
业务实体是所有业务逻辑用来存储数据库数据所需的一种有结构定义的对象。在FrameworkCore中定义了所有的业务实体对象的基类IModel对象。
IModel定义如下:
///
///实体对象的基类
///
[Serializable(),EntityType()]
public abstract class IModel
{
///
///实体对象数组的定义
///
[Column(FromTable=false)]
protected IModel this[int i]
{
get { return this[i]; }
set { this[i] = value; }
}
private string loginUserID;
///
///使用业务实体对象的用户ID
///
[Column(FromTable=false)]
public string LoginUserID
{
set
{
this.loginUserID = value;
}
get
{
return this.loginUserID;
}
}
///
///将IModel对象转换成字符串
///
///
public override string ToString()
{
return SerializableConvertor.ConvertObjectToString(this);
}
///
///将IModel字符串转换成IModel对象
///
///IModel字符串
///
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定义如下:
///
///自定义主键对象
///
[Serializable()]
[Table(TableName = "EntitySerialNO")]
public class EntitySerialNO : IModel
{
private System.String _memo;
///
///自定义主键的备注
///
public System.String memo
{
get { return _memo; }
set { _memo = value; }
}
private System.String _entity_prefix;
///
///自定义主键的前缀
///
public System.String entity_prefix
{
get { return _entity_prefix; }
set { _entity_prefix = value; }
}
private System.Int32 _entity_seq_length;
///
///自定义主键的自增长数字的长度
///
public System.Int32 entity_seq_length
{
get { return _entity_seq_length; }
set { _entity_seq_length = value; } }
private System.String _entity_type;
///
///自定义主键的对象类别
///
[Column(IsIdentity=true)]
public System.String entity_type
{
get { return _entity_type; }
set { _entity_type = value; }
}
private System.String _entity_date;
///
///自定义主键的生成日期
///
public System.String entity_date
{
get { return _entity_date; }
set { _entity_date = value; }
}
private System.Int32 _entity_value;
///
///自定义主键的下一个值
///
public System.Int32 entity_value
{
get { return _entity_value; }
set { _entity_value = value; } }
private System.Int32 _CorpID;
///
///公司ID
///
public System.Int32 CorpID
{
get { return _CorpID; }
set { _CorpID = value; }
}
private String _date_format;
///
///自定义主键生成日期的格式
///
public String date_format
{
get { return _date_format; }
set { _date_format = value; }
}
private Int32 _add_value;
///
///自增长位的递增数
///
public Int32 add_value
{
get { return _add_value; }
set { _add_value = value; }
}
private String _entity_suffix;
///
///自定义主键的后缀
///
public String entity_suffix
{
get { return _entity_suffix; }
set { _entity_suffix = value; }
}
private Int32 _default_value;
///
///自增长位的初始值
///
public Int32 default_value
{
get { return _default_value; }
set { _default_value = value; }
}
private Int32 _serial_no;
///
/// int类型自增主键值
///
public Int32 serial_no
{
get { return _serial_no; }
set { _serial_no = value; }
}
}
另外,如果用NHibernate做数据访问层,那所有的业务实体对象不仅要有结构定义,还要有与数据库中表的关系映射(即O/R Mapping)。
EntitySerialNO的O/R Mapping文件定义如下:
在
由于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和https://www.doczj.com/doc/531824420.html,交互来支持这一块的功能。在FrameworkCore框架中共定义了四种Dao对象类型接口,具体如下:
1)IDao:定义所有对象访问数据库的操作接口。
///
/// Dao定义接口
///
public interface IDao
{
///
///插入对象
///
///对象
void Insert(IModel model);
///
///删除对象
///
///对象
void Delete(IModel model);
///
///通过主键删除对象
///
///对象主键
void DeleteById(string id);
///
///更新(修改)对象
///
///对象
void Update(IModel model);
///
///根据主键查询对象
///
///对象主键
///
IModel QueryById(string id);
///
///根据hql查询语句查询对象数组
///
///hql查询语句
///
IModel[] QueryByHql(string hql);
///
///根据param参数数组查询对象数组
///
///查询的参数数组 ///
IModel[] QueryByParam(ParamInfo[] paraminfos);
///
///根据对象主键判断数据库中是否存在该对象
///
///对象主键
///
bool Exist(string id);
}
2)ISerialDao:继承了IDao接口,还定义了获取自增长序号的方法。
///
///自定义主键定义接口
///
public interface ISerialDao : IDao
{
///
///获取自定义主键
///
///
string GetSerialNO();
}
3)IDBDao接口:提供对数据库复杂查询寄存处过程的调用接口(目前只提供对SQL Server
和Oracle数据库的支持)。
///
/// IDBDao定义接口
///
public interface IDBDao
{
///
///执行查询存储过程
///
///存储过程名
///传入的参数,包括参数值(其中:Oracle为OracleParameter[];SqlServer为SqlParameter[];框架自动转换DBParameter为IDataParamter)
///
///
/// System.Data.OracleClient.OracleParameter[] parameters = { new
OracleParameter("var_begin", OracleType.NVarChar),
/// new OracleParameter("var_end", OracleType.NVarChar),
/// new OracleParameter("var_carrier", OracleType.NVarChar),
/// new OracleParameter("var_carriername", OracleType.NVarChar),
///new OracleParameter("cur_bill", OracleType.Cursor, 2000, ParameterDirection.Output, true, 0, 0, "",
/// DataRowVersion.Default, Convert.DBNull) };
/// parameters[0].Value = this.calStat.FromDateValue;
/// parameters[1].Value = this.calStat.ToDateValue;
/// parameters[2].Value = txtCarrier.Value.Trim();
/// parameters[3].Value = txtCarrier.Text.Trim();
///
///
///
DataSet ExecuteStoredProcedureWithQuery(string procName, IDataParameter[] parameters);
///
///
///
///存储过程名
///传入的参数,包括参数值(框架自动将其转为相应的IDataParameter类型)
///
DataSet ExecuteStoredProcedureWithQuery(string procName, DBParameter[] parameters);
///
///执行无查询存储过程
///
///存储过程名
///传入的参数,包括参数值
///
int ExecuteStoredProcedureWithNonQuery(string procName, IDataParameter[] parameters);
///
///执行无查询存储过程
///
///存储过程名
///传入的参数,包括参数值(框架自动将其转为相应的IDataParameter类型)
///
int ExecuteStoredProcedureWithNonQuery(string procName, DBParameter[] parameters);
///
///根据SQL语句查询数据并返回DataSet对象
///
///SQL语句
///
DataSet QueryBySQL(string sql);
}
4)ISerialDBDao接口:利用https://www.doczj.com/doc/531824420.html,对数据库进行增删改操作(目前只提供对SQL Server
和Oracle数据库的支持)。
///
/// SerialDBDao定义接口
///
public interface ISerialDBDao : ISerialDao
{
///
///根据主键查询
///
///对象主键
///
DataTable QueryTableById(string id);
///
///根据hql查询语句查询
///
///hql查询语句
///
DataTable QueryTableByHql(string hql);
///
///根据param参数数组查询
///
///查询的参数数组
///
DataTable QueryTableByParam(ParamInfo[] paraminfos);
///
///获取int类型的自增长主键
///
///
int GetIdentity();
}
5)ISerialDBQuery接口:提供Web界面数据自定义分页的接口(目前只提供对SQL Server
和Oracle数据库的支持)。
///
/// SerialDBQuery定义接口
///
public interface ISerialDBQuery
{
///
///设置查询的参数
///
///
///
void SetParameter(string name, object val);
///
///设置返回查询结果中的起始位置
///
///