請不要轉(zhuǎn)載,只發(fā)布于藍色理想和我個人blog.
5do8的Blog:http://www.5do8.com/blog/
N層,這個濫用的詞匯后面有多少含量了,現(xiàn)在已經(jīng)可以把OOP作為設(shè)計模式的最基本的指導思想而使用的人,才能說這個N層,不敢恭維的是,這種開發(fā)師(程序員)我遇到的并不多(Tip:本人見識短淺)。我并沒有批評多少人的那種get和set方式有問題(其實我也喜歡這兩個單詞),而是要指出的是這不是精華,應(yīng)該更進一步的深入。這篇,就是為這個而來的。如果您已經(jīng)熟悉那些常用的命令,行為和結(jié)構(gòu)模式編程,請止步;同時如果您不確定了解OO的基本概念,請止步。
更重要的是,我希望能和某些同學討論一下編程過程處理中的應(yīng)對措施(不局限在一種語言),先留下一個問題,如果有一天,您的技術(shù)總監(jiān)讓你把所有的客戶資源單獨出來處理(你們的很多應(yīng)用程序都是有一些會員的),做好用戶系統(tǒng)的整合(CWPS),你可能選擇Soap處理,在已經(jīng)很多應(yīng)用的程序中處理這個邏輯并不容易,在那里處理?采用什么方式?如何處理?對,如果你能確定這些問題你能解決的話而能很好的在以后的應(yīng)用中熟悉快速安全的使用的話,這篇,已經(jīng)不需要讀了。
N層,在不同的模型編程中是小有出入的。如: Win傳統(tǒng)編程 :IIS,Win32 -->組件-->數(shù)據(jù)層 .Net :asp.net,客戶端-->應(yīng)用程序處理池(Web服務(wù),.net組件等)-->數(shù)據(jù)層
我這里說的 是web應(yīng)用程序中的(Asp.net)N 層,把這個應(yīng)用程序全部當作一個模型處理的。
一般的說了,就是如下的過程:
客戶端頁面全部可以看作是控件,客戶端發(fā)送請求,控件識別,返回給Receive對象處理,然后規(guī)矩請求的類型創(chuàng)建Command類,很可能是純虛類DetailCMD。注意,這個Command還可以是是個應(yīng)用程序的接口實例,使用接口IDealPool,不關(guān)注細節(jié),知識一些基本處理處理必須的。實例的類是繼承了純虛類的子類。這些實例根據(jù)虛擬類,實現(xiàn)創(chuàng)建的細節(jié)。
把接口IDealPool當作一個程序集這樣更恰當,因為它實質(zhì)上可能是一般的類,也可能是Web服務(wù)(可以實現(xiàn)Soap)等等.
我們看一個簡單的例子演示一下(某網(wǎng)站導航已經(jīng)用戶信息頂部全局信息),大體上是一個導航條和一些js的調(diào)用。
首先,當然要創(chuàng)建一個控件:Catalogue.ascx
<%@Control Inherits ="Test.Control.Page.Catalogue" EnableViewState="false"%> <!--Start Top--> 客戶資料... <!--Start Catalogue--> <div id="SiteCatalogue"><asp:PlaceHolder id="RunCat" runat="server"/></div> <!--End Catalogue-->
這個用戶控件可以讀取用戶信息的(Session和cookies,也可以估計URL輸出信息,相當于Receive)具體的導航放在PlaceHolder控件里面,頁面繼承自 Test.Control.Page.Catalogue類:
public class Catalogue:UserControl{ private int _SelectedID; public int SelectedID{get{return this._SelectedID;}set{this._SelectedID=value;}} protected PlaceHolder RunCat; protected override void CreateChildControls(){ RunCat.Controls.Add(new CatalogueList(SelectedID)); }
};
SelectedID是已經(jīng)選擇的欄目,需要輸出標記的。這相當于Command,實現(xiàn)的控件是 CatalogueList
public class CatalogueList:Control,INamingContainer{ System.Web.HttpResponse Response = System.Web.HttpContext.Current.Response; private int _SelectedID; public int SelectedID{get{return this._SelectedID;}set{this._SelectedID=value;}} public CatalogueList(int intSelectedID){this.SelectedID=intSelectedID;} protected override void CreateChildControls(){ Data.SqlIO.ISqlIO DBControl = new Data.SqlIO.Catalogue(); try{ Repeater WCRepeater=new Repeater(); ApplyRepeater(WCRepeater); WCRepeater.DataSource= DBControl.SelectFromWhere(null,null);//2是按照點擊排序
WCRepeater.DataBind(); Controls.Add(WCRepeater); }catch(Exception e){ Response.Write(e.Message); } } private void ApplyRepeater(Repeater myRepeater){ myRepeater.HeaderTemplate=new CatalogueListHeaderTemplate("<ul><li class=\"SiteCatalogueTag\">位置</li>"); myRepeater.FooterTemplate=new CatalogueListFooterTemplate("</ul>"); myRepeater.ItemTemplate=new CatalogueListItemTemplate("<li><a href=\"{0}\">{1}</a></li>",this.SelectedID); } };
具體不再羅列了。這里有一行
Data.SqlIO.ISqlIO DBControl = new Data.SqlIO.Catalogue();
我必須說明,ISqlIO是一個接口:
namespace SongLe.Data.SqlIO{ using System; using System.Data; using Test;
public interface ISqlIO{ DataSet SelectFromWhere(string[] Feild,string StrWhere); }; public abstract class ATableControl:ISqlIO{ private SqlText.ATableControl DText; private Data.Oledb Conn; public ATableControl(string strTable){ switch(strTable.ToLower()){ case "catalogue": DText=new Data.SqlText.Catalogue(); ;break; default:break; }
Conn=new Data.Oledb(App.Config.GetDbConnectionName); }
public DataSet SelectFromWhere(string[] Feild,string StrWhere){ return Conn.GetDataSet(DText.SelectFromWhere(Feild,StrWhere)); } }; public class Catalogue:ATableControl{ public Catalogue():base("catalogue"){}
};
}
由抽象類ATableControl實現(xiàn),被細節(jié)類Catalogue基礎(chǔ),其中的SQL語句也是這種方式實現(xiàn)的,這是行為編程的思想。因為數(shù)據(jù)庫可能不同,sql語句不同,這樣就能動態(tài)的調(diào)用類和對應(yīng)的Sql語句。
然后順次返回數(shù)據(jù)到用戶。
實現(xiàn)了N層。
經(jīng)典論壇討論: http://bbs.blueidea.com/thread-2699978-1-1.html
出處:藍色理想
責任編輯:moby
◎進入論壇網(wǎng)絡(luò)編程版塊參加討論
|