您的位置:首页 > 编程语言 > ASP

ASP.NET三层结构演化构建之二——三层肚皮

2011-01-01 13:57 274 查看
我们要进行分层了。是不是很紧张呢。先在这里吹一吹三层结构是哪三层吧。

在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层,如图所示:



数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问。简单的说法就是现对数据表的 Select,Insert,Update,Delete 的操作。
业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关。如果涉及到数据库的访问,则调用数据访问层。
表示层:是系统的 UI 部分,负责使用者与整个系统的交互。在这一层中,理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素有关。

微软那么牛B都说分三层了,我们就听他的吧。给人家个面子嘛。盖茨哥长的那么帅

分层设计有什么好处呢。

概括来说,分层式设计可以达至如下目的:分散关注、松散耦合、逻辑复用、标准定义。

我们先看头两个。

一个好的分层式结构,可以使得开发人员的分工更加明确。一旦定义好各层次之间的接口,负责不同逻辑设计的开发人员就可以分散关注,齐头并进。例如 UI人员只需考虑用户界面的体验与操作,领域的设计人员可以仅关注业务逻辑的设计,而数据库设计人员也不必为繁琐的用户交互而头疼了。每个开发人员的任务得到了确认,开发速度就可以迅速的提高。
一个东西,你把他分成几个部分,大家每个人做一部分,速度自然就快咯。

松散耦合的好处是显而易见的。如果一个系统没有分层,那么各自的逻辑都紧紧纠缠在一起,彼此间相互依赖,谁都是不可替换的。一旦发生改变,则牵一发而动全身,对项目的影响极为严重。降低层与层间的依赖性,可以良好地保证未来的可扩展。

现在我们开始扩展我们的StudentMIS。

分三层。分别是DAL(Data Access Layer,即数据访问层),BLL(Business Logic Layer,即业务逻辑层),UI(User Interface,即用户接口层)。

右击解决方案->添加新项目。如图所示:



选择类库,并将名称设置为BLL。

用相同的方法建立DAL。

在DAL和BLL中将自动生成的class1.cs删除。各自添加一个新类User.cs,如图:



由于各个层次之间存在调用关系。要对某个层次进行调用,必须在引用中添加要调用的层次。
在UI中我们对BLL进行调用。所以要在引用中添加BLL。

鼠标右击Web项目,如图:



在弹出的菜单中选择添加引用。然后会弹出一个对话框,如图:



选择项目,然后选择BLL。点击确定。这样就完成了对BLL项目的引用了。之后就可以通过在代码开始添加using BLL;来使用BLL中的方法了。

使用相同的方法,在BLL项目中添加对DAL项目的引用。

下面是代码内容。

BLL中的User.cs:

using DAL;

namespace BLL
{
public class User
{
DAL.User user = new DAL.User();

/// <summary>
/// 根据用户Id获取用户密码
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户密码</returns>
public string GetUserPassword(string userId)
{
return user.GetUserPassword(userId);
}

/// <summary>
/// 根据用户Id获取用户姓名
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户姓名</returns>
public string GetUserName(string userId)
{
return user.GetUserName(userId);
}
}
}

DAL中的User.cs

using System;
using System.Data.SqlClient;

namespace DAL
{
public class User
{
/// <summary>
/// 根据用户Id获取用户密码
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户密码</returns>
public string GetUserPassword(string userId)
{
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建连接
SqlCommand cmd = new SqlCommand("select password from [User] where UserId=" + userId, conn);//新建命令,根据文本框tbxUserId中的值查询数据库中相应记录的Password值
conn.Open();//打开连接
Object obj = cmd.ExecuteScalar();//执行语句,返回第一行第一列结果
conn.Close();//关闭连接
if (obj != null) return obj.ToString();//若查询结果不为空,则将其转换为字符串
else return null;//否则返回null
}

/// <summary>
/// 根据用户Id获取用户姓名
/// </summary>
/// <param name="userId">用户Id</param>
/// <returns>用户姓名</returns>
public string GetUserName(string userId)
{
SqlConnection conn = new SqlConnection("Data Source=.;Initial Catalog=StudentMIS;Integrated Security=True");//新建连接
SqlCommand cmd = new SqlCommand("select UserName from [User] where UserId=" + userId, conn);//新建命令,根据请求的UserId中的值查询数据库中相应记录的UserName值
conn.Open();//打开连接
Object obj = cmd.ExecuteScalar();//执行语句,返回第一行第一列结果
conn.Close();//关闭连接
if (obj != null) return obj.ToString();//若查询结果不为空,则将其转换为字符串
else return null;//否则返回null
}
}
}

Login.aspx.cs:

using System;
using BLL;

public partial class Login : System.Web.UI.Page
{
User user = new User();//实例化BLL中的User类

protected void btnLogin_Click(object sender, EventArgs e)
{
if (tbxUserId.Text.Length == 0 || tbxPassword.Text.Length == 0) return;//若账号密码为空,则返回
if (user.GetUserPassword(tbxUserId.Text)== tbxPassword.Text)//若查询结果不为空且与文本框tbxPassword中的值相等
Response.Redirect("Index.aspx?UserId="+tbxUserId.Text);//跳转到Index.aspx
else
{
tbxUserId.Text = "";//清空tbxUserId中的值
tbxPassword.Text = "";//清空tbxPassword中的值
}
}
}

Index.aspx.cs:
using System;
using BLL;

public partial class Index : System.Web.UI.Page
{
User user = new User();//实例化BLL中的User类

public string UserName;//用户名
protected void Page_Load(object sender, EventArgs e)
{
UserName = user.GetUserName(Request["UserId"]);//设置显示的用户名
}
}

这样运行起来还是跟上一篇博文中的效果一样。但是已经明确了分工。这样,开发人员各搞各的,只要能确定对方的接口,到时候就可以进行组装。

为什么本篇要叫三层肚皮呢。因为肚皮里油水太多了。看看我们的DAL,充斥着数据库操作代码。看起来晕晕的。不利于维护。代码的可重用性差。

如何在三层结构中做好代码复用的工作呢。请看下一篇博文:ASP.NET三层结构演化构建之三——用了又用

项目示例下载:http://download.csdn.net/source/2946951
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: