淺談三層結(jié)構(gòu)的原理與用意_第1頁
淺談三層結(jié)構(gòu)的原理與用意_第2頁
淺談三層結(jié)構(gòu)的原理與用意_第3頁
淺談三層結(jié)構(gòu)的原理與用意_第4頁
淺談三層結(jié)構(gòu)的原理與用意_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、淺談“三層結(jié)構(gòu)”的原理與用意對(duì)于有經(jīng)驗(yàn)的 Web應(yīng)用程序開發(fā)人員來說,“三層結(jié)構(gòu)”一詞應(yīng)該不會(huì)感到陌生。其實(shí)“三層結(jié)構(gòu)”的開發(fā)模式 不僅僅可以應(yīng)用于 Web應(yīng)用程序,在其他應(yīng)用領(lǐng)域也是可以發(fā)揮其巨大作用的。而本文主旨是闡明三層結(jié)構(gòu)的原理與用意,并說明 Bin cess的三層結(jié)構(gòu)的特點(diǎn)。J中佃尿1JJr外觀層“三層結(jié)構(gòu)”指的是什么?“三層結(jié)構(gòu)”一詞中的“三層”是指:“外觀層”、“中間層”、“數(shù)據(jù)庫層”。其中:外觀層:位于最外層,直接呈現(xiàn)在用戶面前。用于顯示數(shù)據(jù),并為用戶提供一種交互 式的界面。中間層:負(fù)責(zé)處理用戶輸入的信息,或者是將這些信息發(fā)送給數(shù)據(jù)庫層進(jìn)行保存,或 者是調(diào)用數(shù)據(jù)庫層中的函數(shù)再次

2、讀出這些數(shù)據(jù)。數(shù)據(jù)庫層:僅實(shí)現(xiàn)對(duì)數(shù)據(jù)的保存和讀取操作。為什么需要“三層結(jié)構(gòu)”在一個(gè)軟件系統(tǒng)中,如果不分以層次,那么在將來的升級(jí)維護(hù)中會(huì)遇到很大的麻煩。就像一個(gè)ASP.NET網(wǎng)頁訪問數(shù)據(jù)庫一樣。例如在ASP.NET后臺(tái)程序文件 aspx.cs中,使用OleDbConnection和OleDbCommand來處理Access 后臺(tái)數(shù)據(jù)庫。而當(dāng)數(shù)據(jù)庫服務(wù)器從Access2000升遷到 SQLServer2000的時(shí)候,我們就必須修改原來的OleDbConnection為新的SqlConnection,OleDbCommand為新的SqlCommand來適應(yīng)新的數(shù)據(jù)庫服務(wù)器。但問題 是對(duì)于一個(gè)大型的商

3、業(yè)網(wǎng)站,要進(jìn)行數(shù)據(jù)庫操作的并不只有一兩個(gè)頁面。訪問數(shù)據(jù)庫的代碼會(huì)散落各個(gè)頁面中, 就像夜空中的星星一樣。這樣的維護(hù),難度可想而知。有一個(gè)比較好的解決辦法,那就是將訪問數(shù)據(jù)庫的代碼全 部都放在一個(gè)cs文件里,這樣數(shù)據(jù)庫服務(wù)器一旦變換,那么只需要集中修改一個(gè)cs文件就可以了。namespace Bincess/ ListBoard.aspx.cs文件public classListBoardprivate voidBoardDataBind()將原來的訪問數(shù)據(jù)庫的代碼全部都放在DBTask.cs程序文件中,這樣只要修改這一個(gè)文件就可以適應(yīng)新的數(shù)據(jù)庫namespace Bincess/ DBTask

4、.cspublic classDBTaskpublic voidBoardDataBind()leDbConnection dbConn=OleDbCommand dbCmd= new OleDbCommand();new OleDbConnection();定義一個(gè)DBTask類,讓它來完成所有的數(shù)據(jù)庫操作。那么當(dāng)數(shù)public voidTopicDataBind()OleDbConnection dbConn=new OleDbConnection。;據(jù)庫服務(wù)器改換時(shí),只要集中修 改這一個(gè)文件并重新編譯即可OleDbCommand dbCmd=new OleDbCommand。;重整為na

