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

我们要进行分层了。是不是很紧张呢。先在这里吹一吹三层结构是哪三层吧。

 

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

 

数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问。简单的说法就是现对数据表的 SelectInsertUpdateDelete 的操作。

业务逻辑层:是整个系统的核心,它与这个系统的业务(领域)有关。如果涉及到数据库的访问,则调用数据访问层。

表示层:是系统的 UI 部分,负责使用者与整个系统的交互。在这一层中,理想的状态是不应包括系统的业务逻辑。表示层中的逻辑代码,仅与界面元素有关。

 

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

 

分层设计有什么好处呢。

 

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

 

我们先看头两个。

 

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

一个东西,你把他分成几个部分,大家每个人做一部分,速度自然就快咯。

 

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

 

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

 

分三层。分别是DALData Access Layer,即数据访问层),BLLBusiness Logic Layer,即业务逻辑层),UIUser Interface,即用户接口层)。

 

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

 

 

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

 

用相同的方法建立DAL

 

DALBLL中将自动生成的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 != nullreturn 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 != nullreturn 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 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章