个人机房重构--七层实现登录
一、概述:
現在準備開始個人機房重構,那么就從簡單的來,先用七層實現登錄。我們常說的七層是指哪七層呢?其實七層就是在三層的基礎上,添加了外觀層——設計模式的外觀模式,抽象工廠加反射,接口層。外觀層主要是把UI層和BLL層分離;抽象工廠加反射主要是為了更換數據庫的方便性,同時把DAL層中的類轉換成IDAL層中的接口,從而使BLL層通過調用IDAL從而實現調用DAL層;接口層主要是為了把BLL層和DAL層分離;最終目的就是解耦。
二、關系:
?
三、代碼:
UI層:界面層引用了實體層、外觀層。主要用于接收用戶輸入的數據然后傳給外觀層,再由外觀層傳給B層進行相應的判斷。
private void btnLogin_Click(object sender, EventArgs e){if (txtUserID.Text.Trim() == ""){MessageBox.Show("用戶名不能為空", "溫馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}if (txtPWD.Text == ""){MessageBox.Show("密碼不能為空", "溫馨提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}try{Facade.LoginFacade Facade = new Facade.LoginFacade();Entity.UserInfo user = new Entity.UserInfo();user.UserID = Convert.ToInt32(txtUserID.Text.Trim());user.Password = txtPWD.Text;Boolean flag = false;Facade.LoginFacade FLogin = new Facade.LoginFacade();//實例化外觀flag = FLogin.SelectUser(user);//調用外觀的方法,返回給userif (flag != false){this.Hide();this.DialogResult = System.Windows.Forms.DialogResult.OK;FrmMain frmMain = new FrmMain();//實例化一個窗體frmMain.Show();//顯示實例化的窗體}else{MessageBox.Show("密碼或者用戶名錯誤");}}catch (Exception){throw;}}Entity層:實體層是被引用的,不引用其他層。和三層中的實體層一樣,主要是用來在各層中傳遞數據。
public class UserInfo{//定義 用戶ID private int userid;public int UserID {get { return userid; }set { userid = value; }}//定義 用戶名 private string userName;public string UserName{get { return userName; }set { userName = value; }}//定義 密碼 private string password;public string Password{get { return password; }set { password = value; }}//定義 等級 private string level;public string Level{get { return level; }set { level = value; }}//定義 狀態private bool state;public bool State{get { return state; }set { state = value; }}}Facade層:引用了實體層、BLL層。降低U層和B層之間的耦合,U層和B層之間的聯系只需要通過Facade層的接口就行了,U層無需知道B層內部有哪些方法。外觀層接收U層傳來的數據,然后調用B層的方法對信息進行驗證。
public class LoginFacade{public Boolean SelectUser(Entity.UserInfo user){bool flag;BLL.LoginBLL userBLL = new BLL.LoginBLL();flag = userBLL.UserBLL(user);return flag;}}BLL層:引用了實體層、工廠層、接口層。B層主要是進行邏輯判斷的,調用工廠中的方法創建相應的接口。
public class LoginBLL{public bool UserBLL(Entity.UserInfo UserInfo){Factory.LoginFactory fact = new Factory.LoginFactory();//實例化工廠IDAL.LoginIDAL idal = fact.CreateUser();//調用工廠方法創建接口 DataTable table = idal.selectUser(UserInfo);//接受D層的返回值 bool flag;if (table.Rows.Count == 0)//返回的DataTable類型,如果它的行數等于0,說明沒有符合該帳號密碼的用戶 { flag = false; }else{flag = true;}return flag;}}IDAL層:引用了實體層。(注意這里的IDAL添加的是接口,而不是類庫;先添加類庫,再把class改成interface,是無效的。)接口層是用于定義一個統一的接口,解除B層和D層的耦合。
public interface LoginIDAL{DataTable selectUser(Entity.UserInfo UserInfo);}DAL層:引用了實體層、接口層。
public class LoginDAL : LoginIDAL{public DataTable selectUser(Entity.UserInfo UserInfo){SQLHelper sqlHelper = new SQLHelper();SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.UserID), new SqlParameter("@Password", UserInfo.Password) };string sql = @"SELECT * FROM [User_Info] WHERE UserID=@UserID and PWD =@Password";DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);return table;}}Factory層:引用了接口層。通過配置文件和抽象工廠我們可以實現不更改代碼,換一下配置文件中的value值就可以更換數據庫了。Factory還需要完成的工作就是定義一個接口調用接口層,實現BLL層和DAL層之間的數據傳遞。
public class LoginFactory{string StrDB = System.Configuration.ConfigurationManager.AppSettings["DB"];public IDAL.LoginIDAL CreateUser(){string ClassName = StrDB + "." + "LoginDAL";//DAL層的類名return (IDAL.LoginIDAL)Assembly.Load(StrDB).CreateInstance(ClassName);}}SQLHelper:它是從DAL層分離出來的,定義了數據庫的連接和一些SQL語句。將D層中需要重復使用的連接數據庫代碼抽象到一個層里面了,這樣就不用重復的寫這些代碼了,減少了冗余。
public class SQLHelper{private SqlConnection conn = null;private SqlCommand cmd = null;private SqlDataReader sdr = null;public SQLHelper(){string connStr = ConfigurationManager.AppSettings["connstr"];//連接數據庫,connstr是從web.config配置文件里面連接數據庫的關鍵字,在每個.cs頁面引用這一句就可以連接數據庫conn = new SqlConnection(connStr);}private SqlConnection GetConn(){if (conn.State == ConnectionState.Closed){conn.Open();}return conn;}/// <summary>/// 執行不帶參數的的增刪改SQL語句或者存儲過程/// </summary>/// <param name="cmdText">增刪改查SQL</param>/// <param name="ct">命令類型</param>/// <returns>返回受影響的行數</returns> public int ExecuteNonQuery(string cmdText, CommandType ct){int res;try{cmd = new SqlCommand(cmdText, GetConn());cmd.CommandType = ct;res = cmd.ExecuteNonQuery();}catch (Exception ex){throw ex;}finally{if (conn.State == ConnectionState.Open){conn.Close();}}return res;}/// <summary>/// 執行帶參數的的增刪改SQL語句或者存儲過程/// </summary>/// <param name="cmdText">增刪改查SQL</param>/// <param name="paras">要查詢的參數</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.AddRange(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;}}最后還有很重要的配置文件:
<configuration><startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /></startup><appSettings><add key ="ConnStr" value="server=SWX101; database=Computer;user ID = sa ; pwd=123456"/><!-- server是自己數據庫的名字或者用.代表本地;把database,uid,pwd修改為與自己數據庫對應的關系--><add key ="DB" value="DAL" /></appSettings> </configuration>?
總結
以上是生活随笔為你收集整理的个人机房重构--七层实现登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#--装箱和拆箱
- 下一篇: 集线器、交换机与路由器