5、mespace Bincess/ ListBoard.aspx.cs文件public classListBoardprivate voidBoardDataBind()(new DBTask().BoardDataBind();namespace Bincess/ ListTopic.aspx.cs文件public classListTopicprivate void TopicDataBind()(new DBTask().TopicDataBind();當(dāng)然這是一個(gè)簡(jiǎn)單的“門面模式”的應(yīng)用,恐怕也是“三層結(jié)構(gòu)”的最原始模型如果數(shù)據(jù)庫訪問代碼太多,令DBTask.cs文件過大的話,可以將函數(shù)

6、功能分組,存儲(chǔ)到其它文件里。怎樣才算是一個(gè)符合“三層結(jié)構(gòu)”的Web應(yīng)用程序?在一個(gè)ASP.NET Web應(yīng)用程序解決方案中,并不是說有aspx文件、有dll文件、還有數(shù)據(jù)庫,就是“三層結(jié)構(gòu)”的Web應(yīng)用程序,這樣的說法是不對(duì)的。也并不是說沒有對(duì)數(shù)據(jù)庫進(jìn)行操作,即沒有“數(shù)據(jù)庫層”,就不是“三層結(jié)構(gòu)”的。其實(shí)三層結(jié)構(gòu)是功能實(shí)現(xiàn)上的三層:外觀層,用于顯示,并為用戶提供交互式操作的可能中間層,服務(wù)于外觀層并調(diào)用數(shù)據(jù)庫層的函數(shù)。數(shù)據(jù)庫層,實(shí)現(xiàn)數(shù)據(jù)庫的存儲(chǔ)和讀出。存儲(chǔ)目標(biāo)不一定是數(shù)據(jù)庫服務(wù)器,也可以是文本文檔或XML文檔。在微軟的ASP.NET示范實(shí)例 Duwamish7中,外觀層被放置在 Web項(xiàng)目中,

7、中間層是放置在 BusinessFacade項(xiàng)目 中,而數(shù)據(jù)庫層則是放置在DataAccess項(xiàng)目中。而微軟的另一個(gè)ASP.NET示范實(shí)例PetShop中,外觀層被放置在 Web項(xiàng)目中,中間層是放置在 BLL項(xiàng)目中,而數(shù)據(jù)庫層則是放置在SQLServerDAL和OracleDAL兩個(gè)項(xiàng)目中。在我的彬月論壇中,外觀層是被放置在Web項(xiàng)目中,中間層是被放置在In terService項(xiàng)目中,而數(shù)據(jù)庫層是被放置在 AccessTask項(xiàng) 目中。顯然PetShop要比Duwamish7復(fù)雜的多!如果先不討論這些,那么現(xiàn)在的問題就是:既然三層結(jié)構(gòu)已經(jīng)被分派 到各自的項(xiàng)目中,那么剩下來的項(xiàng)目是做什么的呢?

8、例如 PetShop中的Model、IDAL、DALFactory這三個(gè)項(xiàng)目,再例如 Duwamish7中的Com mon項(xiàng)目,還有就是在我的論壇中的Classes、DBTask、DALFactory三個(gè)項(xiàng)目。它們是做什么用的呢?我想下面的文字會(huì)慢慢讓你明白的。從Nokia的手機(jī)生產(chǎn)線說起 一個(gè)“三層結(jié)構(gòu)”的 Web應(yīng)用程序,就象是 Nokia公司的手機(jī)生產(chǎn)線。Web層就像是公司的經(jīng)理,他負(fù)責(zé)洞察市場(chǎng)趨勢(shì),決策產(chǎn)品的生產(chǎn)。并根據(jù)市場(chǎng)籌策下一步計(jì)劃。In terService就像是公司的管理員,他主要負(fù)責(zé)管理下層員工,傳達(dá)上級(jí)布置的生產(chǎn)任務(wù)給員工,并將生產(chǎn) 結(jié)果反饋給上級(jí)Web。AccessTa

9、sk就是公司里的工人,他們主要是負(fù)責(zé)手機(jī)產(chǎn)品的生產(chǎn)裝配工作,并將生產(chǎn)結(jié)果反饋給上級(jí)In terService。他們并不需要知道產(chǎn)品將銷往何處,也不用關(guān)心產(chǎn)品銷量。只要能完成任務(wù),就可以拿到報(bào)酬。命令方向是自上而下的,而結(jié)果反饋方向則是自下而上的。根據(jù)這個(gè)圖例來簡(jiǎn)要的描述彬月論壇中的留言板顯示功能,那么代碼應(yīng)該是: Asp:Repeater id = leaveWordRepeater Runat = SERVER/ Asp:Repeater文件發(fā)岀讀取留言板信息的任務(wù)/ 其后臺(tái)文件是由位于 Web層的ListLeaveWord.aspx.cs/ 任務(wù)命令交由LeaveWordService 類

10、對(duì)象的List 方法去完成。usingSystem;usingSystem.Data;usingBincess .In terService;namespace Webpublic classListLeaveWord : System.Web.UI. Page/將留言視圖綁定到該重復(fù)器上 protected System.Web.Ul.WebControls.Repeater leaveWordRepeater;/其他代碼/ /綁定留言視圖/private voidLeaveWordDataBind()DataSet ds= new DataSet();new LeaveWordServic

11、e().List(ds);leaveWordRepeater.DataSource=ds.TablesLeaveWord .DefaultView;leaveWordRepeater.DataBind();/位于中間層的 LeaveWordService.cs調(diào)用下一層數(shù)據(jù)庫層的方法來填充數(shù)據(jù)集/usingSystem;usingSystem.Data;usingBincess.AccessTask;namespace InterServicepublic classLeaveWordServicepublic voidList(DataSet ds)jfi*r/位于數(shù)據(jù)庫層的LeaveWor

12、dDBTask.cs ,他真正完成將數(shù)據(jù)讀出并將其填充到數(shù)據(jù)集中/usingSystem;usingSystem.Data;usingSystem.Data.OleDb;namespace AccessTaskpublic classLeaveWordDBTaskstring cmdText= SELECT * FROM LeaveWord”;OleDbConnection dbConn=new OleDbConnection( .);OleDbDataAdapter dbAdp=new OleDbDataAdapter(cmdText, dbConn);dbAdp.Fill(ds, Leav

13、eWord );這樣便完成了對(duì)留言板的訪問和顯示,箭頭所指的方向就是命令的方向。雖然這符合“三層結(jié)構(gòu)”開發(fā)模式的思想,但是這卻存在著重大的漏洞,或者說是重大缺陷!為什么會(huì)這么說呢?因?yàn)閺闹虚g層返回的結(jié)果是不安全的!而造成中間層返回結(jié)果不安全的原因是從數(shù)據(jù)庫層返回的結(jié)果并不確切! 這會(huì)造成外觀層過于脆弱,這并不是一個(gè)“強(qiáng)”三層結(jié)構(gòu)。還是用代碼來說明。假如, LeaveWordDBTask.cs文件中的List方法實(shí)現(xiàn)是這樣的:/ 位于數(shù)據(jù)庫層的 LeaveWordDBTask.cs 文件namespace AccessTaskpublic classLeaveWordDBTaskpublic v

14、oid List(DataSet ds)string cmdText= SELECT * FROM RegUser ;/ 注意這里,訪問的不是LeaveWord 數(shù)據(jù)表OleDbConnection dbConn=new OleDbConnection( .);OleDbDataAdapter dbAdp=new OleDbDataAdapter(cmdText, dbConn);dbAdp.Fill(ds, LeaveWord );/ 但是也填充了 DataSet那么回逆到文件LeaveWordService.cs 的 List 函數(shù),再回逆到 ListLeaveWord.aspx.cs 文

15、件的 LeaveWordDataBindContent 字段!函數(shù)。把數(shù)據(jù)綁定到重復(fù)器上,而在顯示的時(shí)候,會(huì)提示:找不到 Asp:Repeater id = leaveWordRepeater Runat = SERVER- 在這里會(huì)出現(xiàn)錯(cuò)誤提示出現(xiàn)這樣的結(jié)果并不奇怪,因?yàn)閿?shù)據(jù)庫層訪問的是RegUser數(shù)據(jù)表,而RegUser數(shù)據(jù)表中并沒有定義 Content字段。外觀層因此變得很脆弱,這也使得頁面設(shè)計(jì)師和數(shù)據(jù)庫編程人員產(chǎn)生了不應(yīng)有的交涉。僅僅為了達(dá)到程序可運(yùn)行目的,數(shù)據(jù)庫編程人員就必須小心翼翼的寫每句代碼。這就像是NoKia公司的經(jīng)理發(fā)布生產(chǎn)命令后,得到的返回結(jié)果卻是生產(chǎn)線上的員工生產(chǎn)裝配了

