首页 > 代码库 > 三层学习------实践篇

三层学习------实践篇

   实践是检验真理的唯一标准,下面我们使用三层架构实践一个简单的“登录”业务。学以致用,来亲身感受一下三层架构的呼吸。


    用户输入用户名与密码后,系统验证密码是否正确。注意,为了简单易行,要求输入的用户名在数据库中的User表中存在,否则就会报错。以下是整体的代码结构。


接下来看一看具体每一层中的代码:

实体层:

<span style="font-family:SimSun;font-size:18px;"> public class User
    {
        private string userName = string.Empty;//string.Empty就相当于"",一般用于字符串的初始化
        private string pwd = string.Empty;

        public string UserName { get; set; }
        public string Pwd { get; set; }
    }</span>
UI:

<span style="font-family:SimSun;font-size:18px;"> private void btnOK_Click(object sender, EventArgs e)//点击“确定”按钮,开始验证用户信息
        {
            //声明一个bool类型的变量用来接收登录状态,登录成功/失败
            bool result = false;

            //检查用户名与密码是否为空
            if (txtUserName .Text =="")
            {
                MessageBox.Show ("用户名不能为空!");
                txtUserName.Focus();
                return;
            }
            if (txtPassword .Text =="")
            {
                MessageBox.Show("密码不能为空!");
                txtPassword.Focus();
                return;
            }

            //声明一个用户对象,将用户输入的用户名和密码赋于这个用户对象
            User euser = new User();
            euser.UserName = txtUserName.Text.Trim();
            euser.Pwd = txtPassword.Text;

            //访问B层
            LoginServer blogin = new LoginServer();
            result = blogin.BLogin(euser);//B层验证密码后,返回一个布尔值,传到此处

            if (result ==true )//如果返回true,则登录成功
            {
                MessageBox.Show("登录成功!");
            }
            else //返回false,密码输入错误,登录失败
            {
                MessageBox.Show("登录失败!");
            }
        }
 private void btnCancel_Click(object sender, EventArgs e)//点击“取消按钮”,关闭窗体
        {
            this.Close();
        }</span>
BLL:

<span style="font-family:SimSun;font-size:18px;">   public class LoginServer //验证用户密码是否正确
    {
        public bool BLogin(User User)
        {
            UserDAL duser = new UserDAL();//访问D层,连接数据库
            User euser = new User();
            euser = duser.DLogin(User);//接下来的任务在D层中进行,从数据表中获取该用户名的密码

            //如果该用户输入的密码与数据表中的一样,则为真,登录成功;反之为假。
            if (euser .Pwd ==User .Pwd )//euser是D层返回的实体类,携带着数据库中存储的用户信息,User携带用户输入的用户信息,将二者携带的密码进行比较
            {
                return true;
            }
            else
            {
                return false;
            }
            //得到真假后,回到U层,回馈给用户操作结果
        }
    }</span>
DAL:

<span style="font-family:SimSun;font-size:18px;"> public class UserDAL
    {
        //连接数据库
        public static string conString = @"Server=CYL-PC; Database=Login; User ID=sa; Password=123456";
        SqlConnection cnn = new System.Data.SqlClient.SqlConnection(conString);

        //根据输入的用户名获取用户密码
        public User DLogin(User user)
        {
            
            string sqlString="select * from Users where UserName='"+user .UserName +"'";

            User euser = new User();
            SqlCommand cmd = new SqlCommand(sqlString, cnn);

            //打开数据库
            cnn.Open();
            SqlDataReader read;
            read = cmd.ExecuteReader();
            read.Read();
            //将User表中的用户信息赋予给实体类,并将其返回B层
            euser.UserName = read[0].ToString();
            euser.Pwd = read[1].ToString();
            return euser;
        }
    }</span>
数据库Login中User表:


    代码中的注释写得比较详细,但在实际运行中,并不是一条龙执行下去。U层引用B层,B层引用D层,这三层都引用Entity。接下来将上述流程整体串一下。启动系统后,首先显示系统登录界面,用户输入用户名和密码后进行密码验证(若不输入,点“确定”后系统检测到空,重新回到登录界面)。具体的验证过程是这样的,三层都需实例化一个实体层中的User对象,其中U层的User携带用户输入的用户信息(用户名和密码);D层根据用户输入的用户名在数据库中找到该用户信息,让D层的User携带,然后传递给B层的User。在B层执行具体的验证过程,U层User携带的密码与B层User携带的密码比较,若二者相同,则显示“登录成功”向用户反馈,反之提醒“登录失败”。我的表达能力有限,预知清晰的执行内幕,逐语句调试(F11)。

    在这三层中,DAL只提供基本的数据访问,UI只负责显示和采集用户操作,他们都不包含任何与业务相关的逻辑处理。BLL负责处理业务逻辑,通过获取UI传来的操作指令,执行业务逻辑,在需要访问数据源的时候交给DAL处理。处理完成后,返回必要的数据给UI。实体层在他们之间上蹿下跳,三层都不知道User中的具体内容。这样做的好处就是,实现了高内聚,低耦合。各层分工协作,各司其职,有条不紊。增强了软件系统的可扩展性、可复用性、可维护性。