【C#实践】详解三层转七层:登录
背景
一開始借用別人的代碼,敲完也是很多地方看不懂!不知道從什么地方下手!不懂三層到七層到底是怎么映射過去的!
后來就是多查,慢慢有大體的輪廓,逐個部分解決!
過程:
1.看整體,對于不懂的部分,先查個大概
2.把屬于三層的部分分出來看,明白七層里面是怎么走的
3.搞明白工廠,外觀是為什么加,怎么加上去的
外觀模式:
?
工廠模式:
在七層中,一開始的初心的確是用抽象工廠+反射,因為不確定數據庫的使用,所以需要寫出個中工廠類
?
但后來實際分析,七層中用的并不是抽象工廠,而是簡單工廠改進的抽象工廠
因為如果真的是抽象工廠,那為什么代碼里沒有IFactory的類呢?
其實它將抽象工廠類IFactory和具體的實現子類用一個單獨的類來表示,也就是簡單工廠,將原本抽象工廠中實例化不同的工廠的過程變成了在簡單工廠中的選擇
?
最后,而在簡單工廠中有因為應用反射來代替簡單工廠中的選擇
?
所以,就不存在選擇的部分,想用哪個數據庫,直接改配置文件,實例的過程是依賴配置文件來實例化,修改配置文件,只需要該DAL里面具體實現接口的類
?
關于每一層具體的功能,其實對照著三層,就能夠大致感覺出來
4.調試,解決運行過程中出現的問題
收獲
敲七層看了很多博客,也回頭了看自己的博客,最明顯的感受,不管做什么都要一往無前!純理論——轉變——實際應用
一往無前,一直前進,前面沒有東西能夠阻擋,勇猛武威的前進
【反義詞】畏葸不前,裹足不定,畏首畏尾? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
越勇敢不怕,越是會發現 問題如此簡單,多查,多反復,多實踐總結
代碼:
Entity層
namespace Entity
{public class UserInfo{private int? userid; //定義字段 用戶ID 字段private string userName; //定義字段 用戶名 字段private string password; //定義字段 密碼 字段private string level; //定義字段 等級 字段public int? Userid { get => userid; set => userid = value; } public string UserName { get => userName; set => userName = value; }public string Password { get => password; set => password = value; } public string Level { get => level; set => level = value; } }
}
DAL層
namespace DAL
{public class LoginDAL:IDAL.LoginIDAL {public DataTable selectUser(Entity.UserInfo UserInfo) //在內存中的一個數據表{ SqlHelper sqlHelper = new SqlHelper();string sql = @"SELECT * FROM [User_info] WHERE UserID= @userID and Pwd= @PassWord";SqlParameter[] sqlParams = { new SqlParameter("@userID", UserInfo.Userid), new SqlParameter("@PassWord", UserInfo.Password) };DataTable table = sqlHelper.ExecuteQuery(sql, sqlParams, CommandType.Text);return table; }}
}
sqlHelp類前面博客中已經完成
IDAL層
namespace IDAL
{public interface LoginIDAL{DataTable selectUser(Entity.UserInfo UserInfo);}
}
?
Factory層
using System.Reflection;namespace Factory
{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);//反射+工廠的應用}}
}
?
BLL層
namespace BLL
{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){flag = false;}else{flag = true;}return flag;}}
}
?
Facade層
namespace Facade
{public class LoginFacade{public Boolean SelectUser(Entity.UserInfo user){bool flag;BLL.LoginBLL userBLL = new BLL.LoginBLL();flag = userBLL.UserBLL(user);return flag;}}
}
?
UI層
namespace UI
{public partial class UILogin : Form{public UILogin(){InitializeComponent();}private void butOk_Click(object sender, EventArgs e){if (txtUserID.Text.Trim() == ""){MessageBox.Show("用戶名不能為空,請輸入用戶名", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}if (txtPassword.Text == ""){MessageBox.Show("密碼不能為空,請輸入密碼", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);}//try//{Entity.UserInfo user = new Entity.UserInfo();user.Userid = Convert.ToInt32(txtUserID.Text.Trim());user.Password = txtPassword.Text;Boolean flag = false;Facade.LoginFacade FLogin = new Facade.LoginFacade(); //實例化外觀flag = FLogin.SelectUser(user);//調用外觀方法,返回給userif (flag!=false){MessageBox.Show("登錄成功");this.Hide();//隱藏當前窗體this.DialogResult = System.Windows.Forms.DialogResult.OK;frmMain frmMain = new frmMain();//實例化一個窗體frmMain.Show();}else{MessageBox.Show("密碼或用戶名錯誤");}//}//catch (Exception)//{// throw;//}}private void butCancel_Click(object sender, EventArgs e){System.Environment.Exit(0);//這是最徹底的退出方式,不管什么線程都能被強制退出//this.Close();//只是關閉當前窗口,若不是主窗體的話,是無法退出程序的,另外,若有托管線程(非主線程),也無法干凈退出//Application.Exit();//強制所有消息終止,退出所有的窗體,但是若有托管線程(非主線程),也是無法干凈退出的;//Application.ExitThread();//強制終止調用線程上的所有消息,同樣面臨其他線程無法正確退出的難題}}
}
?
總結
以上是生活随笔為你收集整理的【C#实践】详解三层转七层:登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: visual2017中给C#项目添加配置
- 下一篇: 机房重构数据库设计