16、好幾臺(tái)電視?!這當(dāng)然不是經(jīng)理們想要的結(jié)果。但為什么會(huì)有這樣結(jié)果呢?因?yàn)榻?jīng)理們?cè)诎l(fā)布生產(chǎn)命令時(shí),忘記說明產(chǎn)品的規(guī)格和特征了。經(jīng)理一聲令下:“生產(chǎn)!” 一 -(new LeaveWordService().List(DataSet ds) 但是卻沒有對(duì)產(chǎn)品的規(guī)格特征作詳細(xì)說明?例如手機(jī)的型號(hào)、外觀等等。 這里的ds就相當(dāng)于所要生產(chǎn)的產(chǎn)品集合,但卻沒有作細(xì)部說明那么怎樣才能避免這樣荒唐的結(jié)果出現(xiàn)呢?經(jīng)理在發(fā)布生產(chǎn)命令之前,應(yīng)該規(guī)定產(chǎn)品的規(guī)格特征!ds)經(jīng)理一聲令下:“生產(chǎn) 3310 型號(hào)的手機(jī)產(chǎn)品! ”( new LeaveWordService().List(LeaveWordDataSet這里的

17、ds就相當(dāng)于所要生產(chǎn)的產(chǎn)品集合,而且它有詳細(xì)的規(guī)格說明!/ LeaveWordDataSet.cs 文件/using System;using System.Data;namespace Commonpublic classLeaveWordDataSet : DataSetpublic LeaveWordDataSet() :base ()DataTable table=new DataTable( LeaveWord ”);table.Columns.Add( Content , typeof (System.String);this.Tables.Add(table);那么原來的示意圖應(yīng)

18、該也發(fā)生一些變化:UTLeaveWord.DefaultView;相應(yīng)的代碼也要變化: Asp:Repeater id = leaveWordRepeater Runat = SERVER/ 其后臺(tái)文件是由位于 Web層的ListLeaveWord.aspx.es文件發(fā)出讀取留言板信息的任務(wù)/任務(wù)命令交由LeaveWordService類對(duì)象的List 方法去完成。using System;using System.Data;using Bincess .In terService;名稱空間using Bincess.Common;/ 在彬月論壇中所使用的是 Bincess.Classesna

19、mespace Webpublic classListLeaveWord : System.Web.Ul.Page/將留言視圖綁定到該重復(fù)器上protected System.Web.Ul.WebControls.Repeater leaveWordRepeater;/綁定留言視圖,為了簡(jiǎn)明扼要省略了其他代碼/private voidLeaveWordDataBind()LeaveWordDataSet ds=new LeaveWordDataSet();new LeaveWordService().List(ds);leaveWordRepeater.DataSource=ds.Tables

20、 leaveWordRepeater.DataBind();/ 位于中間層的 LeaveWordService.cs調(diào)用下一層數(shù)據(jù)庫層的方法來填充數(shù)據(jù)集而用于顯示留言板的控件,你可以參見PageCtrl/MessageView/LeaveWordView.ascx文件/usingSystem;usingSystem.Data;usingBincess.AccessTask;usingBincess.Common;/在彬月論壇中所使用的是Bincess.Classes名稱空間namespace InterServiceLeaveWordServicepublic classnew LeaveWo

21、rdDBTask() .L ist(ds)/位于數(shù)據(jù)庫層的 LeaveWordDBTask.cs他真正完成將數(shù)據(jù)讀岀并將其填充到數(shù)據(jù)集中/usingSystem;usingSystem.Data;usingSystem.Data.OleDb;usingBincess.Common;/在彬月論壇中所使用的是Bincess.Classes名稱空間namespace AccessTaskpublic classLeaveWordDBTaskCpublic voidList(LeaveWordDataSet ds)string cmdText= SELECT * FROM LeaveWordOleDb

22、Connection dbConn=new OleDbConnection(/ / .);OleDbDataAdapter dbAdp=new OleDbDataAdapter(cmdText, dbConn);dbAdp.Fill(ds,LeaveWord ”);這樣,即便是將LeaveWordTask.List方法修改成訪問 RegUser數(shù)據(jù)表的代碼,也依然不會(huì)影響到外觀層。再執(zhí)行 期間系統(tǒng)會(huì)拋出異常,而這個(gè)異常信息肯定是再數(shù)據(jù)庫層。再有,因?yàn)槲挥谕庥^層的重復(fù)器控件綁定的是LeaveWordDataSet類對(duì)象,而LeaveWordDataSet類中就一定有 Content字段的定義。當(dāng)

23、然,這同時(shí)也達(dá)到了規(guī)范數(shù)據(jù)庫層返回結(jié)果的目的。這便是為什么在Duwamish7中會(huì)出現(xiàn)Common項(xiàng)目的原因。不知道你現(xiàn)在看明白了么?而Bin cess的做法是和PetShop 樣,是通過類定義來達(dá)到同樣的目的! PetShop是通過Modal項(xiàng)目,而Bin cess 是通過Classes項(xiàng)目。為了舉例和易于理解, 我在上面的例子中使用了 Bi ncess.Common名稱空間,但實(shí)際的Bin cess 論壇,卻不是這樣實(shí)現(xiàn)的。你可以到Classes目錄中去查看代碼。/ LeaveWordTask.cs 文件/ using namespace Bincess.AccessTask/ / Lea

24、veWordTask留言板數(shù)據(jù)庫任務(wù)實(shí)現(xiàn)類/ public class LeaveWordTask : ILeaveWordTask類LeaveWordTask默認(rèn)構(gòu)造器/ /列表留言板內(nèi)容/ / 留言板對(duì)象數(shù)組 public LeaveWord List()OleDbConnection dbConn=new OleDbConnection( .”);OleDbCommand dbCmd= new OleDbCommand(cmdText, dbConn);/其他代碼/ LeaveWord.cs留言板類定義/ using System;namespace Bincess.Classes.Me

25、ssage/ / LeaveWord瀏覽板類/ public class LeaveWord : BaseMsg.再談手機(jī)的裝配方法在上一步中,經(jīng)理說明了產(chǎn)品型號(hào)和規(guī)格。In terService層的LeaveWordService調(diào)用了 AccessTask層中的LeaveWordTask類List函數(shù)來獲取留言數(shù)據(jù)。在 Bincess論壇中使用 Classes層LeaveWord類來規(guī)范化 Web層與AccessTask層的返回結(jié)果。那么在In terService和AccessTask之間有沒有需要規(guī)范的呢?先別那么多的想法,先假設(shè)一個(gè)很現(xiàn)實(shí)的例子。假如,Bincess論壇的數(shù)據(jù)庫要從

26、Access2000升遷到MS SqlServer 2000,那么只要集中修改AccessTask項(xiàng)目中的所有文件以時(shí)應(yīng)新的數(shù)據(jù)庫服務(wù)器即可。不過,可不可以讓論壇同時(shí)支持Access又支持MS SqlServer 2000 ?通過一個(gè)開關(guān),當(dāng)開關(guān)指向Access 一端時(shí),Bin cess就可以運(yùn)行在 Access數(shù)據(jù)庫平臺(tái)上,而如果開關(guān)指向 MS SqlServer 2000時(shí),Bin cess就運(yùn)行在MS SqlServer數(shù)據(jù)庫服務(wù)器上?這個(gè)辦法很好! 但是怎 么實(shí)現(xiàn)呢?先在解決方案中新建一個(gè)項(xiàng)目就叫作:SqIServerTask。然后還有建立一個(gè)項(xiàng)目DALFactory充當(dāng)開關(guān)。這個(gè)開關(guān)

27、項(xiàng)目中僅有一個(gè) DBTaskDriver.cs文件,就用它來控制Bin cess到底運(yùn)行載那個(gè)數(shù)據(jù)庫平臺(tái)上。/ 新建的SqlServerTask 項(xiàng)目,并添加一個(gè) LeaveWordTask.cs 文件/ using System;using System.Collections;using System.Data.SqlClient;using Bincess.Classes.Message;using Bincess.Classes.User;namespace Bincess.SqlServerTask/ / LeaveWordTask留言板數(shù)據(jù)庫任務(wù)實(shí)現(xiàn)類/ public classL

28、eaveWordTask/ /列表留言板內(nèi)容/ / 留言板對(duì)象數(shù)組 /注意這里使用的是 SqlClient ,因?yàn)橐獙?duì)MS SqlServer數(shù)據(jù)庫進(jìn)行操作public LeaveWord List() SqlConnection dbConn=new SqlConnection( .);SqlCommand dbCmd= new OleDbCommand( SELECT * FROM LeaveWord, dbConn);/其他代碼/ DALFactory.cs數(shù)據(jù)庫層工廠類/usingSystem;usingSystem.Configuration;usingSystem.Reflecti

