【ASP.NET開發】.NET三層架構簡單解析
這篇文章本來應該很早就寫出來的,但是一直苦於自己的精神能力有限,而且已經到了我們學校的考試周,所以時間上還是有點緊迫。關鍵的一點就是,找不到合理的思路來寫,思路沒有的話,就算是再好的素材,也寫不來大家喜歡的文章。
之前已經寫過關於.NET三層架的兩篇文章了,一篇是《【ASP.NET開發】ASP.NET(MVC)三層架構知識的學習總結》和《【ASP.NET開發】ASP.NET對SQLServer的通用資料庫訪問類》。如果大家有興趣的話,可以去讀一讀。當然了,這兩篇文章的內容,大部分都不是自己的,自己也是看了別人的博文,然後自己總結一下,拿過來自己用罷了。這次的文章主要是自己親自使用這些知識做了一個專案(我們學校資環學院的院網站),然後拿出來跟大家分享一下。也不要期望博主能夠寫出多麼有水平的文章,我還是學生(大三),我也是在學習的過程中,寫部落格之不過是想記錄自己學習過程中的點滴和記錄自己的進步,如果能夠順便的幫助別人學習就更好了。同時也希望大家能夠多給我提意見。
非常感謝部落格園的博友 @ ,@,@ 等博友給我提出的寶貴的修改意見。也希望大家在閱讀本博文的時候,如果有什麼問題,或者疑問及時的給我留言溝通,大家一起探討。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
對於三層架構來說,主要是使用設計模式的思想,對於專案的各個模組實現"高內聚,低耦合"的思想。這裡就不做詳細的介紹了,如果大家有興趣,可以閱讀軟體工程和設計模式相關文章。
對於三層架構來說,就是使用類,把我們在做專案的過程中,可能需要反覆操作資料庫,反覆的使用某個方法等等,可能就是操作的引數不同。如果我們如果在每次使用的時候,都去編寫相應的程式碼,無疑會增加程式設計師的負擔。所以,為了增加方法的重用,就把這些能夠重用的方法抽象成類,以供程式設計師在其它地方可以呼叫。
當然了,這也是面向物件的一部分。其中的三層所指的就是:①檢視層(UI)②資料庫訪問層(DAL)③業務邏輯層(BLL)。當然了,還有所謂的第四層-實體層(model),這一層主要是在這三個層之間進行流動傳遞。但是為什麼不叫四層架構。。。原因我也不知道,可能是因為實體層是外在的可以根據需要會隨時變化的(如:專案後續模組的新增等)。而其它三個層,如果搭建完後,可以作為框架來使用的。。。
1)首先還是先來介紹一下實體層吧,就是我們通常所說的model
實體就是我們在開發專案過程中所要涉及的一些物件。把這些所要涉及的物件(如:新聞名稱,新聞上傳時間,供稿人,上傳檔案的名稱等),都抽象成一個類。使用封裝欄位方法,我們可以在檢視層通(主要是檢視層)過例項化物件的方法,來給我們的物件的屬性賦值。
簡單的看一段程式碼吧,可能會能夠更加的清楚,明白
public class NewsModel
{
//新聞編號
private int nNewsId;
public int NNewsId
{
get { return nNewsId; }
set { nNewsId = value; }
}
//新聞名稱
private string strNewsName;
public string StrNewsName
{
get { return strNewsName; }
set { strNewsName = value; }
}
}
這裡的NewsModel就是一個關於新聞的實體類,其中聲明瞭兩個private的屬性欄位(一定要是private,防止非法賦值),使用public的建構函式,可以在外部給欄位賦值。
下面的就是在檢視層來例項化物件,根據需要來給欄位賦值,看下面的一段程式碼:
NewsModel newModel = new NewsModel();
newModel.StrNewsName = this.TextBox1.Text;
當然了,這僅僅是一段程式碼,其中並沒有給欄位nNewsId賦值,因為我把它作為資料庫的id地段,已經設定成自動增長。這樣,就完成了檢視層對實體層的呼叫。
2)資料庫訪問層
資料庫庫訪問層,顧名思義,就是主要來完成對資料庫的訪問,等一系類的對資料庫操作的類。為什麼要單獨的把對資料庫的操作抽象成一個單獨的類,我個人理解是因為在整個專案的開發過程中,不僅僅需要一次訪問資料庫,而是需要多次,如果每次都編寫資料庫訪問程式碼的話,會增加程式設計師的個人工作量,而且對於程式碼的易用性和簡潔性來說肯定是非常糟糕的。當然來可能還有其它的一些優點,我暫時還沒有發現。
既然是對資料庫的操作類,而且對資料庫的操作,無非就是四種:增刪改查。所以一個能提供增刪改查的通用類是必不可少的。這就是我們經常所說的,通用資料庫訪問類(很多的程式設計師都喜歡把這個類命名為SqlHelper,既然是名字,都是可以隨意起的,只要不違反C#語法命名規範,當然這樣命名也是有好處,就是可以使其他程式設計師根據類的名稱,大概判斷出這個類是要幹什麼的)。
當然了,我這次做自己專案的時候,所寫的資料庫訪問類就沒有我上次看周金橋老師的書,然後模仿寫的資料庫訪問類那麼的複雜了(《【ASP.NET開發】ASP.NET對SQLServer的通用資料庫訪問類》)。當然了,我這裡的資料庫訪問類,主要還是為了簡介,和易用,只要滿足我自己當前專案的需要就可以了,不是每做一個專案,都要寫一個功能全面的資料庫訪問類。
程式碼如下,請大家參考,更喜歡哪個訪問類,自己可以根據自己口味,或者需要,直接用也可以:
/// <summary>
///建立一個SqlHelper的資料庫訪問通用類,完成對資料庫的所有操作
/// </summary>
public class SqlHelper
{
//定義資料庫的連線字串
private static readonly string connectionString = ConfigurationManager.ConnectionStrings["strConnectionString"].ConnectionString;
/// <summary>
/// 建立方法,完成對資料庫的非查詢的操作
/// </summary>
/// <param name="sql">sql語句</param>
/// <param name="parameters">傳入的引數</param>
/// <returns></returns>
public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
string str = sql;
return cmd.ExecuteNonQuery();
}
}
}
/// <summary>
/// 完成查詢的結果值
/// </summary>
/// <param name="sql">sql語句</param>
/// <param name="parameters">傳入的引數陣列</param>
/// <returns></returns>
public static int ExecuteScalar(string sql, params SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
return Convert.ToInt32( cmd.ExecuteScalar());
}
}
}
/// <summary>
/// 主要執行查詢操作
/// </summary>
/// <param name="sql">執行的sql語句</param>
/// <param name="parameters">引數陣列</param>
/// <returns></returns>
public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters)
{
using (SqlConnection con = new SqlConnection(connectionString))
{
con.Open();
using (SqlCommand cmd = con.CreateCommand())
{
cmd.CommandText = sql;
cmd.Parameters.AddRange(parameters);
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
DataTable dt = new DataTable();
adapter.Fill(dt);
return dt;
}
}
}
}
這樣的類建立好以後,其他的需要訪問資料庫的類,就可以根據自己的需要,完成相應的增刪改查的操作了。還是用一段程式碼來演示吧:
/// <summary>
///NewsDALL 的摘要說明
/// </summary>
public class NewsDALL
{
//向資料庫中插入新聞
public int AddNews(NewsModel model)
{
string sql = "insert into News (name,author,time,content,sort,isdelete) values(@name,@author,@time,@content,@sort,@isdelete)";
int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@name", model.StrNewsName), new SqlParameter("@author",model.StrNewsAuthor),new SqlParameter("@time", model.StrAddTime), new SqlParameter("@content", model.StrNewsContent), new SqlParameter("@sort", model.Sort), new SqlParameter("@isdelete", model.IsDelete1));
return nResult;
}
//執行資料庫的刪除操作
public int DeleteNew(int id)
{
string sql = "delete from News where [email protected]";
int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@id", id));
return nResult;
}
//執行資料庫的更新操作
public int UpdateNew(NewsModel model, int nID)
{
string sql = "update News set [email protected],[email protected],[email protected] where id=" + nID;
int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@name", model.StrNewsName), new SqlParameter("@time", model.StrAddTime), new SqlParameter("@content", model.StrNewsContent));
return nResult;
}
//執行資料庫的查詢操作
public NewsModel GetNewsModel(int id)//宣告一次從資料庫中讀取新聞的條數
{
string sql = "select * from News where [email protected]";
DataTable dt = SqlHelper.ExecuteDataTable(sql, new SqlParameter("@id", id));
if (dt.Rows.Count <= 0)
{
return null;
}
else if (dt.Rows.Count == 1)
{
NewsModel newModel = new NewsModel();
DataRow dr = dt.Rows[0];
newModel.StrNewsName = dr["name"].ToString();
newModel.StrNewsAuthor = dr["author"].ToString();
newModel.StrAddTime = dr["time"].ToString();
newModel.StrNewsContent = dr["content"].ToString();
newModel.Sort = (int)dr["sort"];
return newModel;
}
else
{
throw new Exception("出現異常!");
}
}
}
這裡的這個NewsDALL類,主要是來完成有關新聞需要對資料庫的各種操作,當然了,這只是這個類的一部分,主要是來演示NewsDALL類怎樣呼叫SqlHelper類中的方法,來完成對資料庫的操作的。
3)接下來就是最後一層,業務邏輯層了。
業務邏輯層的話主要來處理檢視層和資料庫訪問層之間的關係的。當然了,也可以直接在檢視層呼叫資料庫訪問層,但是對於關係來說可能會增加複雜性,所以前輩們就專門的抽象出來一個業務邏輯層,把所有的業務邏輯關係都在這一層處理清楚之後再,訪問資料庫訪問層,進行對資料的操作。(當然這是我自己的理解,如果有什麼不對的話,請大家指正)
在我這次的專案中,貌似我的這一層完全是多餘的,因為不需要什麼太多的業務邏輯的處理,可以完全在檢視層直接訪問資料庫訪問層的。
還是使用程式碼說話吧,當然這個仍然是NewsBLL類程式碼的一部分:
/// <summary>
///業務邏輯層主要處理檢視層和資料庫訪問直接的關係
/// </summary>
public class NewsBLL
{
//完成對資料庫的新增
public static int AddNew(NewsModel model)
{
NewsDALL newDALL = new NewsDALL();
return newDALL.AddNews(model);
}
//完成對資料的刪除
public static int DeleteNew(int i)
{
NewsDALL newDALL = new NewsDALL();
return newDALL.DeleteNew(i);
}
//返回一個新聞分類的物件
public static NewsModel GetModel(int intSort)
{
NewsModel model = new NewsModel();
if (intSort == 1)
{
model.StrNewSort1 = "學院新聞";
model.StrNewSort2 = "";
model.StrNewSort3 = "";
}
else if (intSort == 2)
{
model.StrNewSort1 = "公告通知";
model.StrNewSort2 = "";
model.StrNewSort3 = "";
}
..........
return model;
}
}
接下來就是在檢視層來通過訪問,業務邏輯層來和實體層,來玩成所需要的資料操作了。
還是使用程式碼來描述吧,這個程式碼主要來完成對資料進行新增:
public void InsertData()
{
NewsModel newModel = new NewsModel();
newModel.StrNewsName = this.TextBox1.Text;
newModel.StrNewsAuthor = this.TxtBoxAuthor.Text;
newModel.StrAddTime = this.TxtDate.Text;
newModel.StrNewsContent = Server.HtmlDecode(FCKeditor1.Value);
newModel.Sort =Convert.ToInt32( this.DropDownList2.SelectedValue.ToString());
//NewsBLL newBLL = new NewsBLL();
int nResult= NewsBLL.AddNew(newModel);
if (nResult != 0)
{
Response.Write("<script>alert('新增成功!')</script>");
}
else
{
Response.Write("<script>alert('新增失敗!')</script>");
}
}
我以前自己做的圖,被大家指出了很多的錯誤。所以,我就引用了網路上的一個圖片來解釋(如果侵害了您的版權,請您聯絡我)
據我自己的理解,三層架構可以算是一個團隊專案開發的基本框架,在這個框架的基礎上可以滿足一些設計模式的需要。當然可以滿足模組開發的需要。
總結:
對於我這次的開發專案來說,收穫還是很多的,以前僅僅是知道有三層架構這個東西,也看書,照著別人的程式碼寫過,但是卻不能體會到這其中的真正意義。
優點:①使程式碼的重用更加的高了,不需要像以前做專案,每次在一個頁面反覆的編寫操作資料庫的程式碼,而使用三層架構的話,只需要把注意力放在業務邏輯層 的業務邏輯的處理和資料庫訪問層的sql語句的編寫。
②程式碼的整潔性,和易用性更加的高了。因為不同的操作都分別放在了不同的層,所以程式碼邏輯更加清晰,如果做好註釋的話,別人能夠更加清楚的理解 編寫者的意圖。
③可擴充套件型更加的高了,根據需要在不同的層編寫程式碼,然後呼叫就可以了。
④非常利於團隊開發。
當然了,三層架構的有點不僅僅有這些,不然也不會成為現在企業開發的基本框架,這只不過是我在開發中明顯的發現的優點,拿出來跟大家分享一下。
缺點:①就是效能上肯定比以前直接在相應的頁面編寫資料庫操作程式碼上有點降低。但是這個完全是可以接受的,況且,對於我現在的水平就是程式碼質量上可定還 有待提高,有更大的優化空間。
②就是在我的專案中,我覺得最大的浪費就是可以在檢視層直接訪問資料庫訪問層,因為要處理的業務邏輯實在是不多,所以還是有點程式碼冗餘吧。所以, 以後還是要跟據自己專案的需要,來靈活的使用,不一定要按照規定必須這樣做。
這僅僅是我的一點拙見,有什麼地方錯誤,請大家積極指正。也歡迎大家跟我交流。
原創作品,允許轉載,轉載時請務必以超連結形式標明文章 原始出處 、作者資訊和本宣告。
相關推薦
【ASP.NET開發】.NET三層架構簡單解析
這篇文章本來應該很早就寫出來的,但是一直苦於自己的精神能力有限,而且已經到了我們學校的考試周,所以時間上還是有點緊迫。關鍵的一點就是,找不到合理的思路來寫,思路沒有的話,就算是再好的素材,也寫不來大家喜歡的文章。 之前已經寫過關於.NET三層架的兩篇文章了,一篇是《【ASP
Asp.Net MVC+EF+三層架構 簡單搭建 (1) Asp.Net MVC+EF+三層架構
首先,謝謝各位過客觀看,今天我們說下簡單的 Asp.Net MVC+EF+三層架構 搭建( 第一部分)。 很簡單,先看下完成之後程式碼圖: 這裡講的是一個整體框架的搭建,所以頁面暫時Pass,先以一個小的查詢為例。 一、新建Model、Dal、Bl
ASP.NET中如何搭建三層架構
1、開啟VS2010,新建一個網站,更改名字後存放在1中的資料夾中,此時要記得給該網站建一個新的資料夾,專門用來存放該網站所有的檔案; 2、搭建資料訪問層,點選檔案——新增——新建專案——類庫,更改名字之後,存放在1中的資料夾中,同樣也為資料訪問層,建立一個新的資料夾,專門存
【ASP介面開發】獲取訪問URL的真實客戶端IP地址
目前專案中需要獲取到訪問介面的客戶端的真實IP,暫時用此做一個簡單的認證。在網上搜了個還算靠譜的,特做下記錄: public strIP if strIP="" then strIP="" '如果沒有定義 strIP 全域性變數則定義它 function getIP()
Java——Web開發之開源框架DBUtils的使用,JSP開發模式,三層架構與MVC設計模式的認識
DBUtils的使用: 在使用開源框架DBUtils時,它只是幫我們簡化了CRUD的程式碼,但是它不負責連線的建立以及獲取工作。 1.和使用開源框架都一樣的一個步驟,先匯入jar檔案 2.在這裡採用的是開源資料庫連線池C3P0進行連線 3.編寫CRUD程式碼 使用其功
【Android 多媒體開發】 MediaPlayer 狀態機 介面 方法 解析
作者 : 韓曙亮一. MediaPlayer 狀態機 介紹Android MediaPlayer 狀態即圖例 : 1. Idle (閒置) 狀態 和 End (結束) 狀態MediaPlayer 物件宣告週期 : 從 Idle 到 End 狀態就是 MediaPlayer 整
【Asp.Net MVC+EF+三層架構】詳解(三)MVC VS 三層架構
前言: 接著上篇部落格說:MVC和三層架構到底是怎麼樣的一個關係?相同?或是迥異?或是部分相同,部分不同?或是思想同,邏輯不同?這是個值得思考的問題。關於三層架構大家應該差不多都有些瞭解
【Asp.Net MVC+EF+三層架構】詳解(一)初見
前言: 這個專案是小編我進入公司開始全面重頭開始著手的第一個專案,在寶寶的IT生涯裡這是一個里程碑,有著與眾不同的意義。那麼在之後小編會從頭至尾的寫一組關於Asp.Net MVC+EF+三層架構框架
asp.net mvc 加三層架構 完美搭配
第二章 幫助 summary 本地數據庫 asp 存在 remoting new org http://www.hysql.org/aspnet/20180630/5712.html 先來一張項目的層級結構圖: Model:模型層,主要是各種類型、枚舉以及ORM框
三層架構中使用實體類填充泛型集合代替DataTable解決方案(ASP.NET+C#)
用三層架構開發專案,經常會遇到如下場景: D層負責與資料庫互動,一般是得到DataTable或DataSet物件,然後返回給B層,B層進行類似的處理來讀取資料:dt.Rows[0][“xxx”];或者dt.Rows[0][1];(強烈
C#/.NET 外觀模式,三層/N層開發
C# 外觀模式 外觀模式(Facade Pattern)隱藏系統的複雜性,並向客戶端提供了一個客戶端可以訪問系統的介面。這種型別的設計模式屬於結構型模式,它向現有的系統新增一個介面,來隱藏系統的複雜性。 這種模式涉及到一個單一的類,該類提供了客戶端請求的簡化方法和對現有系統類方法
.net三層架構開發步驟
City城市表,id ,name,password,address,phone; 1.新建一個windows窗體應用程式,CitySys 2.檔案–》新增–》新建專案–》類庫(CitySysModel)–》重新命名class1.cs的類(CityModel)。 3.根據資料表裡面的欄位,
ASP.NET實現三層架構網站建立流程
1.新建專案—>Visual C#—>Web—>ASP.NET空Web應用程式 或者 新建網站—>ASP.NET空網站 2.在解決方案處右擊—>新建專案—>Windows—>類庫,分別建立三層架構,Model(實體層)、Dll(
VS2010構建ASP.NET三層架構例項演示(一)
開發環境:vs2010+SQLSERVER2008 功能:簡單實現顯示一張表的記錄。 具體步驟: 1、開啟sql server2008,在裡面建立資料庫名為halfcool,然後在資料庫建立users表,裡面有三個欄位id(自動增加),username(
(轉)ASP.NET實現三層架構網站建立流程
1.新建專案—>Visual C#—>Web—>ASP.NET空Web應用程式 或者 新建網站—>ASP.NET空網站 2.在解決方案處右擊—>新建專案—>Windows—>類庫,分別建立三層架構,Model(實體層)、Dll(
VS2010構建ASP.NET三層架構例項演示(三)
8、業務層(Bll),針對具體問題的操作,也可以說是對資料層的操作,對資料業務邏輯處理。 建立的方法同上。名稱為Bll;解決方案:新增到解決方案;路徑為e:\test\Solution1;然後將Bll目錄下面的class1.cs改名為UserBll.cs了。這層要引用Da
asp.net三層架構詳解
一、資料庫 /*==============================================================*/ /* DBMS name: Microsoft SQL Server 2000
ASP.NET MVC三層架構基礎詳細操作圖文教程(VS2017)(2)
沒錯,Userinformation_BLL.cs類就是邏輯類。我們先把DAL層的方法都COPY過來,因為他們是要是BLL層裡實現的,當然我是倒著講的,所以現在我們倒著在實現,嘿嘿。按理來說,我們應該先UI,再BLL,最後再DAL。為了方便大家深入了理解,所以我就反著來了。COPY過來後,我們刪掉方法內的內容
asp.net三層架構連線Oracle 11g詳解
asp.net三層架構連線Oracle 11g 連線Oracle時使用微軟的Oracle連線元件; 一 DAL層 using System; using System.Collections.Generic; using System.Text; using System