三层架构-----实践篇-登录小实例
上一篇博客小編簡(jiǎn)單介紹了一下我們?cè)谲浖_(kāi)發(fā)過(guò)程中應(yīng)用到的三層架構(gòu)基本理論。光有理論還是遠(yuǎn)遠(yuǎn)不夠的,只有真正的
在項(xiàng)目中實(shí)踐過(guò),才能更好地理解它的精髓所在。接下來(lái)小編以一個(gè)實(shí)現(xiàn)登錄功能的小例子來(lái)展現(xiàn)三層架構(gòu)是如何應(yīng)用到我
們的軟件開(kāi)發(fā)過(guò)程中的。
?
?⑴首先我們需要搭建基本框架:
? ? ? ?? 打開(kāi)我們的VS,新建一個(gè)解決方案,在解決方案下面建立類(lèi)庫(kù),
這包括三層架構(gòu)里面的基本三層,且還需要一個(gè)實(shí)體層,也就是在該解決方案下面有四個(gè)類(lèi)庫(kù)。
⑵其次我們要設(shè)置好層與層之間的引用關(guān)系:
? ? ? ? 具體的引用關(guān)系,請(qǐng)參看上篇博客。
⑶再次我們要添加需要的類(lèi)了:
? ? ? ? 在上一步建立好的類(lèi)庫(kù)下面建立需要的類(lèi)。由于U層與用戶打交道,用于人機(jī)交互,所以U層需要建立Windows窗體;其它層只需建立普通的類(lèi)即可。
⑷最后我們需要設(shè)計(jì)UI 并進(jìn)行編碼了:
? ? ?? 這一步,首先需要我們對(duì)用戶界面進(jìn)行設(shè)計(jì),滿足業(yè)務(wù)需求;然后進(jìn)行編碼以實(shí)現(xiàn)需求。
? ? ?? 在編碼過(guò)程中,首先,我們要寫(xiě)好實(shí)體層,定義好編碼過(guò)程中所需要的字段(字段是是私有的,若是公有的,在使用過(guò)程中可能被意外修改),以及字段對(duì)應(yīng)的屬性(是公有的,用于傳參,對(duì)字段起保護(hù)作用,在使用過(guò)程中防止字段被意外修改)。
? ? ?? 其次,我們要連接數(shù)據(jù)庫(kù)。與數(shù)據(jù)庫(kù)打交道的是D層,所以我們要將連接數(shù)據(jù)庫(kù)的代碼寫(xiě)到D層。
? ? ? ?①在D層新建一個(gè)類(lèi),用于編寫(xiě)連接數(shù)據(jù)庫(kù)的字符串
? ? ?
class DbUtil {//創(chuàng)建連接數(shù)據(jù)庫(kù)的字符串public static string ConnString =@"Server=(SQL server 服務(wù)器的名字);Database=(數(shù)據(jù)庫(kù)名字);UserID=(SQL server 登錄名);Password=(SQL server 登錄密碼)";}?小貼士:如果忘記了登錄密碼,請(qǐng)不要著急喲,可以先選擇Windows身份驗(yàn)證進(jìn)行登錄,然后再修改密碼進(jìn)行密碼重置即可。
? ??②在D層再新建一個(gè)類(lèi),用于編寫(xiě)SQL語(yǔ)句,并創(chuàng)建數(shù)據(jù)庫(kù)連接
public class UserDAL{//編寫(xiě)類(lèi)型為UserInfo的SelectUser方法,并定義需要的用戶名和密碼參數(shù)public UserInfo SelectUser(string userName,string password){//using作用:1、? 引用命名空間;2、? 為命名空間或類(lèi)型創(chuàng)建別名;3、? 使用using語(yǔ)句 //在這里,使用using語(yǔ)句的作用:using語(yǔ)句允許程序員指定使用資源的對(duì)象應(yīng)當(dāng)何時(shí)釋放資源, //using語(yǔ)句中使用的對(duì)象必須實(shí)現(xiàn)IDisposable接口.此接口提供了Dispose方法,該方法將釋放此對(duì)象的資源。 //在程序編譯階段,編譯器會(huì)自動(dòng)將using語(yǔ)句生成try-finally語(yǔ)句,并在finally塊中調(diào)用對(duì)象的Dispose方法來(lái)清理資源. //所以,using語(yǔ)句等效于try-finally語(yǔ)句using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))//創(chuàng)建數(shù)據(jù)庫(kù)的連接對(duì)象{//創(chuàng)建SqlCommand連接對(duì)象SqlCommand cmd = conn.CreateCommand();//為連接對(duì)象獲取SQL語(yǔ)句cmd.CommandText = @"SELECT ID,UserName,Password,EmailFROM USERS WHERE UserName=@UserName AND Password=@Password";//為連接對(duì)象獲取CommandType值cmd.CommandType = CommandType.Text;//為連接對(duì)象添加參數(shù)cmd.Parameters.Add(new SqlParameter("@UserName", userName));cmd.Parameters.Add(new SqlParameter("@Password", password));//打開(kāi)連接conn.Open();//應(yīng)用SqlCommand類(lèi)的方法ExecuteReader(),此方法用于用戶進(jìn)行的查詢操作,它的返回類(lèi)型為SqlDataReader//執(zhí)行查詢操作SqlDataReader reader= cmd.ExecuteReader();//聲明一個(gè)UserInfo類(lèi)型的用戶user 且為空UserInfo user = null;//使用SqlDataReader對(duì)象的Read()方法進(jìn)行逐行讀取while (reader.Read()){if (user==null)//如果用戶對(duì)象user為Null{user = new UserInfo();//則創(chuàng)建一個(gè)新的對(duì)象}//如果查詢到的用戶對(duì)象不為Null,則獲取用戶對(duì)象的信息user.ID = reader.GetInt32(0);user.UserName = reader.GetString(1);user.Password = reader.GetString(2);if (!reader.IsDBNull(3)){user.Email = reader.GetString(3);}}//執(zhí)行查詢語(yǔ)句后,將查詢結(jié)果返回,返回一個(gè)用戶對(duì)象 傳給B層return user;}}}? ? ③在B層新建一個(gè)類(lèi),用于編寫(xiě)邏輯判斷
//B層邏輯判斷的登錄方法public UserInfo UserLogin(string userName,string password){//實(shí)例化D層UserDAL uDao = new UserDAL();//調(diào)用D層的查詢方法,將返回來(lái)的對(duì)象用UserInfo類(lèi)型來(lái)接收UserInfo user= uDao.SelectUser(userName, password);//將參數(shù)傳給D層,進(jìn)行SQL語(yǔ)句的查詢//判斷返回的對(duì)象是否為Nullif (user!=null )//登錄成功{//將查詢后的結(jié)果 返回來(lái)的對(duì)象傳給U層return user;}else{throw new Exception("登錄失敗。");}}??④在U層中已建好的Windows窗體中編寫(xiě)代碼
//登錄按鈕的單擊事件private void btnLogin_Click(object sender, EventArgs e){//定義string類(lèi)型的變量,用于接收用戶輸入的用戶名string userName = txtUserName.Text.Trim();//定義string類(lèi)型的變量,用于接收用戶輸入的密碼string password = txtPassword.Text;//實(shí)例化B層的類(lèi),創(chuàng)建該類(lèi)型的對(duì)象Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();//實(shí)例化實(shí)體層的類(lèi),創(chuàng)建UserInfo類(lèi)型的對(duì)象,并調(diào)用B層的登錄方法Login.Model.UserInfo user= mgr.UserLogin(userName, password);//將參數(shù)傳給B層MessageBox.Show("登錄用戶:" + user.UserName);}?到此為止,一個(gè)簡(jiǎn)單的登錄小實(shí)例就完成啦,是不是感覺(jué)并不難呢。
通過(guò)在項(xiàng)目中的實(shí)踐,當(dāng)我們實(shí)現(xiàn)某一功能時(shí),小編認(rèn)為,我們首先要明確業(yè)務(wù)需求;然后根據(jù)業(yè)務(wù)需求設(shè)計(jì)用戶界面;接著由用戶界面涉及到的數(shù)據(jù)庫(kù)中某表里的字段編寫(xiě)實(shí)體層,定義字段、屬性用于傳參;最后進(jìn)行編碼。由D層向B層再向U層進(jìn)行編寫(xiě)代碼,這樣當(dāng)我們需要實(shí)體或?qū)嵗骋粚拥念?lèi)來(lái)創(chuàng)建對(duì)象時(shí),不會(huì)出現(xiàn)實(shí)例化時(shí)無(wú)該類(lèi)的情況。
?感謝您的閱讀,如有不當(dāng)之處,還望您能及時(shí)斧正喲;若對(duì)您有幫助,記得給小編點(diǎn)個(gè)贊喲!(*^▽^*)
總結(jié)
以上是生活随笔為你收集整理的三层架构-----实践篇-登录小实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 三层架构---理论篇
- 下一篇: “七层架构”---理论篇