29、on;namespace Bincess.DALFactory/ / DBTaskDriver數(shù)據(jù)庫任務(wù)驅(qū)動(dòng)程序/ public classDBTaskDriver/獲取程序集名稱/private Assembly GetAssembly()/ 如果將字符串修改為“ Bincess.SqIServerTask”,/那么指向的就是 SqlServerTask項(xiàng)目,也就是要工作在MS SqlServer數(shù)據(jù)庫服務(wù)器上了return Assembly.Load( Bincess.AccessTask);/ 當(dāng)前指向的是 AccessTask 項(xiàng)目/也就是說當(dāng)前是工作在Access數(shù)據(jù)庫平臺(tái)上/ /獲

30、取留言板數(shù)據(jù)庫任務(wù)對(duì)象/ / public ILeaveWordTask DriveLeaveWordTask()/ 如果將字符串修改為“ Bincess.SqIServerTask.LeaveWordTask”,/ 那么返回的就是 SqlServerTask 項(xiàng)目中的LeaveWordTask 類對(duì)象return(LeaveWordTask) this .GetAssembly().Createlnstance(Bincess.AccessTask.LeaveWordTask);/ 當(dāng)前返回的是 AccessTask 項(xiàng)目中的LeaveWordTask 類對(duì)象值得一提的是,SqlServer

