摘 要: 软件开发的三层框架思想能使整个项目更加灵活,便于维护,并且还有利于项目的多人协作开发。本文在介绍软件复用技术和三层架构思想的基础之上,运用C#设计并实现了
一个.NET平台下的信息系统软件框架。信息系统开发时通过运用该软件三层框架可以很方便的生成一个MIS 雏形,从而能有效的提高信息系统软件的开发效率和软件标准化及构件化水平。
关键词: 软件复用;三层架构;软件框架;三层框架;c#三层框架
1 软件框架
随着软件复用技术和软件构件化思想的深入研究,现代软件系统的设计也不在是以前的程序=数据结构+算法,而更多的是对开发平台,软件框架的综合研究与设计。信息系统软件框架
是信息系统软件的一个体系结构和系统框架,他是一个半成品应用系统程序,是由信息系统中一组抽象构件以及这些构件间的接口所组成,因而在现代信息系统软件框架的设计与开发时其
主要任务就是对信息系统中可重复使用的软件骨架的主体研究与设计。在开发中一个面向对象的、可复用的信息系统软件框架已经成为一个软件开发团队的核心物质资本,而且更重要的是
信息系统软件框架将是一个新系统的开发周期、开发成本及软件维护的核心影响因子。Microsoft.Net 是Microsoft 支持下一代Internet 软件和服务的平台,作为新一代的开发平台,它彻
底支持面向对象技术,适于快速的构建灵活的,功能强大的MIS软件。本文将结合.NET 平台所提供的相关技术,构建出一个具用三层架构设计思想、面向对象、可复用的信息系统软件开发
框架。
2 三层架构思想
在管理学中有一个重要的概念即企业组织结构,企业组织结构是分层思想在企业中的重要应用,企业组织结构的目的是以求有效合理的把企业各层成员组织起来,为实现企业运作和发
展目标而相互协同努力。在软件框架的设计时,分层结构是最常见也是最重要的一种结构,虽然软件框架分层的目的和形式跟企业分层有所不同,但都有一个共同目标:以求有效合理的组
织相关构件,使其更高效的完成协同任务。在分层软件框架设计时最流行的是三层架构设计,任何一个系统从应用逻辑上对其进行抽象细分,均可划分为三层,自下至上分别为:数据访问
层(DAL 层)、业务逻辑层(BLL 层)和表示层。在软件开发设计时我们还会用到一些通用辅助类和方法,如数据库访问类、事务处理类等,为了实现各个模块之间的相互复用,在本次软
件架构设计时也将其分离出来,作为一个独立模块。在企业信息系统软件中整个系统操作的对象就是数据库中的数据表、视图等,为了便于在各层中相互传递,在设计时也将数据对象的实
体和方法进行分离,将其抽象为一个共用实体类模块。
3 软件框架的设计与实现
3.1 数据访问层的设计
数据访问层( DAL 层) :用于实现信息系统对数据库的操作,完成业务流程对数据库中数据的插入、更新等操作。在管理信息系统中用户操作相关界面完成对应的业务流程的操作,
但无论是什么业务流程最终反映到软件系统中则是对数据库中相关数据表单的数据进行操作,所业在软件框架中我们可以将数据访问进行深入抽象,将其分为数据库的查询运算、插入运算
、修改运算及删除运算。这样对应的每个业务流程只需要指定相关的数据表或视图,就可以根据表中的数据项自动生成相关数据操作。在开发中我们选择是目前使用最为广泛的关系数据库
系统的SQL2005 ,为了避免代码里出现很多SqlConnection 、SqlDataReader等类和方法,同时也为了让代码的编写及后期维护更加清晰简单,因此框架设计时我们采用了微软所提供的一
个静态类SqlHelper。SqlHelper 类通过一组静态的重载方法来封装数据访问功能,开发时可以通过调用SqlHelper 的静态方法来对数据库的进行交互运算。数据的查询、插入、修改及删
除运算在业务流程中有很多种,在软件框架设计时通过重载的方式来加以实现,下面将以数据表Storage_StockOutType 为例,通过部分操作来展示软件框架的具体实现。
3.1.1 数据查询运算
通过实体类对象查询多条记录,首先根据所选择的实体类创建查询字符串strSQL,然后调用SqlHelper 中的ExecuteReader 函数进行查询,最后将查询结果实体类对象的List 值返回:
public List<Storage_StockOutTypeInfo> GetStorage_StockOutType(Storage_StockOutType Info entity)
{ StringBuilder strSQL = new StringBuilder();
strSQL.Append("SELECT * FROM Storage_StockOutType WHERE 1=1");
if (entity.ID != 0)
{ strSQL.Append(" and ID=" + entity.ID+""); }
. //创建查询字符串strSQL
List<Storage_StockOutTypeInfo> objItems = new List<Storage_StockOutTypeInfo>();
using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnString,CommandType.Text, strSQL.ToString(), null))
{ while (rdr.Read())
{ Storage_StockOutTypeInfo objInfo = new Storage_StockOutTypeInfo();
if (rdr["ID"] != DBNull.Value)
objInfo.ID = Convert.ToInt32(rdr["ID"]);
objItems.Add(objInfo);
}
3.1.2 数据的插入运算
插入一个实体类对象,首先根据选择的实体类对象属性创建查询字符串strSQL,然后调用SqlHelper.ExecuteScalar 函数进行插入,最后返回插入后对应的ID号。
public object Insert(Storage_StoreHouseInfo entity)
{ object i = 0;
string strSQL = string.Format("INSERTINTO[Storage_StoreHouse]( [StoreHouseNumber], [Define5])VALUES( ‘{0}”{8}’)",entity.StoreHouseNumber,entity.Define5); //创
建插入字符串strSQL
strSQL += " SELECT CAST(scope_identity() AS int)";
i=SqlHelper.ExecuteScalar(SqlHelper.ConnString, CommandType.Text, strSQL, null);
}
3.1.3 数据的的修改运算
修改运算和前面几种运算的设计思想相同,首先是创建SQL 字符串,然后调用SqlHelper.ExecuteNonQuery 函数来完成对数据库的修改。
public void Edit(Storage_StoreHouseInfo entity)
{ string strSQL = string.Format("UPDATE [Storage_StoreHouse]SET[StoreHouseNumber]= ‘{0}’, WHEREID="+entity.ID+""
;,entity.StoreHouseNumber,.);
SqlHelper.ExecuteNonQuery(SqlHelper.ConnString, CommandType.Text, strSQL, null);
}
3.1.4 数据的删除运算
删除运算时因为已经知道相关记录然后再对其删除,所以删除时只需要根据ID 号即可删除对应的记录。如果要删除的是大批的记录,为了保证数据库的完整性,所以批量删除时要通
过事务处理业完成,事务处理是业务流程,因而将其放在业务层来实现。
public void Del(int id)
{ string strSQL = string.Format("DELETE FROM [Storage_StoreHouse]WHEREID=" + id + "");
SqlHelper.ExecuteNonQuery(SqlHelper.ConnString, CommandType.Text, strSQL,null);
}
业务逻辑层的设计
业务逻辑层(BLL 层):用于实现数据业务流程,该部分研究与设计在管理信息系统软件的开发过程中是系统实现的核心环节,用于对上下层之间的交互数据进行逻辑处理,实现对应
的业务目标。在软件框架设计时因业务逻辑要根据具体的业务流程来决定,所以在软件框架中该部分的设计主要是设计通用的业务接口,通过这些接口业访问数据访问层,从而完成相关业
务操作。当有独特的业务流程时我们可以对BLL 层中相关类进行继承,然后重载相关操作。例如对数据表进行插入时我们可以写成:
public static object Insert(Storage_StockOutTypeInfo entity)
{ object i=0;
using (Storage_StockOutTypeDAL dal = new Storage_StockOutTypeDAL())
{ i=dal.Insert(entity); }}
在业务流程中我经常需要对多个表单进行处理,所以在设计时我们可以实现主表与子表的同时操作,这时就需要通过事务来处理。因SqlHelper 在事务处理时只能一次连接数据库,因
而在定义事务时,我们必须传递同一个SqlConnection,为了完成相关功能我们定义了一个公共类Sql 类,在该类中我们提供静态方法完成各种特殊情况下的数据库操作,例如:
using (TransactionScope scope = new TransactionScope()) //定义事务
{ using (SqlConnection connection = new DAL.Sql().CreateConnection())
{ object ID = 0;
using (Storage_StockInDAL dal = new Storage_StockInDAL())
{ ID = dal.Insert(Storage_StockInInfo, connection); }
using (Storage_StockInContentDAL dal = new Storage_StockInContentDAL())
{
dal.Insert(Storage_StockInContentInfos, connection);
} }
scope.Complete(); }
从上面代码的实现中我们可以发现不管是什么对象和业务,我们只需要选择相关的数据表,然后根据表的数据字段就可以用相同的开发思想自动的生成不同表的数据层和业务层代码,
这样在我们的整个信息系统开发时只需设计出数据表和视图就可以通过运用这个软件框架自动生成对应信息系统的数据层和业务层骨架代码。
3.2 界面层及实体类的设计
界面层:主要实现人机交互和软件展示,负责提供一个完美的业务操作界面供用户操作相关业务,同时对用户业务操作结果进行展示。在界面层的设计时我们可以根据用户所选的不同
控件,通过GET 和SET 方法来完成实体类属性的操作,同时将实体类的值绑定到对应控件的属性上,以完成数据的自动获得与显示。因此在界面层代码生成时,只需要先选择对应的数据库
操作对象(多表时同时指定主从表及外键),然后给各数据字段指定相关显示控件,就可以运用前面的思想自动生成相关GET 和SET 操作代码。其次在信息系统软件的整个界面上通常会有
是:打印、查询、增加、删除、修改、审核、弃审等业务操作菜单及首页,上一页,下一页,最后一页等功能显示菜单,业务操作菜单操作完全相同,只是具体的业务实现有所不同,所在
现软件框架中,我们可以将业务操作菜单的框架实现,把业务流程作为接口函数在业务层去根据实际情况来实现。对于功能显示菜单,因为其功能完全相同所以其功能代码可以在框架中完
全实现。
实体类(Model):是从数据库中的表抽象出来的对象类。在数据库管理系统中存储和操作的是数据库表及视图,而在信息系统软件中操作的是对象实例,所以软件框架设计时需要把
关系数据库中的表、视图进行对象实体化。在设计时将所选择的表、视图映射为实体类中的类对象,将表中的字段通过GET 和SET 方法将其映射为对象的属性,这样就可以把数据库和MIS
业务对象进行有机的结合,从而也形成了软件框架的实体类。例如:
public class Storage_StockOutTypeInfo
{ private int _ID;
public int ID
{ get{ return this._ID; }
set{ this._ID = value; } }
public Storage_StockOutTypeInfo(int iID,, string strRemark)
{ this._ID = iID;
this._Remark = strRemark;
} }
4 结束语
本文将三层架构思想引入到.NET 平台下信息系统软件框架的设计之中,运用C#语言实现了一个比较完善的三层软件框架程序。在信息系统软件开发时可以将实际业务需求和软件框架
进行有机的结合,运用软件框架程序来自动化生成信息系统的三层架构代码。从而降低系统的耦合性,增加系统的构件化水平,使系统各层之间分工明确,基础框架模块与扩展模块之间功
能定位明确。对软件系统来说这样不仅可以缩短开发周期,降低开发成本;同时也有利于信息系统软件走向模块标准化,使软件的测试与后期的维护和升级更加方。另外一方面,随着软件
框架代码的自动生成,开发人员可以将精力从繁琐的代码编写中解脱出来,而把主要时间放在软件的业务功能流程设计之中,这样设计出来的系统将更加符合客户的实际需求,提高了软件
开发的成功率,提升了整个信息系统的业务工作性能。软件复用;三层架构;软件框架;三层框架;c#三层框架
注:本文主要内容来源于网络,由程序员百味整理编辑
相关教程:
[C#源码实例]C#三层框架数据库设计实例教程下载