天天看点

三层架构之实现

上一篇文章我们知道了了解了什么是三层,它的工作流程,它的优势与劣势,这篇文章主要讲解三成的具体实现过程。

首先第一步要建立数据库,包含两个表:

(1)Users表

三层架构之实现

(2)Scores表

三层架构之实现

数据库建完之后,就是具体的代码实现阶段了。根据三层之间的引用原则(DAL所在程序集不引用BLL和UI,BLL需要引用DAL,UI直接引用BLL,可能会间接引用DAL),另外实体层供其它层引用,但是它不能引用其它层,所以我们首先着手实体层(LoginModel):

(1)实体(LoginModel):

它的作用是封装数据,使数据在三层中传输,更倾向于业务逻辑层。添加类:UserInfo

namespace Login.Model
{
    public class UserInfo
    {
        //定义用户属性
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}
           

(2)数据访问层(LoginDAL):

它的作用是:Select、Insert/Update、Delete。添加类:DbUtil、UserDAO、ScoreDAO DbUtil类:

namespace Login.DAL
{
    public class DbUtil
    {
        public static string ConnString = @"Server=(local);Database=Login;User ID=sa;Password=123456";
    }
}
           

UserDAO类:

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string passWord)
        { 
            //建立数据库的连接
            using (SqlConnection conn=new SqlConnection (DbUtil.ConnString ))
            {
                //执行SQL语句查询
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE [email protected] AND [email protected]";
                //输出查询结果
                cmd.CommandType = CommandType.Text;
                //添加两个参数
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Password", passWord));

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

                Login.Model.UserInfo user = null;
                //读取具体的数据
                while (reader.Read())
                {
                    if (user ==null )
                    {
                        user = new Login.Model.UserInfo();
                    }
                    //读取查询到的数据
                    user.ID = reader.GetInt32(0);
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader .IsDBNull (3))
                    {
                        user.Email = reader.GetString(3); 
                    }
                }
                return user;

            }
        }
    }
}    
           

ScoreDAO的作用是每次登陆成功后,Score的数值都会增加10。具体代码不再粘贴。

(3)业务逻辑层(LoginBLL)

它从DAL中获取数据,提供给UI层显示;从UI层获取用户和指令,执行业务逻辑;从UI层获取用户和指令,通过DAL写入数据。添加类LoginManager。

namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string passWord)
        {
            //实例化DAL层
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
            Login.Model.UserInfo user = uDao.SelectUser(userName, passWord);

            //不需要访问数据源,直接执行业务逻辑
            if (user !=null )//login successfully
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);
                return user;
            }
            else
            {
                throw new Exception("登录失败。");
            }
        }
    }
}
           

(4)显示层(UI)

它的作用是向用户展现特定业务数据,采集用户的输入信息和操作。 原则:用户至上,兼顾简洁。添加类:frmLogin。

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

        private void btnLogin_Click(object sender, EventArgs e)
        {
            //显示层将用户输入的数据传给BLL层
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text;
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
            Login.Model.UserInfo user = mgr.UserLogin(userName, password);

            //显示层返回业务层传递的数据给用户
            MessageBox.Show("登录用户:" + user.UserName);
        }
    }
}
           

继续阅读