首页 > 代码库 > 三层架构与四大天王之前传

三层架构与四大天王之前传

上篇文章我们介绍了一下三层架构的基础知识,这次就让我们来探寻一下他的执行机制吧。

   1、实体层

     (1)是什么

    实体类——实体类事实上是存放数据的,我们在数据库读取的数据就是存放在实体层里面的(是辅助数据库的映射,能够理解为传递数据的载体)实体类主要是作为数据管理和业务逻辑处理层面上存在的类别; 它们主要在分析阶段区分实体类的主要职责是存储和管理系统内部的信息,它也能够有行为,甚至非常复杂的行为,但这些行为必须与它所代表的实体对象密切相关。实体类相应数据库中一个表,实体类的每一个属性相应表中相应的字段,使用实体类符合面向对象编程的思想,把一个表封装成一个类。

              技术分享

   (2)有什么用

     程序在执行时,每一层(UI—>BLL—>DAL)之间的数据传递(单向)是靠变量或实体作为參数来传递的,这样就构造了三层之间的联系,完毕了功能的实现。可是对于大量的数据来说,用变量做參数有些复杂,由于參数量太多,easy搞混。比方:我要把员工信息传递到下层,信息包含:员工号、姓名、年龄、性别、工资....用变量做參数的话,那么我们的方法中的參数就会非常多,极有可能在使用时,将參数匹配搞混。这时候,假设用实体做參数,就会非常方便,不用考虑參数匹配的问题,用到实体中哪个属性拿来直接用就能够,非常方便。。

     因此,实体类有一下作用
      1,实现面向对象思想中的"封装";
      2,贯穿于三层,在三层之间传递数据;
      3,提高了效率;

   2、执行前提

     程序要想执行,首先要将三层及Entity连接起来,也就是在项目中加入引用
     引用关系为:UI引用BLL和Entity;BLL引用DAL和Entity;DAL仅仅引用Entity。
                技术分享

   3、执行机制

    技术分享

   4、执行实例

     (1)登陆之UI层
        主要是提供给用户界面,跟用户交互
                             技术分享
         
     登陆button的代码

        private void button1_Click(object sender, EventArgs e)
        {
            //实例化一个模型对象
            Login.Model.UserInfo user = new Login.Model.UserInfo();

            //讲參数传给该对象
            user.UserName=txtUserName.Text.Trim();
            user.Password=txtPassword.Text;

            //实例化B层
            Login.BLL.UserManager mgr = new Login.BLL.UserManager();

            //将该对象传给B层处理
            Login.Model.UserInfo User = mgr.UserLogin(user);

            //依据传回的信息做推断
            MainUI.Form1 frm = new MainUI.Form1();
            frm.Show();
            this.Hide();

        }


    (2)登陆之BLL层
         UserManager类
    public class UserManager
    {
        public Login.Model.UserInfo UserLogin(Login.Model.UserInfo user)
        {
            //调用D层
            Login.DAL.UserDAO udao = new Login.DAL.UserDAO();

            //让D层推断信息是否正确
            Login.Model.UserInfo User = udao.SelectUser(user);

            if (User == null)       
            {
                //假设username错误,将提示用户
                throw new Exception("username不对!");
            }
            else if (User.Flag==false)
            {
                throw new Exception("password错误,登陆失败!");
            }
            else 
            {
                //成功登陆,返回用户信息
                return User;
            }      <pre name="code" class="csharp" style="font-size: 18px; line-height: 25px; ">        }
}
    (3)登陆之DAL层
        DBUtil类
    class DBUtil
    {
        //连接数据库语句
        public static string ConnString = @"server=localhost;Database=Login;User=sa;Password=123456;";
    }
        UserDAO类
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(Login.Model.UserInfo user)
        {
            //连接数据库,验证信息
            using (SqlConnection conn=new SqlConnection(DBUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();      //用于处理数据库

                //推断username是否存在
                cmd.CommandText = @"SELECT * FROM USERS WHERE UserName=@UserName";
                
                //获得查询语言
                cmd.CommandType = CommandType.Text;

                //加入查询语言中的參数
                cmd.Parameters.Add(new SqlParameter("@UserName", user.UserName));
                //cmd.Parameters.Add(new SqlParameter("@Password", user.Password));

                conn.Open();
                //查询并返回结果
                SqlDataReader reader = cmd.ExecuteReader();

                //声明一个返回实例,假设username不存就返回空实例
                Login.Model.UserInfo User = null;          
                
                while (reader.Read())
                {
                    //假设username存在,就验证password是否正确
                    if (User==null)   
                    {
                        User=new Login.Model.UserInfo();
                    }
                    
                    //假设password存在就返回用户信息
                    if (user.Password ==reader.GetString(2))
                    {
                        User.Flag = true;          //用户password正确的标志

                        User.ID = reader.GetInt32(0);
                        User.UserName = reader.GetString(1);
                        User.Password = reader.GetString(2);

                        //假设邮箱不为空,则取出
                        if (!reader.IsDBNull(3))
                        {
                            User.Email = reader.GetString(3);
                        }
                    }
                    else
                    {
                        User.Flag = false;       //用户password错误的标志
                    }
                    
                }
                return User;
            }
        }
    }


    (4)登陆之Model层
       UserInfo
    public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }

        public bool Flag;
    }
     最后登陆成功
                    技术分享

三层架构与四大天王之前传