Asp.Net的N层模型编程探索
[日期:2007-03-10] | 来源:http://www.5do8.com/blog/ 作者:blueidea | [字体:大 中 小] |
N层,这个滥用的词汇后面有多少含量了,现在已经可以把OOP作为设计模式的最基本的指导思想而使用的人,才能说这个N层,不敢恭维的是,这种开发师(程序员)我遇到的并不多(Tip:本人见识短浅)。我并没
有批评多少人的那种get和set方式有问题(其实我也喜欢这两个单词),而是要指出的是这不是精华,应该更进一步的深入。这篇,就是为这个而来的。如果您已经熟悉那些常用的命令,行为和结构模式编程,请止步;同时如果您不确定了解OO的基本概念,请止步。
更重要的是,我希望能和某些同学讨论一下编程过程处理中的应对措施(不局限在一种语言),先留下一个问题,如果有一天,您的技术总监让你把所有的客户资源单独出来处理(你们的很多应用程序都是有一些会员的),做好用户系统的整合(CWPS),你可能选择Soap处理,在已经很多应用的程序中处理这个逻辑
并不容易,在那里处理?采用什么方式?如何处理?对,如果你能确定这些问题你能解决的话而能很好的在以后的应用中熟悉快速安全的使用的话,这篇,已经不需要读了。
N层,在不同的模型编程中是小有出入的。如:
Win传统编程 :IIS,Win32 -->组件-->数据层
.Net :asp.net,客户端-->应用程序处理池(Web服务,.net组件等)-->数据层
我这里说的是web应用程序中的(Asp.net)N 层,把这个应用程序全部当作一个模型处理的。一般的说了,就是如下的过程:
客户端页面全部可以看作是控件,客户端发送请求,控件识别,返回给Receive对象处理,然后规矩请求的类型创建Command类,很可能是纯虚类DetailCMD。注意,这个Command还可以是是个应用程序的接口实例,使用接口IDealPool,不关注细节,只是一些基本处理处理必须的。实例的类是继承了纯虚类的子类。这些实例根据虚拟类,实现创建的细节。
把接口IDealPool当作一个程序集这样更恰当,因为它实质上可能是一般的类,也可能是Web服务(可以实现Soap)等等.
我们看一个简单的例子演示一下(某网站导航已经用户信息顶部全局信息),大体上是一个导航条和一些js的调用。
首先,当然要创建一个控件: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是已经选择的栏目,需要输出标记的。这相当于Command,实现的控件是 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实现,被细节类Catalogue基础,其中的SQL语句也是这种方式实现的,这是行为编程的思想。因为数据库可能不同,sql语句不同,这样就能动态的调用类和对应的Sql语句。然后顺次返回数据到用户。实现了N层。