三层架构总结

本文详细介绍了三层架构的概念,包括界面层、业务逻辑层和数据访问层的功能及交互方式,并通过具体的机房登录系统案例展示了各层如何协作完成业务逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

三层简介

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。
区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

这里写图片描述

让我们亲自来到生活理解一下三层:

这里写图片描述

引用关系:UI引用BLL,BLL引用DAL,UI、BLL、DAL引用MODEL


DAL层

  • 从数据源加载数据(Select)
  • 向数据源写入数据(Insert/ Update)
  • 从数据源删除数据(Delete)
  • DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理。

例如机房登录:

///连接数据库
 public  class DbUtil
    {
        public static string ConnString = @"Server=DESKTOP-OU60RPC\SQLSV; Database=Login;UserID=sa;Password=123456";                                          
        //server:SQL中的服务器名字,Database:是本用户服务器名字,User ID:为什么空行还请期待吧。后面账号和密码就是SQLserver的。
    }




/// 连接数据库并增加创建的角色
public class ScoreDAO
    {

        //updateScore方法需要传入userName和value两个参数
        public void UpdateScore(string userName, int value)
        {
            //实例化数据库连接conn
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                //利用现有连接conn创建一个Command,用于执行SQL指令。
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"INSERT INTO SCORES(UserName,Score) Values(@UserName,@Score)";

                //数据库中增加新的数据,Score+10
                cmd.Parameters.Add(new SqlParameter("@userName",userName));
                cmd.Parameters.Add(new SqlParameter("@Score",value ));

                conn.Open();

                //执行SQL指令
                cmd.ExecuteNonQuery();
            }
        }
    }




/// 创建连接
public  class UserDAO
    {

       //设定了两个参数,返回值类型为login.Model.UserInfo , 不要设置为bool
        public Login.Model.UserInfo  SelectUser(string userName, string password)
        {


            //using 作用为:可以自动关闭数据库
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                //建立一个查询,利用一个现有链接conn创建一个Command,用于执行SQL指令。
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,password,Email 
                     FROM USERS WHERE UserName=@UserName AND Password=@Password";


                //将SQL语句赋值给cmd.commandtext
                cmd.CommandType = System.Data.CommandType.Text;  //CommandType.Text
                cmd.Parameters.Add(new SqlParameter("@UserName",userName));
                cmd.Parameters.Add(new SqlParameter("@Password",password ));


                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();//逐条的读取数据 使用ExecuteReader()方法返回一个对象用reader接收



                Login.Model.UserInfo user = null;     //定义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); 
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }         
                }
                return user   ;

            }
        }
    }

BLL 层

  • 从DAL中获取数据,以供UI层显示
  • 从UI中获取用户指令和数据,执行业务逻辑
  • 从UI中获取用户指令和数据,通过DAL写入数据源
  • BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。

例如机房登录:

public  class LoginManager
    {
        public Login.Model.UserInfo UserLogin(string userName, string password)
        {

            //实例化D层
            Login.DAL.UserDAO  uDao = new Login.DAL.UserDAO();
            Login.Model.UserInfo user = uDao.SelectUser(userName, password);

            //如果user不为空值
            if (user !=null )  //登录成功
            {

                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//实例化D层

                sDao.UpdateScore(userName, 10);//更新积分

                return user;//返回user到U层
            }
            else
            {
                throw new Exception("登录失败");
            }
        }
    }

UI层

  • 向用户展示特定业务数据
  • 采集用户的输入信息和操作
  • 原则:用户至上,兼顾简洁
  • UI只负责显示和采集用户操作,不包含任何地业务相关的逻辑处理。

例如机房登录:

 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }

MODEL

业务数据模型,用于传输数据。

例如机房登录:

 public  class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }


    }

机房登录简单异

  1. sqlconnection 显示问题; 解决办法:引用using system.data.sqlclient
  2. 这里写图片描述
    解决办法:数据库连接问题,在DBUtil层里面的UserID=sa 写成:User ID =sa

机房行走流程

这里写图片描述

评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值