C#機房重構三層登陸與設計模式結合

前言:
七層登錄一開始就沒有弄清楚UI層和BLL層具體的職責,所以導致在機房重構的時候把登錄的代碼邏輯全部都寫到了UI層。慶幸的是發現的早,在剛敲完登錄就發現了。沒有在完成整個重構再發現,哪個時候改代碼可就廢了勁了。
好了廢話不多說,下面具體介紹七層都是那些和具體每一層的職責!

七層結構:
在這裏插入圖片描述
職責:
LoginBLL(業務邏輯層,實現業務邏輯)
loginDAL(數據訪問層,實現數據操作)
loginEnitity(實體層,負責在每層之間傳遞數據)
loginFacade(外觀層,負責統一BLL層的功能,和向BLL層傳遞數據)
loginFactroy(工廠層,負責創建DAL層具體的查詢類)
loginIDAL(接口層,定義一個具體的功能接口。讓DAL層實現這個具體的功能)
loginUI(界面層,負責接收用戶輸入和顯示數據!)
七層之間的關係:
在這裏插入圖片描述
從這個關係圖中可以明確的看到,每層之間的一個引用關係。還有DAL層是去實現接口層的功能。
代碼實現:
LoginEnitity:

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

namespace LoginEnitity
{
    /// <summary>
    /// 實體層
    /// </summary>
    public class UserInfo
    {
        //定義用戶UserName屬性
        public string UserName { get; set; }
        //定義用戶UserPwd屬性
        public string UserPwd { get; set; }
        //定義用戶等級
        public string UserLeve { get; set; }

        
    }
}

LoginUI:

 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 LoginEnitity;
using LoginFacade;

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }   

        private void button1_Click(object sender, EventArgs e)
        {
            //判斷用戶密碼是否爲空
            if (txtUserName.Text.Trim()=="")
            {
                MessageBox.Show("請輸入你的用戶名!","提示",MessageBoxButtons.OK,MessageBoxIcon.Warning);
            }
            if (txtUserPwd.Text== "")
            {
                MessageBox.Show("請輸入你的密碼!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            try
            {
                //實例化一個用戶
                LoginEnitity.UserInfo user = new UserInfo();
                //接收信息
                user.UserName = txtUserName.Text;
                user.UserPwd = txtUserPwd.Text;
                int[] flag = new int[3];
                LoginFacade.LoginFacade Flogin = new LoginFacade.LoginFacade();
                flag = Flogin.SelectUser(user);
                //調用顯示窗體方法
                WorkLogin workLoing = new WorkLogin();
                workLoing.workLogin(flag);
                this.Hide();//隱藏本窗體
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                
            }
            
        }
    }
}

LoginFacade:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginBLL;
using LoginEnitity;
using System.Data;
namespace LoginFacade
{
    /// <summary>
    /// 外觀層
    /// </summary>
    public class LoginFacade
    {
        /// <summary>
        /// 判斷用戶是否存在
        /// </summary>
        /// <param name="user">用戶</param>
        /// <returns></returns>
        public int[] SelectUser(UserInfo user)
        {
            int[] flag=new int[3];
            LoginBLL.LoginBLL usrBLL = new LoginBLL.LoginBLL();
            flag = usrBLL.UserBLL(user);
            return flag;
        }
        
  
        
    }
}

LoginBLL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginFactory;
using LoginIDAL;
using System.Data;
namespace LoginBLL
{
    /// <summary>
    /// 業務邏輯
    /// </summary>
    public class LoginBLL
    {
        /// <summary>
        /// 判斷用戶是否存在
        /// </summary>
        /// <param name="user">用戶</param>
        /// <returns>返回是否存在</returns>
        public int[] UserBLL(UserInfo user)
        {
            //返回的值
            int[] flgeLog = new int[3];
            //實例化工廠
            LoginFactory.LoginFactory fact = new LoginFactory.LoginFactory();
            //調用工方法創建接口
            LoginIDAL.LoginIDAL idal = fact.CreateUser();
            //接收D層的返回值
            DataTable table = idal.SelectUser(user);
            bool flag;
            //返回數據表的類型,如果等於 0.
            //則是沒有符合該賬戶密碼的用戶
            if (table.Rows.Count == 0)
            {
                flag = false;
            }
            else
            {

                flag = true;
            }//end if
            //判斷用戶是否存在,根據上面表裏有沒有內容的返回值判斷!
            if (flag != false)
            {
                //存在
                flgeLog[0] = 1;
            }//end if
            return flgeLog;//返回數值,賬號存不存在
        }

    }
}

LoginFactory :

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginIDAL;
using System.Reflection;
using System.Configuration;
namespace LoginFactory
{
    /// <summary>
    /// 工廠層
    /// </summary>
    public class LoginFactory
    {
        //獲取配置文件

        string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];
        //應用反射獲得DAL層操作
        public LoginIDAL.LoginIDAL CreateUser()
        {
             string ClassName = StrDB +"."+"LoginDal";
          //  string ClassName = "LoginDAL.LoginDal";
            return (LoginIDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);
        }
    }
}

LoginIDAL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
//命名空間
using System.Data;
namespace LoginIDAL
{
    /// <summary>
    /// 接口層
    /// </summary>
    public interface LoginIDAL
    {
        //放置接口函數,判斷要登錄的用戶是否在數據表中。
        DataTable SelectUser(UserInfo user);
    }
}

LoginDAL:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using LoginIDAL;
using LoginEnitity;
namespace LoginDAL
{
    /// <summary>
    /// 登錄查詢
    /// </summary>
    public class LoginDal:LoginIDAL.LoginIDAL
    {
       
        /// <summary>
        /// 實現接口
        /// </summary>
        /// <param name="user">用戶</param>
        /// <returns>返回是否存在</returns>
        public DataTable SelectUser(UserInfo user)
        {
            //實例化數據操作類,進行數據查詢,並獲取返回值
            SQLHelper sqlHelper = new SQLHelper();
            //數據庫表裏的內容和實體的內容進行一一映射。
            SqlParameter[] sqlparms = {new SqlParameter("@UserName",user.UserName)};
            string sql = @"select * from [User_Info] where UserName=@UserName";
            //把查詢的信息儲存到臨時表
            DataTable table = sqlHelper.ExecuteQuery(sql,sqlparms,CommandType.Text);
            return table;
        }
    }
}

SQLHerlper:
其實SQLHerper也可以算作一層,因爲SQLHerper把在查詢數據用到的相同功能都放到了一起。所以七層也好八層也好,重點還是要把代碼做到。可複用,可擴展。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginEnitity;
using LoginIDAL;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
namespace LoginDAL
{
    //數據集訪問層---數據操作類
 public   class SQLHelper
    {
        //定義數據庫連接操作,指定在數據庫上操作的類型,定義數據庫讀取操作
        private SqlConnection conn = null;//連接
        private SqlCommand cmd = null;//命令
        private SqlDataReader sdr = null;//數據集
        /// <summary>
        /// 數據庫連接
        /// </summary>
        public SQLHelper()
        {
            string connStr = ConfigurationManager.AppSettings["connStr"];
            conn = new SqlConnection(connStr);
        }
        private SqlConnection GetConn()
        {
            //判斷狀態是否爲空打開狀態
            if (conn.State==ConnectionState.Closed)
            {
                conn.Open();//打開
            }//end if
            return conn;
        }
        /// <summary>
        /// 執行不帶參數的數據庫操作或儲存過程
        /// </summary>
        /// <param name="cmdText">增刪改查操作</param>
        /// <param name="ct">命令類型</param>
        /// <returns>返回受影響的行數</returns>
        public int ExecuteNonQuery(string cmdText,CommandType ct)
        {
            int res;
            cmd = new SqlCommand(cmdText, GetConn());
            cmd.CommandType = ct;
            res = cmd.ExecuteNonQuery();
            if (conn.State == ConnectionState.Open)
            {
                conn.Close();
            }

            return res;
        }
        /// <summary>
        /// 執行帶參數的數據庫操作或儲存過程
        /// </summary>
        /// <param name="cmdText">增刪改查操作</param>
        /// <param name="ct">命令類型</param>
        /// <returns>返回受影響的行數</returns>
        public int ExecuteNonQuery(string cmdText, SqlParameter[] paras ,CommandType ct)
        {
            int res;
            using (cmd = new SqlCommand(cmdText, GetConn()))
            {
                cmd.CommandType = ct;
                cmd.Parameters.Add(paras);
                res = cmd.ExecuteNonQuery();
            }    
            return res;
        }
        /// <summary>
        /// 執行不帶參數的SQL查詢語句或儲存過程
        /// </summary>
        /// <param name="cmdText">查詢sql語句或儲存過程</param>
        /// <param name="ct">命令類型</param>
        /// <returns>返回受影響行數</returns>
        public DataTable ExecuteQuery(string cmdText,CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText,GetConn());
            cmd.CommandType = ct;
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            return dt;
        }
        /// <summary>
        /// 執行帶參數的sql語句查詢或儲存過程
        /// </summary>
        /// <param name="cmdText">查詢SQL語句或儲存過程</param>
        /// <param name="paras">參數集合</param>
        /// <param name="ct">命令類型</param>
        /// <returns>返回受影響的行數</returns>
        public DataTable ExecuteQuery(string cmdText,SqlParameter[] paras,CommandType ct)
        {
            DataTable dt = new DataTable();
            cmd = new SqlCommand(cmdText,GetConn());
            cmd.CommandType = ct;
            cmd.Parameters.AddRange(paras);
            using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection))
            {
                dt.Load(sdr);
            }
            
            return dt;
        }
    }
}

實現結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章