31、Task項(xiàng)目是位于數(shù)據(jù)庫層的,那么就必須和AccessTask項(xiàng)目一樣,與 Web曾保持同樣的協(xié)議Classes!在In terService項(xiàng)目中的LeaveWordService也要改些代碼:/ LeaveWordService.es留言板任務(wù)服務(wù)類/using System;using Bincess.Classes.Message;using Bincess.DALFactory;namespace Bincess .In terService/ / LeaveWordService 留言板服務(wù)類/ public classLeaveWordService/ /列表顯示留言板信息/ /

32、 留言板對(duì)象數(shù)組 public LeaveWord List()return ( new DBTaskDriver().DriveLeaveWordTask().List();外觀層,也就是Web項(xiàng)目,并不需要作任何修改到現(xiàn)在為止,我想你應(yīng)該看到分層結(jié)構(gòu)的巨大益處了吧?不過,就是在上面的程序中, 也存在一個(gè)漏洞或者說是缺陷。因?yàn)椋?new DBTaskDriver().DriveLeaveWordTask()對(duì)象中不一定有會(huì)有 List成員函數(shù)。為什么呢?假如SqlServerTask項(xiàng)目中的LeaveWordTask.cs文件,是這樣的程序代碼:/ 新建的SqlServerTask 項(xiàng)目,并

