通过上个实例对整个三层有了一个最简单的理解,现在讲解一个运用三层的思想编写的登录窗体的实例,重点是理解三层的基本思想和练习连接数据库.

在这个实例中设计到了一个Model实体层,简单介绍一下关于实体层的作用和使用方法。

实体:针对具体的登录窗体来说,实体对象实际上就是数据库的表,我们把表里的字段封装到一个实体对象里,当具体使用某个对象的时候只需要调用实体对象的get和set方法获取对象的属性即可。对于大量的数据传递来说,传递实体要比传递具体变量更容易操作。

实体层:存放着各个表中的字段,各个层都可以调用,主要用来对层与层之间解耦。

用一张形象的图来表示各层和实体层之间的关系如下:

怎样用三层架构做学生信息登陆表 三层架构实现用户登录_Text

三层实例——登录窗体

一、分出三层和实体层:

怎样用三层架构做学生信息登陆表 三层架构实现用户登录_System_02

二、实体层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginModel
{
    public class UserInfo
    {
        public string UserName
        { get; set; }
        public string Password
        { get; set; }
    }
}

UserInfo表中存放了两个字段分别为:UserName和Password

把它们放在实体层可以简单的理解为这些代码是共享的,任何层当使用到这些属性的时候都可以调用UserInfo方法。

三、U层:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text;

            LoginBLL.LoginManager lgb = new LoginBLL.LoginManager();
            LoginModel.UserInfo user = lgb.UserLogin(userName ,password );
            MessageBox.Show("登录用户:" + user.UserName);
 
        }
    }
}

U层主要是与用户的交互,不涉及对数据的读取操作等。U层通过实体层的UserInfo调用了B层的UserLogin方法。这一层的代码核心就是通过Model层中的Username和Password作为传到B层的参数。

四、B层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginBLL
{
    public class LoginManager
    {
        public LoginModel.UserInfo UserLogin(string LoginID, string LoginPwd)
        {
            LoginDAL.UserDAO lgd=new LoginDAL.UserDAO() ;
            LoginModel.UserInfo user = lgd.SelectUser(LoginID, LoginPwd);

            if (user != null)
            {
                return user ;
            }
            else 
            {               
                throw new Exception ("登录失败!");
            }

        }
    }
}

B层中方法的定义也是通过实体层中的参数传递进行的,也是通过传递实体层的参数到了D层进行数据库的查询。

五、D层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;


namespace LoginDAL
{
    public class UserDAO
    {
        public LoginModel.UserInfo SelectUser(string LoginID, string LoginPwd)
        {
            string ConnString = @"Server=.;Database=SQL_Login; user Id=sa;Password=123456;";//连接方式
            using (SqlConnection conn = new SqlConnection(ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT LoginID, LoginPwd 
                                    FROM Login WHERE LoginID=@UserName AND LoginPwd=@Password";//查询语句
                cmd.CommandType = CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@UserName", LoginID));
                cmd.Parameters.Add(new SqlParameter("@Password", LoginPwd));

                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();

                LoginModel.UserInfo user = null;
                while (reader.Read())//读取查询结果
                {
                    if (user == null)
                    {
                        user = new LoginModel.UserInfo();
                    }
                    user.UserName = reader.GetString(0);
                    user.Password = reader.GetString(1);
                }
                return user;
            }
        }
    }
}

D层主要作用就是连接数据库。查询到的结果也是通过实体层进行的数据返回。


最后的结果:


怎样用三层架构做学生信息登陆表 三层架构实现用户登录_Linq_03

每个层之间都会和实体层发生关系,这就是实体层的最大好处.