目录

前言

概念:

表现层(UI):

业务逻辑层(BLL)

数据访问层(DAL):

实体类库(Model):

代码展示:

表现层(UI):

业务逻辑层(BLL):

数据访问层(DAL):

实体类库(Model):

以上内容是小编对三层架构的了解,代码注释为小编个人理解,如有问题欢迎在下方评论!


前言

三层架构就是为了符合“高内聚,低耦合”的思想,把整个业务应用划分为三层结构,即表现层(UI),业务逻辑层(BLL),数据访问层(DAL),还有实体类库(Model),但是具体代码如何实现,到底哪些代码应该写在哪一层,却是模模糊糊的,今天小编就分享一下自己的感受,希望能对你有所帮助。首先我们了解一下各层的概念与职责:

概念:

表现层(UI):

表现层又称为表示层,位于三层架构的最上层,与用户直接接触,主要功能是实现系统数据的传入和传出,将数据直接传送到BLL层中进行数据处理,处理后会将处理结果反馈到表示层中。简单的说,表示层就是实现用户界面功能,将用户的需求传达和反馈。

业务逻辑层(BLL)

业务逻辑层BLL是软件系统的核心,位于表示层与数据访问层之间,是表现层与数据访问层的桥梁,主要功能是对具体问题进行逻辑判断与执行操作,接收到表现层UI的用户指令后,执行业务逻辑,通过数据访问层DAL写入数据源,从DAL中获取数据,以供UI显示使用。

数据访问层(DAL):

数据访问层是对数据的操作,但不是数据库,因为DAL层的数据BLL层传入的,然后将传入的数据写入数据库,具体是为表示层和业务逻辑层服务的。

实体类库(Model):

实体类库是数据库的映射对象,在信息系统软件实际开发的过程,要建立对象的实例,将关系数据库表采用对象实体化的方式表现出来,辅助软件开发中对各个系统功能的控制与操作执行,并利用Get与Set把数据库表中的所有字段映射为系统对象,建立实体类库,进而实现各个结构层的参数传输。

代码展示:

下面以一个登陆的小例子为例,展示一下三层是如何使用的,当用用户登陆成功时,会为该用户增加10积分。

表现层(UI):

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();//初始化组件,加载窗体
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
           
            string userName = txtUserName.Text.Trim();//获取输入的userName
            string password = txtPassword.Text;//获取输入的password
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//调用B层的登录方法,从B层返回user的信息
            Login .Model.UserInfo user = mgr.UserLogin(userName, password);//通过Model层,使用UserName、passwor

            MessageBox.Show("登录用户:" + user.UserName);//提示用户成功
        }
    }

业务逻辑层(BLL):

public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)//执行Login操作,UI传来的指令UserLogin和传来的数据username、password,返回UserInfo
        {
            #region 判断登录的逻辑
            // throw new NotImplementedException();//访问数据源
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//呼叫DAL,实例化UserDAO,获取信息
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);//调用UserDAO的查询方法,传两个值,返回UserInfo

            if (user != null)//判断User是否登录成功

            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//成功,调用ScoreDAO的方法增加积分
                sDao.UpdateScore(userName, 10);//更新积分,给用户加10分
                return user;//返回user
            }
            else
            {
                throw new Exception("登录失败");//失败,抛出异常
            }
            #endregion
        }
    }

数据访问层(DAL):

public class UserDAO//数据访问层,访问User表
    {
        public Login.Model.UserInfo SelectUser(string userName, string password)//判断用户是否存在的方法
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//获取SqlConnection,通过DBUtil得到Connstring,Using使Connection自动关闭
            {
                SqlCommand cmd = conn.CreateCommand();//创建Command
                cmd.CommandText = @"SELECT ID,UserName, Password,Email
                                    FROM Users WHERE UserName = @UserName AND Password=@Password";//执行SQl语句,查询数据
                cmd.CommandType = CommandType.Text;//默认值
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));//因为上面使用了参数,所以增加两个参数
                cmd.Parameters.Add(new SqlParameter("@Password", password));
                conn.Open();//打开链接,Using使Connection自动关闭链接
                SqlDataReader reader = cmd.ExecuteReader();

                Login.Model.UserInfo user = null;//构造User

                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);//not suggestion
                    if (!reader.IsDBNull(3))//Email可以为空,判断Email是不是为空
                    {
                        user.Email = reader.GetString(3);
                    }                   
                }
                return user;//返回User
            }            
        }
    }
/// <summary>
/// 积分类
/// </summary>
    public class ScoreDAO       //DAO数据访问对象,访问Score表
    {
        public void UpdateScore(string userName, int value)//判断增加积分的方法
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//通过Dbutil传字符串
            {
                SqlCommand cmd = conn.CreateCommand();//创建cmd
                cmd.CommandText = @"INSERT INTO Scores(UserName, Score) values(@UserName,@Score)";//向Score表中插入积分
                //cmd.Parameters.Add(new SqlParameter("@ID",value));
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));//构造两个参数
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();//打开链接,Using自动关闭链接
                cmd.ExecuteNonQuery();//向数据库中插入数据
            }
        }
    }

实体类库(Model):

/// <summary>
    /// 数据类库,封装数据,在三层之间传输数据
    /// 不引用任何一个层次的程序集,独立于三层之外
    /// 任何一层都要引用Model
    /// </summary>
    public class UserInfo//数据模型类UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }