前言:
七層登錄一開始就沒有弄清楚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;
}
}
}
實現結果: