天天看点

【三层】-C#版登录例子背景:总结

背景:

     学习三层架构也有段时间了,之前觉得三层挺简单的,就一集王继彬老师的视频,对三层有了大概的了解,通过后来的登录例子的实现,渐渐体会到没有想象中的那么简单,三层架构的学习不能仅仅停留在理论的概念层面上,,在实践中会了解到更多深层次的东西,这就是所谓的“站在岸上学不会游泳”吧;三层对于之后的机房重构等来说是一个基础,现在通过机房登录的小例子来理解三层。

【包图】

【三层】-C#版登录例子背景:总结

【时序图】

【三层】-C#版登录例子背景:总结

【通过代码看三层架构】

   ——界面层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统时的所见所得;

【三层】-C#版登录例子背景:总结

UI层:获取用户输入的UserName,password传给B层

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

namespace Login.UI
{
    public partial class Form1 : Form
    {
        static void Main(string[] args)
        {

            Application.EnableVisualStyles(); //激活应用程序显示风格
            Application.SetCompatibleTextRenderingDefault(false);//某些窗体控件在给它们的文本着色时可以使用 TextRenderer类也可以使用 Graphics类(False)。
            Application.Run(new Form1());//启动消息循环,显示窗体
        }
        public Form1()//构造函数
        {
            InitializeComponent();//初始化窗体
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            string userName = txtUserName.Text.Trim();//获取用户输入的UerName,Password
            string password = txtPassword.Text;
            Login.BLL.LoginManager mgr = new BLL.LoginManager();//实例化一个登录服务类,将U层数据通过B层的实例传递给Model层
            Login.Model.UserInfo user = mgr.UserLogin(userName, password);

            MessageBox.Show("登录用户:" + user.UserName);
        }

       
    }
   </span>
           

——业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.BLL
{
    public class LoginManager
    {

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

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

            if (user!= null ) //login successfully

            {
                Login.DAL.ScoreDAO  sDao = new DAL.ScoreDAO();//增加积分
                sDao.UpdateScore(userName, 10);
                return user;
            }
             else
	       {
               throw new Exception ("登录失败!");  //抛出异常
	       }
        }

    }
}</span>
           

BLL:向上连接U层,向下连接D层,根据U层传来的消息,判断用户是否存在及是否增加积分,通过调用实体层与U层和D层传输数据,进行增加积分等功能的实现,避免了U层和D层之间的直接接触,解除了二者之间的耦合。

——数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.DAL
{
   class DBUtil   //连接数据库类
    {
       public static string ConnString = @"Server=DESKTOP-DRNLL4P; Database=Login; User ID=sa; Password =123456";
    }
}</span>
           
<span style="font-family:KaiTi_GB2312;font-size:18px;">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)"; //插入字段值的SQL语句
                cmd.Parameters.Add(new SqlParameter("@UserName", userName)); //增加参数
                cmd.Parameters.Add(new SqlParameter("@Score", value));

                conn.Open();  //打开连接
                cmd.ExecuteNonQuery();  //插入数据(UserName,Score)
            }
        }
    }
}
</span>
           
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public  class UserDAO
    {
       public Login.Model.UserInfo SelectUser(string userName,string password)
       {  
           using (SqlConnection conn = new SqlConnection(DBUtil .ConnString) ) //创建连接
           {

               SqlCommand cmd = conn.CreateCommand();//创建命令 

               cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM USERS WHERE UserName = @UserName AND Password = @Password";  //获取或设置要对数据源执行的Transact-SQL语句、表名或存储过程

               cmd.CommandType = CommandType.Text; //获取或设置一个值,该值指示CommandText是一个SQL语句、存储过程还是一个表操作,默认为SQL文本命令
               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); //GetInt32获得的是int类型,GetInt64获得的是long类型(bigint)
                   user.UserName = reader.GetString(1);   
                   user.Password = reader.GetString(2);
                   if (!reader.IsDBNull(3))

                   {
                       user.Email = reader.GetString(3);
                   }
               }
             return user;
           }
       }
    }
}</span>
           

DAL:和数据库打交道,SelectUser根据B层的参数查询数据库,读取数据,最后将数据返回给B层进行逻辑判断。

总结

     三层架构其实就是在界面层和数据访问层之间加了一个业务逻辑层,减少了界面层和数据访问层之间的依赖,U层、B层、D层之间都是逐级向下之间形成依赖关系,底层对于调用它的上层来说是无知的,因此改变上层的代码,并不影响底层的实现,B层(业务逻辑层)处于核心位置,是解耦合关系的关键点,这才产生了所谓的三层架构。

    对于三层的知识了解甚少,希望路过的朋友多多提意见。