三层总结

    发现我养成了一个非常不好的习惯,总结光拖着,这个习惯得改,所以现在就来总结总结。

    在初识三层架构后,知道了为什么要用三层以及三层的优缺点等。具体就来谈谈如何来用,三层是如何来传的。先来个简单图来介绍:(前一个是手绘,第二个是vs自动生成的。)


    具体的如何做的呢?

    用代码来展示:


    UI层

<span style="font-family:KaiTi_GB2312;font-size:24px;">using System.Threading.Tasks;
using System.Windows.Forms;
using LoginModel;
using Login.BLL;
namespace LoginUI
{
    public partial class Login : Form
    {
        public Login()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string userName = txtUserName.Text.Trim();//将文本框的数据赋值给userName
            string password = txtPassword.Text;//将文本框数据赋值给password
            LoginManager mgr = new LoginManager(); //引用B层的方法
            mgr.UserLogin(userName, password);
            LoginModel.UserInfo user = mgr.UserLogin(userName, password);//
            //用户输入的东西传给业务逻辑层,属于拿来主义。
            MessageBox.Show("登录用户:" + user.UserName);
        }

        private void Login_Load(object sender, EventArgs e)
        {
            
        }
    }
}</span>
    userName和password是在U层通过实体层实例化B层的到对象mgr,然后通过调用mgr的Loginmanager方法传到B层的。


    BLL层

<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;      

namespace Login.BLL
{
    public class LoginManager
    {
        public LoginModel.UserInfo UserLogin(string userName, string password)
        {
           
            Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//引用D层的UserDAO类
            LoginModel.UserInfo user=uDao.SelectUser(userName, password);//引用实体层的SelectUser方法
            if (user != null)   //login successfully.
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);  //分数增加10
                return user;//实体返回U层
                
            }
            else
            {
                throw new Exception("登录失败"); 
            }
        }
    }
}</span>


    B层传递到D层数据是通过实体实例化D层的对象uDao,然后调用uDao的SelectUser来实现的

    

    DAL层


    DbUtil

<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Login.DAL
{
    //连接数据库字符串
    class DbUtil
    {
        public static string ConnString = @"Server=DESKTOP-59O7O1G;Database=Login;User ID=sa;Password=1"; //server等于SQL SERVER的名字

    }
}</span>


    DAL

<span style="font-family:KaiTi_GB2312;font-size:24px;">using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace Login.DAL
{
    public class UserDAO
    {
        //查询用户
        public LoginModel.UserInfo SelectUser(string userName, string password)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//数据库的链接;引用链接数据库的字符串.有了using,connection就可以自动关闭了。
            {
                SqlCommand cmd = conn.CreateCommand();//定义命令语句,创建并返回一个与SqlConnection关联的SqlCommand对象
                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password";
                cmd.CommandType = CommandType.Text;//设置一个值来解释CommandText属性
                cmd.Parameters .Add (new SqlParameter ("@UserName",userName));//将userName给参数
                cmd.Parameters.Add(new SqlParameter ("@Password",password));

                conn.Open();//打开数据库

                SqlDataReader reader=cmd.ExecuteReader();
                LoginModel .UserInfo user=null;
                while (reader.Read())
                { 
                    if (user==null )
	                {
		                user=new LoginModel.UserInfo();
	                }
                    user.ID =reader .GetInt32 (0);

                    user.UserName = reader.GetString(1);//获取数据库中username相应的字段
                    user.Password = reader.GetString(2);// not suggestion
                    if(!reader .IsDBNull (3))
                    { 
                    user.Email = reader.GetString(3);
                    }
                }
                return user;
                

            }
        }
    }
}</span>
    UserDAO的作用为根据从B层传过来的值执行相应的查询,并根据查询到的内容返回相应的查询结果。即:return user

    ScoreDAO

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

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 SCORES(UserName,Score) 
                    values(@UserName,@Score)";
                cmd.Parameters .Add (new SqlParameter ("@UserName",userName ));
                    cmd.Parameters .Add (new SqlParameter ("@Score",value ));

                conn.Open();
                cmd.ExecuteNonQuery();//查询数据库受影响的行数
            }
        }
    }
}

     这个就是我随意给的一个要求:当登录成功时,给加分


    Entity

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginModel//封装数据,传输数据,独立于其他三个层次。不会引用其他的。其他三个层次级都会引用model
{
    public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}

     生成的序列图:


    小结

    三层的逻辑很重要,思想也很重要。三层理清了,转七层的逻辑也就容易理解了。Ps:不是什么时候都适合使用三层



    

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳光下是个孩子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值