日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【C#实践】详解三层转七层:登录

發布時間:2023/11/28 生活经验 58 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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#实践】详解三层转七层:登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。