三层架构—简析
? ? 三層學(xué)習(xí)完了,第一次驗收的時候,自己理解的也不是非常到位,后來又又一次敲了一遍登陸樣例,查閱了一些資料
進(jìn)行第二次驗收才感覺清晰了很多。之前畫時序圖時我就想過時序圖基本上也是非常好的體現(xiàn)了三層,當(dāng)時也和別人討
論過這個問題。
直到學(xué)完三層后,更加證明了這一點。
? ? 以下我將從理論和實踐兩個角度總結(jié)一下三層。
理論篇
? ? 為什么使用三層架構(gòu)?
? ? 說白了,分層的目的是想將復(fù)雜問題簡單化,也就是面向?qū)ο蠹夹g(shù)所崇尚的“高內(nèi)聚,低耦合”。當(dāng)業(yè)務(wù)復(fù)雜到
一定程度。數(shù)據(jù)存儲在獨立的存儲介質(zhì)時適合用三層架構(gòu)。
? ? 什么是三層架構(gòu)?
? ? 通常意義上的三層架構(gòu)(3-tier architecture)就是將整個業(yè)務(wù)應(yīng)用劃分為:表現(xiàn)層(UI)、業(yè)務(wù)邏輯層
(BLL)、數(shù)據(jù)訪問層(DAL)。
? ? 圖解
? ? 表現(xiàn)層(UI):主要是指人機交互界面。用于接收用戶輸入的數(shù)據(jù)和顯示處理后用戶須要的數(shù)據(jù)。
? ? 業(yè)務(wù)邏輯層(BLL):連接UI和DAL的橋梁。
? ? 數(shù)據(jù)訪問層(DAL):實現(xiàn)數(shù)據(jù)庫的增、刪、改、查。
? ? 實體類(Model):不屬于三層的范疇,個人理解的建立實體類的目的是將加載的數(shù)據(jù)庫中的數(shù)據(jù)放入當(dāng)中,
UI、BLL、DAL。哪個須要就從實體類中獲取。封裝數(shù)據(jù),避免了傳參數(shù)造成的復(fù)雜,從而避免了各個層與數(shù)據(jù)庫的直
接接觸,造成數(shù)據(jù)交叉。各個層僅僅須要和實體層Model打交道就可以。
? ? 點睛
? ? 各個層各司其職,僅僅負(fù)責(zé)自己專屬的功能。提高了內(nèi)聚性,降低了彼此之間的耦合。Model是數(shù)據(jù)傳輸?shù)臉I(yè)務(wù)數(shù)
據(jù)模型,不是數(shù)據(jù)庫中的數(shù)據(jù)。Model是避免出現(xiàn)數(shù)據(jù)交而建立的。
? ? 怎樣搭建?
? ? 優(yōu)缺點?
? ? 長處
? ? ? ? 1、開發(fā)者能夠僅僅關(guān)注整個結(jié)構(gòu)中的當(dāng)中某一層。
? ? ? ? 2、能夠減少層與層之間的依賴;
? ? ? ? 3、有利于標(biāo)準(zhǔn)化,能夠非常easy的用新的實現(xiàn)來替換原有層次的實現(xiàn)。
? ? ? ? 4、在后期維護(hù)的時候,極大地減少了維護(hù)成本和維護(hù)時間
? ? 缺點
? ? ? ? 1、減少了系統(tǒng)的性能。這是不言而喻的。假設(shè)不採用分層式結(jié)構(gòu)。非常多業(yè)務(wù)能夠直接造訪數(shù)據(jù)庫,以此獲
取對應(yīng)的數(shù)據(jù)。現(xiàn)在卻必須通過中間層來完畢。
? ? ? ? 2、有時會導(dǎo)致級聯(lián)的改動。這樣的改動尤其體如今自上而下的方向。
假設(shè)在表示層中須要添加一個功能。為
保證其設(shè)計符合分層式結(jié)構(gòu),可能須要在對應(yīng)的業(yè)務(wù)邏輯層和數(shù)據(jù)訪問層中都添加對應(yīng)的代碼。
? ? ? ? 3、添加了開發(fā)成本。
實戰(zhàn)篇
? ? 以下是一個登錄窗口的DEMO
? ? UI層的代碼
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace LoginUI {public partial class Form1 : Form{public Form1(){InitializeComponent();}private void btnLogin_Click(object sender, EventArgs e){string userName = txtUserName.Text.Trim(); string password = txtPassword.Text;Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); //重載BLL層Login.Model.UserInfo user = mgr.UserLogin(userName, password);MessageBox.Show("登錄用戶:" + user.UserName);}} } </span>
? ? UI層,人機交互。須要引用BLL和Model層,從代碼中能夠看出UI層不包括不論什么邏輯推斷的代碼和跟數(shù)據(jù)庫有關(guān)的
代碼。
? ? BLL層的代碼
<span style="font-family:KaiTi_GB2312;font-size:18px;">namespace Login.BLL {public class LoginManager{public Login.Model.UserInfo UserLogin(string userName, string password) //獲得Model中封裝的數(shù)據(jù)庫中的數(shù)據(jù)(UI層中的){Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); //實例化UserDAO類Login.Model.UserInfo user = uDao.SelectUser(userName, password); if (user != null) // 加載成功{Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); //知道數(shù)據(jù)庫連接成操作命令sDao.UpdateScore(userName, 10);return user;}else{throw new Exception("登錄失敗。");} </span>
? ? 從代碼中能夠看出BLL層也不和數(shù)據(jù)庫打交道,沒有SQL語句。
須要引用DAL和Model層。
? ? DAL層代碼
<span style="font-family:KaiTi_GB231<span style="font-family: Arial, Helvetica, sans-serif;">2;font-size:18px;">namespace Login.DAL</span>{public class UserDAO{public Login.Model.UserInfo SelectUser(string userName, string password) //獲取Model中的表中的數(shù)據(jù),返回的是數(shù)據(jù)模型{using (SqlConnection conn = new SqlConnection(DbUtil.ConnString)) //建立數(shù)據(jù)庫連接{SqlCommand cmd = conn.CreateCommand(); //表示要對 SQL Server 數(shù)據(jù)庫運行的一個 Transact-SQL 語句或存儲過程。
實例化一個接口,用以運行SQL指令 cmd.CommandText = @"SELECT ID, UserName, Password,Email FROM USERS WHERE UserName=@UserName AND Password=@Password"; cmd.CommandType = CommandType.Text; cmd.Parameters.Add(new SqlParameter("@UserName",userName)); //添加上面數(shù)據(jù)庫連接中設(shè)的兩個參數(shù) cmd.Parameters.Add(new SqlParameter("@Password",password)); conn.Open(); //打開數(shù)據(jù)庫 SqlDataReader reader = cmd.ExecuteReader(); Login.Model.UserInfo user = null; //默認(rèn)值是Null while (reader.Read()) //讀取數(shù)據(jù)庫中的數(shù)據(jù) { if (user == null) { user = new Login.Model.UserInfo(); //當(dāng)Model是Null的話才載入數(shù)據(jù) } user.ID = reader.GetInt32(0); user.UserName = reader.GetString(1); user.Password = reader.GetString(2); if (!reader.IsDBNull(3)) //假設(shè)Email不是Null的話,才干讀取 { user.Email = reader.GetString(3); } } return user; } } } } </span>
? ? 從代碼中能夠看出是直接和數(shù)據(jù)庫打交道的,沒有跟窗口控件有關(guān)的內(nèi)容。須要引入Model層。
個人小結(jié)
? ? 分層的目標(biāo)是為了“高內(nèi)聚。低耦合”。分層可將復(fù)雜的簡單化。當(dāng)需求須要改變時,你僅僅須要該對應(yīng)部分而不
用大范圍的改動。分層還提高了可維護(hù)性和可擴展性,但并非全部的都要分層,業(yè)務(wù)邏輯簡單,沒有真正的數(shù)據(jù)存
儲層這時就不須要分層,假設(shè)分層反而會添加復(fù)雜度。所以我們尋常在使用時要注意靈活應(yīng)用。
轉(zhuǎn)載于:https://www.cnblogs.com/blfbuaa/p/7241251.html
總結(jié)
- 上一篇: 服务器上的微信转账记录能删除吗,微信如何
- 下一篇: Win10数字签名错误/winload.