三层架构基础

三层是什么

三层架构(3-tier architecture)就是将整个业务应用划分为:

  • 界面层(User Interface Layer)

作用: 向用户展现特定业务数据,采集用户的输入信息和操作
【PS:设计原则:用户至上,兼顾简洁】

  • 业务逻辑层(Business Logic Layer)

作用: 主要是负责对数据层的操作,吧一些数据层的操作进行组合。

  • 数据访问层(Data Access Layer)

作用: 和数据源打交道,进行Select,Insert/Update,Delete等操作。

三层的目的
  • 高内聚,低耦合
三层何时使用

何时使用三层
当你的业务复杂到一定程度,当你的程序存储到相应的数据库的独立的数据存储集中时需要:把数据访问脱离业务,业务脱离UI。此种情况下:UI只需要呼叫业务访问层就可以使用。

三层的具体应用
  1. D层只提供基本的数据访问,不包含任何业务相关的逻辑处理。
  2. U层只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理
  3. B层负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给D层处理。处理完成后,返回必要数据给U层。
三层的优缺点

优点:

★ 开发人员可以只关注整个结构中的其中某一层
★ 可以很容易的用新的实现来替换原有层次的实现。
★ 可以降低层与层之间的依赖
★ 有利于标准化
★ 有利于各层逻辑的复用
★ 结构更加明确
★ 在后期维护的时候,极大的降低了维护成本和维护空间

缺点:

☆ 降低了系统的性能。这是不言而喻的。如果不采用分层结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却是必须通过中间层来完成。
☆ 有时会导致级联的修改。这种修改体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
☆ 增加了开发成本。

三层间的引用

在这里插入图片描述

三层的代码

U层代码:

扫描二维码关注公众号,回复: 9875110 查看本文章
private void BTLogin_Click(object sender, EventArgs e)
{ 
    try
    //对try块代码进行异常捕捉,
    //如无异常则进行直try块结束,
    //如有异常则跳转进入catch块。
    {
        string userName = txtUserName.Text.Trim();
        string password = txtPassword.Text;
        Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
        //将用户输入的数据传给BLL,在下面一句的使用中,就直接从BLL调用数据
        Login.Model.UserInfo user = mgr.UserLogin(userName, password);
        //在这里就可以返回model里的userinfo
        MessageBox.Show("登陆用户:" + user.UserName);
    }
    catch (Exception ex)
    //处理异常。如下进行处理
    {
        MessageBox.Show(ex.Message);
    }
}

B层代码

public class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName,string password)
            //获取UI传来的指令UserLogin和数据Username还有password,可以返回model里的userinfo了
        { 
            
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);
            //调用userDao的selectUser方法,返回Model里的UserInfo

            if (user != null)//登录成功
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);
                //调用ScoreDAO里的UpdateScores增加积分的方法,选择用户名,增加十个积分
                return user;
            }
            else
            {
                throw new Exception("登陆失败。");
                //抛出异常
            }
        }
    }

D层代码

public class ScoreDAO
    {
        public void UpdateScore(string userName, int value)
            //写一个增加积分的方法,从B层获取数据
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES (UserName, Score) Values(@UserName,@Score)";
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();
                cmd.ExecuteNonQuery();

            }
        }
    }

public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string password)
            //写一个方法,根据用户名和密码判断,返回一个数据模型,
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            //有了上面的这个using ,connection就可以自动关闭了,
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email
                                  FROM USERS WHERE UserName=@UserName AND Password=@Password";
                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);
                    //将数据库第一列的数据以Int32的格式返回
                    user.UserName = reader.GetString(1);
                    //将数据库第二列的数据以Int32的格式返回
                    user.Password = reader.GetString(2);
                    //将数据库第三列的数据以int32的格式返回

                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }

                }
                return user;

            }
        }
    }
发布了64 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/YaraRen/article/details/103393116
今日推荐