三层架构

三层:

在客户端和数据库之间加入中间层。

(1)页面层
也称UI层或U层,接受返回的数据和客户的应用请求,并且显示出客户所需要的数据。

(2)业务逻辑层
也称BLL层或B层。主要是负责对数据层的操作,从UI中获取用户指令和数据,执行业务逻辑。在需要的时候将数据传给D层,
也可以从DAL中获取数据,以供 UI 显示用 。

(3)数据访问层
主要是对数据库的操作,为业务逻辑层和页面层提供服务。

三成架构之间的数据传递方向:

在这里插入图片描述

优点:

(1)降低了耦合,各层之间的依赖降低
(2)各层之间的结构和功能明确
(3)增加了代码的复用
(4)使代码更加符合封闭开放原则。

缺点:

(1)降低了系统的性能。
(2)开发的难度较大。

实例

实现登录功能

在这里插入图片描述
U层代码

namespace LoginUI
{
    //只提供用户交互不包含任何的逻辑处理
    public partial class Form1 : Form
    {
        public Form1()
        {
            //初始化窗体上的所有控件
            InitializeComponent();  
        }
        public void butLogin_Click(object sender, EventArgs e)
        {
            //获得登录窗体的用户名 Trim去空格操作,注意和VB的形式不一样
            string userName = textUsername.Text.Trim();
           
            //因为密码中可能是空格所以不用去空格操作
            string password = textPassword.Text;

            ///只和业务逻辑层和model交互
            //和业务逻辑层进行交互,实例化LoginService类
            Login.Bll.LoginService mgr = new Login.Bll.LoginService(); 
            
            //和MODEL交互将数据层的信息传入MODEL
            Login.Model.UserInfo user=mgr.UserLogin(userName, password);

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

        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

B层代码

namespace Login.Bll
{
    public class LoginService
    {
     //通过获取UI层传来的操作,决定执行业务逻辑,在需要数据访问时将数据交给Dal层
    public Login.Model.UserInfo UserLogin(string userName,string password)
    {
           //实例化USERDAo类
            Login.DAl.UserDAO uDao = new Login.DAl.UserDAO();

            //给UserInfo进行赋值
            Login.Model.UserInfo user=uDao.SelectUser(userName, password);
            if (user != null) //登录成功
            {
                Login.DAl.ScoreDAO sDao = new Login.DAl.ScoreDAO();  //增加积分
                sDao.UpdateScore(userName, 10);//登录成功增加10积分
                return user;

            }
            else
            {
                MessageBox.Show("登录失败");
                throw new Exception("登录失败");
                                                 
            }
                     
    }        
    }
}

D层

连接数据库
namespace Login.DAl
{
    class DbUtil
    {
        //连接数据库,被数据访问层其他的UserDAO和SCOReDAO调用
       
        public static string ConnString = @"Server=.;Database=loginin;User ID=sa;Password=123456";
    }
}


namespace Login.DAl
{
    public class ScoreDAO
    {
        public void UpdateScore(string userName,int value)
        {
            //调用并且实例化一个链接
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                // //创建命令
                SqlCommand cmd = conn.CreateCommand();
                //设置操作语句
                cmd.CommandText = @"INSERT INTO Score(UserName,Score) Values(@UserName,@Score)";

                //Parameters范围  获取并添加SqlParameter的值
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));
                cmd.Parameters.Add(new SqlParameter("@Score", value));
                //打开链接
                conn.Open();
                //返回受影响的行数
                cmd.ExecuteNonQuery();
                conn.Close();


namespace Login.DAl
{
   public  class UserDAO
    {
        //根据用户名和密码选择用户,
        public Login.Model.UserInfo SelectUser(string UserName,string PassWord) 
        {
            //using 表示调用SqlConnection conn = new SqlConnection(DbUtil.ConnString)    创建连接     
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) 
            {
                //创建命令
                SqlCommand cmd = conn.CreateCommand();
                
                //设置操作语句
                cmd.CommandText = @"SElECT * FROM Users Where UserName=@UserName AND PassWord=@PassWord";
                
                //CommandType 获取或设置一个值,该值指示释 CommandText 是SQL语句,存储过程还是表操作。
                cmd.CommandType = CommandType.Text;

                //获取 SqlParameter的值,将SqlParameter的值传给Parameters
                cmd.Parameters.Add(new SqlParameter("@UserName", UserName));
                cmd.Parameters.Add(new SqlParameter("@Password", PassWord));
                conn.Open();

                // SqlDataReader读取数据
                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))  //not suggestion
                    {
                        user.Email = reader.GetString(3);
                    }

                   
                }
                conn.Close();
                return user;
                
                
            }
            
             //throw new NotImplementedException();
        }
    }
}

            }
        }
    }
}






为了方便三层之间传递数据增加MODEL类

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;  }

    }
}

注意:B层引用U层,D层引用B层。三层都引用Model 类。

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值