標籤:style 使用 os io 檔案 資料 art ar
三層架構並非MVC,MVC是一個非常早就有的經典的程式設計模式,M-V-C分為三層,M(Model)-V(View)-C(Control)。而web開發中的三層架構是指:資料訪問層(DAL-DatabaseAccessLayer),商務邏輯層(BLL-BusinessLoginLayer),以及使用者介面層(UI-UserInterface,實際就是網頁背景詳細調用BLL層)。這個是基本概念。以前我以為三層架構就是在AppCode中,分為三個大類與若干小類,各司其職。在經過一番洗禮後,才發覺多麼的無知。
首先AppCode中,放的是通用類,如資料庫通用類,實現資料庫連接,主要的SqlCommand建立,自己定義CRUD的方法等,與三層架構毫無關係,就是經常使用的開發模式中存放類(Class)的目錄。
其次,當使用三層架構時,一定是在大項目中,由於三層架構的目的是提高項目的鬆散性和減少項目的耦合度,使之更easy擴充或者維護。小項目使用了三層架構,由於過度的在意分層而導致了項目的複雜度添加。
建立三層架構的應用程式。我們必須對這三層分別建立不同的類庫(ClassLibrary),而不是普通的類(Class)。我們對於不論什麼一個模組或者功能進行OOP,把它擴充為對象(物件導向的思想就是:將所操作的目標當成一個對象,對它進行的操作,將由對象自己的方法進行,而非外界傳參。譬如注冊使用者,用面向過程的方法事先,就是:public static bool Register(string userName, string userPwd)。若用OO的思想,我們不可將帳號password作為參數傳入,而是將使用者作為一個對象,這個對象具有private _userName,和private _userPwd的屬性。在注冊時,用建構函式初始化一個新的對象,User one = new User(userName,userPwd),使之在初始化後具有這兩個欄位的值。然後調用User類中的public static bool Register()方法(注意這種方法是不進行傳參的),而在這個Register方法中,使用對象的_userName和_userPwd屬性進行注冊。),那麼,我們在這個對象中的不論什麼操作都將以該對象的方法(函數)實現。
在進行三層分類時,這樣建立類庫。
1.檔案->建立項目->其它項目類型->空白解決方式。
2.在右側的“資源管理員”中,選中當前解決方式,右鍵加入->建立項目->類庫(ClassLibrary),分別建立BLL,DAL,UL類庫。(若加入後看不到解決方式則在菜單->工具->選項->項目和解決方式->總是顯示解決方式)。
3.右鍵,向解決方式中加入一個網站(新網站或者現有網站)。
4.依據需求刪除或者保留預設加入項(預設的class1.cs或Default.aspx檔案)。
這樣一個三層架構的網站雛形就搭建好了。由於UI層要被其它兩層引用,DAL層要被BLL層引用。所以須要相互加入引用,方法是在類庫上點擊右鍵->加入引用->項目->選擇其它類庫。而且在詳細類中引入命名空間(using namespace)。
ps:類庫事實上就是類的集合,三層架構的目的就是,將同一項目的不同模組都劃分為各自的三層,各司其職,將詳細實現方法用類寫出,加入到該層的類庫中,這樣,一個網站下的類庫就僅僅有三層,每一層中都包括了各個模組相相應層的實現方法。在以後改動或擴充時,在相應層中進行操作就能夠了。
一般的項目,涉及最多的就是對資料庫的CRUD,DAL層僅僅負責與資料庫的互動,BLL層是最重要的一層,他負責將DAL層的的結果呈現給UI層,可是恰恰BLL層的存在似乎有點雞肋,他起到的僅僅是轉寄DAL層資料的作用,而詳細的邏輯操作是與資料庫的互動,應該寫在DAL層,這就好像BLL層是在反覆DAL層的勞動一樣,事實上BLL層的作用在於除了調用DAL層訪問資料庫,還能夠進行邏輯推斷,當符合的時候,才進行同意進行DAL的操作,或者進行額外的操作(如加密,轉換等)。而DAL層可無論這些,他僅僅管進行CRUD的動作。UI層就是操作抽象出來的實體物件,它包括了各種屬性。
一個三層架構的小範例:注冊新使用者。
先寫模組的實體類,是資料庫中表的抽象,如果資料庫中注冊資訊僅僅有帳號,password兩個欄位。那麼抽象到實體類就是這樣:
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Entity{ class UserInfo { public string UserName { get; set; } //C#3.0中屬性構造器的新寫法; public string UserPwd { get; set; } }}
再寫DAL層:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using System.Data.SqlClient;using Entity; //這裡加入對Entity實體類的引用;namespace DAL{ public class UserDAL { //在該類中,為了方便,通常會構造一個DataBaseFactory,方便進行代碼的操作。所以下面代碼僅為邏輯實現,不代表代碼正確。 public bool AddUser(UserInfo uInfo) //這裡將實體類作為參數傳入; { string sqlStr="INSERT INTO UserInfo(Name,Pwd) VALUES(@name,@pwd)"; SqlCommand cmd=new SqlCommand(sqlStr); cmd.Parameters.Clear(); cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = uInfo.UserName; //調用實體類的屬性 cmd.Parameters.Add("@pwd", SqlDbType.NVarChar, 50).Value = uInfo.UserPwd; return Convert.ToInt32(cmd.ExecuteNonQuery()) > 0 ? true : false; } public DataTable GetUserInfo(string name) //依據username獲得使用者的詳細資料 { string sqlStr="SELECT * FROM UserInfo WHERE Name=@name"; SqlCommand cmd=new SqlCommand(sqlStr); cmd.Parameters.Clear(); cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = name; SqlDataAdapter sda = new SqlDataAdapter(cmd); DataSet ds=new DataSet(); sda.Fill(ds,"UserInfo"); return ds.Tables["UserInfo"]; } }}
再寫BLL層:
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data;using Entity; //加入對Entity類庫的引用using DAL; //加入對DAL類庫的引用namespace BLL{ public class UserBLL { public static bool AddUser(UserInfo uInfo) //BLL層的方法多為靜態方法,DAL層也能夠為靜態方法。 { UserDAL uDal = new UserDAL(); DataTable dTable = uDal.GetUserInfo(uInfo.UserName); if (dTable.Rows.Count > 0) //這裡對注冊使用者有一個推斷,從DAL層中先通過注冊名獲得使用者的詳細資料,若能夠獲得則證明該username已被注冊,返回false; return false; else return uDal.AddUser(uInfo); } }}
最後構建UI層代碼,即我們的aspx.cs頁面代碼,該層應該直接調用BLL層的方法。該頁面引用BLL和Entity的命名空間,並向Button控制項注冊事件:
protected void btnRegister_OnClick(object sender, EventArgs e) { UserInfo uInfo = new UserInfo(textUserName.text, textUserPwd.text); if (UserBLL.AddUser(uInfo)) Response.Write("注冊成功!"); else Response.Write("注冊失敗!"); }
這樣一個小的三層架構程式就出來了。
這個程式中,操作的實體為UserInfo表的抽象。在DAL層進行了AddUser()的方法,在BLL層也進行了AddUser()的方法,唯一的差別是BLL層做了邏輯推斷,假設username存在,則注冊失敗。
三層架構的特點:
1.資料庫訪問層(DAL)僅提供對資料庫的CRUD操作,而無論操作後的結果,也無論邏輯過程(譬如同名使用者,不合法username)。
2.商務邏輯層(BLL)不會直接與資料庫互動,他與資料庫的互動是通過DAL提供的方法。在調用這些方法前,要增加自己的邏輯推斷或者業務處理。另外商務邏輯層(BLL)還有可能不會去調用DAL層的方法,而是進行其它業務處理。
3.使用者介面層(UI)層是不會調用DAL層的,他僅僅調用BLL層提供的方法,再由BLL層自己決定是否繼續調用DAL層。
這個範例能夠看出三層架構的長處就是結構清晰,easy擴充與維護。缺點就是,複雜。只一個注冊使用者,就這麼麻煩,所以對於小項目來說,費這麼大勁換取一個相對較清晰的分層結構是不划算的。
轉載請註明出處:csdn-mark