33、添加一個(gè) LeaveWordTask.cs 文件/using System;using System.Collections;using System.Data.SqlClient;/ 注意這里使用的是 SqlClient,因?yàn)橐獙?duì)MS SqlServer數(shù)據(jù)庫進(jìn)行操作using .|namespace Bincess.SqlServerTask/* . */public classLeaveWordTask/* . */public LeaveWord GetAII()/ 注意先前使用的是 List 函數(shù)名SqlConnection dbConn=new SqlConnection();Sq

34、lCommand dbCmd= new OleDbCommand( SELECT * FROM LeaveWord, dbConn);/其他代碼那么通過DALFactory切換到SqlServer數(shù)據(jù)庫時(shí),會(huì)出現(xiàn)執(zhí)行期錯(cuò)誤:LeaveWordTask沒有List方法。中間層因此變得很脆弱,這又使得中間層設(shè)計(jì)師和數(shù)據(jù)庫編程人員產(chǎn)生了不應(yīng)有的交涉。僅僅為了達(dá)到程序可運(yùn)行目的,數(shù)據(jù)庫編程人員就又必須小心翼翼的寫對(duì)每個(gè)函數(shù)名。這就像是NoKia公司的管理員在傳達(dá)上級(jí)的生產(chǎn)命令后,看到員工在裝配線上,都是按照逆順序來裝配手機(jī)的?!即先將手機(jī)的面板和底殼扣緊,之后再裝線 路板和按鍵。這當(dāng)然是不可能裝進(jìn)去的

