feng - 云代码空间
——
.NET 采用“code-behind”代码来处理显示页面的用户交互。即每个aspx文件都对应一个“code-behind”源代码文件。通过“code-behind”实现了逻辑控制代码与脚本语言、HTML等代码的分离。本系统按照三层Web结构划分为表示层(Web)、业务层(Biz)和数据层(DAO)。表示层由Web窗体组成,实现View和Controller的功能;业务层包括业务实体组件和业务逻辑组件;数据层包括数据对象、数据访问组件等,由业务层和数据层共同实现Model的功能。通过映射MVC模式三个部分到.NET体系结构中的相应的组件,构建了基于MVC模式在.NET框架下的肉仔鸡肠胃道微生物信息分析系统应用模型。如图二所示。
View的实现
在.NET开发环境中设计视图十分便捷,View由aspx文件来实现。Visual Studio .NET在视图设计器的工具箱中提供了数据、Web窗体、组件、HTML等各种控件,同时还为我们提供了用户控件。用户控件是一种直观的可重用的模型,扩展名为.ascx。它可以是最简单HTML控件、服务器控件或多个控件嵌套构成的Web自定义控件。通过以上各种控件,我们可以像开发Windows界面一样方便的通过所见即所得的方式进行可视化设计。本系统中视图与各模块中的aspx文件相对应,aspx文件与系统中的各个用户界面相对应。
Controller的实现
.NET中的代码分离机制使View中的代码与Model及Controller中的代码能够很容易的分离。每个aspx对应了一个后端代码aspx.cs,通过aspx.cs来实现Controller的功能。每个ASP.NET页面都有一种机制,将页面中的控件所要调用的方法在一个与其分离的类中实现。这些 aspx 和 ascx 文件后端代码继承了System.UI.Web.Page的类执行控制器功能,它包括了各种初始化和控制函数。当加载aspx页面时将调用Page_Load事件,当aspx页面从内存中被卸载时将调用Page_Unload事件。如果某个控件触发页面以使其被重新加载则将调用Control Event事件。在本系统中, Controller负责接收、截取并处理用户请求、处理各种事件,通过调用Model中的业务逻辑组件来对获取各种数据对象,根据当前状态和业务操作的结果决定向客户呈现的视图,控制aspx页面的显示。以肉仔鸡肠胃道微生物信息分析系统中基本试验数据管理模块中视图ExpInfo.aspx对应的Controller为例,具体实现如下文:
public class ExpInfo: System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgExpInfoList; // 声明DataGrid控件
ExpInfoBiz expInfo = new ExpInfoBiz(); //实例化对应业务逻辑类
private void Page_Load(object sender, System.EventArgs e)
{
if(!IsPostBack) //是否为响应客户端回发而加载该页
{
this.BindDataExpInfo();
}
}
public void BindDataExpInfo() //绑定数据方法
{
DataSet Ds = new DataSet(); //定义DataSet对象
Ds = expInfo.GetExpInfo(); //调用业务逻辑类中的方法,由GetExpInfo()调用DAO内方法获取试验信息的数据集
this. dgExpInfoList.DataSource = Ds.Tables[0].DefaultView; //获取数据源
this. dgExpInfoList.DataBind();//绑定控件到指定数据源
}
}
Model的实现
Model用来管理应用程序域的行为和数据。在本系统中将业务逻辑、与数据库连接和交互的公共操作封装在单独的类中,用专门的类来处理业务逻辑和数据逻辑,提高了代码的重用性。具体实现方式为:在公用的基本类库中,定义DataBase类作为数据库操作的基本类。在DataBase类中与数据库连接和交互的公共操作的方法之一的实现代码如下文:
public class DataBase // 对数据库操作的基本类
{
public DataSet RunProc(string SQL) // 执行SQL语句,返回DataSet对象
{
SqlConnection = new SqlConnection(ConnStr); // 建立SQL连接
SqlDataAdapter Da = new SqlDataAdapter(SQL,Conn); // 创建SqlDataAdapter对象并实现连接的打开和关闭
DataSet Ds = new DataSet();// 创建DataSet对象
Da.Fill(Ds); // 填充数据到DataSet中
Da.Dispose(); // 释放SqlConnection对象
return Ds; // 返回DataSet对象
}
}
应用程序在DAO中引用公用基本类中的方法RunProc()来获取数据对象:
public class ExpInfoDao:BaseObjectDTO // 继承所有数据对象的基类BaseObjectDTO
{
public DataSet GetExpInfo() // 从数据库中获取试验信息
{
string sql ="select * from ExpInfo"; //SQL查询语句
return DB.RunProc(sql); //调用数据库操作的基本类中RunProc()方法
}
}
Controller不直接对Model中的数据逻辑进行操作,而是通过业务逻辑获取DAO层中的数据对象。Biz层由.cs文件组成,其中业务逻辑组件封装了具体的处理逻辑。以下为最简单的返回一个DataSet的处理逻辑。
public class ExpInfoBiz
{
ExpInfoDAO expInfo = new ExpInfoDAO(); //实例化对应数据逻辑类
public DataSet GetExpInfo() // 得到包含试验信息的一个DataSet
{
return expInfo.GetExpInfo(); //调用DAO层ExpInfoDAO类中的GetExpInfo()方法
}
}
最后,Controller中的事件调用业务逻辑方法,并且把响应提交到对应的视图组件以产生响应,完成客户端表单数据的描述。