参考资料:http://book.51cto.com/art/200906/131383.htm
通过一个简单的登录功能实现,讲述如何搭建三层结构。
1.搭建数据访问层
(1)打开VS 2005开发环境,依次选择"文件"→"新建"→"项目"命令
(2)在打开的"新建项目"对话框中,选择项目类型为"Visual Studio解决方案",选择模板为"空白解决方案"。然后填写解决方案的名称为"Chat",并指定保存位置
(3)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加"→"新建项目"命令
(4)在打开的"新建项目"对话框中,选择项目类型为"Visual C#",选择模板为"类库"。填写项目的名称为"DAL",该项目用于实现数据访问层。此时项目的保存位置已经默认输入了,是刚才创建空白解决方案时产生的路径
2.搭建业务逻辑访问层
搭建业务逻辑层的步骤与搭建数据访问层类似,不同的是需要重新填写项目名称为"BLL",
3.搭建表示层
(1)在"解决方案资源管理器"中,在解决方案名称上单击鼠标右键,在弹出的快捷菜单中选择"添加"→"新建网站"命令
(2)在打开的"添加新网站"对话框中,选择"ASP.NET网站",选择位置为"文件系统",并设置网站的路径
在三层结构开发中,通常还会使用模型层。模型层包含所有与数据库中的表相对应的实体类。表示层、业务逻辑层和数据访问层三层之间通过传递实体对象来达到数据传递的目的。
创建模型层的步骤与搭建业务逻辑层和数据访问层类似,不同的是需要重新填写项目名称为"Models",
此时,在"解决方案资源管理器"中,三层结构的基本框架如图4所示
4.添加各层之间依赖关系
此时,虽然三层结构的基本框架已经搭建成功,但是各层之间是独立的。只有添加依赖关系,才能让它们相互协作。
(1)添加表示层对业务逻辑层及模型层的依赖。在"解决方案资源管理器"中,在表示层上单击鼠标右键,在弹出的快捷菜单中选择"添加引用"命令
(2)在打开的"添加引用"对话框中,选择"项目"选项卡,选中项目名称为"BLL"和"Models"的两个项目,单击"确定"按钮,
(3)使用上述方法在业务逻辑层中添加对数据访问层和模型层的依赖,以及数据访问层对模型层的依赖。
至此,三层结构及各层之间的依赖关系创建完毕。下面以登录为例,测试各层之间如何协同工作的。
1)编写实体类User.cs
在模型层中,将默认的类名Class1.cs重命名为"User.cs",该实体类与数据库Chat中的表User相对应。实体类User.cs中部分代码如下:
Codeusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MODEL
{
public class User
{
声明用户属性#region 声明用户属性
//用户ID
public int UserID
{ get; set; }
//用户名
public string UserName
{ get; set; }
//用户密码
public string Pwd
{ get; set; }
//用户电子邮箱
public string Email
{ get; set; }
//用户积分
public int Score
{ get; set; }
#endregion
public User()
{
}
}
}
2)编写数据访问类UserService
针对模型层中的每个实体类,数据访问层有一个对应的数据访问类。例如,针对User实体类,创建一个对应的UserService类,用于对数据表Users的数据处理。
在UserService类中添加一个根据登录名进行查询的方法,代码如下:
Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using MODEL;
namespace DAL
{
public class UserService
{
#region 根据用户名,返回用户实体
/// <summary>
/// 根据用户名,返回用户实体
/// </summary>
/// <param name="strUserName">用户名</param>
/// <returns>User</returns>
public static User GetUserByUserName(string strUserName)
{
//根据用户名,查询是否存在此用户
string strSqlGetUser = "select * from T_User where UserName=@UserName";
SQLHelp help = new SQLHelp();
SqlDataReader dr = null;
SqlParameter[] para = {
new SqlParameter ("@UserName",strUserName)
};
//根据用户名,返回dataReader对象
dr = help.GetDRWithPara(strSqlGetUser, para);
//数据流中是否有数据
if (dr.Read())
{
//声明User对象,将数据流中的值赋给User对象
User newUser = new User();
newUser.UserID = Convert.ToInt32(dr["UserID"]);
newUser.UserName = dr["UserName"].ToString();
newUser.Pwd = dr["Pwd"].ToString();
newUser.Email = dr["Email"].ToString();
newUser.Score = Convert.ToInt32(dr["Score"]);
//关闭SqlDataReader对象,此时连接同时关闭
//详见SQLHelp:GetDRWithPara(string cmdText, SqlParameter[] para)
//mycom.ExecuteReader(CommandBehavior.CloseConnection);
dr.Close();
return newUser;
}
else
{
dr.Close();
return null;
}
}
#endregion
}
}
代码中使用到的SQLHelp类详见
3)编写业务逻辑类UserManager
针对模型层中的每个实体类,业务逻辑层中也有一个对应的类。例如,针对User实体类,创建一个对应的UserManager类。
在UserManager类中添加用于登录验证的业务方法,其代码如下:
Codeusing System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MODEL;
using DAL;
namespace BLL
{
public class UserManager
{
/**//// <summary>
/// 验证用户登录
/// </summary>
/// <param name="strUserName">用户名</param>
/// <param name="Pwd">密码</param>
/// <param name="validUser">输出参数(User类型对象)</param>
/// <returns>User类型对象</returns>
public static bool Login(string strUserName, string Pwd, out User validUser)
{
//根据用户名获取用户信息,调用DAL层方法
User newUser = UserService.GetUserByUserName(strUserName);
//不存在此用户
if (newUser == null)
{
validUser = null;
return false;
}
//密码错误
if (newUser.Pwd == Pwd)
{
validUser = newUser;
return true;
}
else
{
validUser = null;
return false;
}
}
}
}
4)编写表示层
(1)创建页面Default.aspx
(2)双击"登录"按钮,生成其Click事件,并在代码后置文件Default.aspx.cs中编写事件处理程序,其代码如下:
Codeusing System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using MODEL;
using BLL;
namespace Chat
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
/**//// <summary>
/// 用户登录
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btLogin_Click(object sender, EventArgs e)
{
User newUser;
string strUserName = null;
string Pwd;
//检测用户输入的用户名和密码是否为空
if (tbUserName.Text.Trim().Length == 0)
{
Response.Write("<script>alert('请输入用户名!')</script>");
return;
}
if (tbPwd.Text.Trim().Length == 0)
{
Response.Write("<script>alert('请输入密码!')</script>");
return;
}
//不为空则获取用户名和密码
strUserName = tbUserName.Text;
Pwd = tbPwd.Text;
//登录验证,调用BLL层的Login验证函数,返回是否通过验证的布尔值和实例化的User对象
if (UserManager.Login(strUserName, Pwd, out newUser))
{
//添加User类型对象到Session
Session["User"] = newUser;
Response.Redirect("Chat.aspx");
}
else
{
Response.Write("<script>alert('用户名或密码错误!')</script>");
}
}
}
}
运行程序前,还需设置启动项目。在"解决方案资源管理器"中的表示层上单击鼠标右键,在弹出的快捷菜单中选择"设为启动项目"命令,将表示层设置为启动项目
运行程序,输入登录名、密码,单击"登录"按钮后,页面跳转到**.aspx,显示登录成功