35、!因?yàn)檎_的步驟是:先將線路板裝在底殼上,然后再裝上按鍵,最后扣 好面板但為什么會(huì)有這樣結(jié)果呢?因?yàn)楣芾砣嗽趥鬟_(dá)生產(chǎn)命令后,忘記對(duì)手機(jī)的裝配步驟作出說明!所以員工喜歡怎樣裝都成要使員工能夠訓(xùn)練有素地,按照要求來裝配產(chǎn)品,那么就必須對(duì)他們進(jìn)行培訓(xùn)。那么用程序語言來描述這種現(xiàn)實(shí)活動(dòng)是什么樣的呢?或者說怎么描述呢?答案是使用接口!/ 新建一個(gè) DBTask項(xiàng)目,并添加一個(gè) ILeaveWordTask.cs接口類文件/using System;using Bincess.Classes.Message;namespace Bincess.DBTask/ / ILeaveWordTask留言板數(shù)據(jù)庫任務(wù)接口類/ public interfaceILeaveWordTaskLeaveWord List();新建一個(gè)項(xiàng)目DBTask,然后添加ILeaveWordTask.cs接口類文件。請(qǐng)注意接下來的發(fā)生的細(xì)微變化!/ SqIServerTask 項(xiàng)目中的 LeaveWordTask.cs 文件/ using using Bincess.CIasses.Message;using Bincess.Classes.User;using Bincess.DBTask;namespace Bincess.SqlServerTaskpublic classLeaveWo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論