查看文章 |
我理解的三层架构(.NET)
2007-04-30 14:02
三层分别为DataBase层,Business层和Common层 1,DataBase层 该层负责与数据库的连接,查询等功能,主要实现"执行SQL语句,执行存储过程方法,返回DataSet,DataTable,HashTable等对象"的方法 该层有如下方法 a,返回DataSet方法 b,返回DataTable方法 c,返回HashTable方法 d,执行SQL语句方法 e,执行存储过程方法 f,将HashTable转换为InsertSql和UpdateSql方法 2,Business层 该层处理各对象的逻辑,主要实现"单个类和类集合的CRUD操作"和"返回单个类实例,返回多个类集合等对象"的方法 该层实现如下方法 a,返回单个类实例 b,返回集合类实例(Collect) c,单个类的Insert(),Update(),Delete(),Read()方法 d,集合类的Insert(),Update(),Delete(),Read()方法 3,Common层 该层仅负责定义项目中要用的对象,如类定义,由该类组成的集合类的定义等 该层放置如下定义或方法 a,单个类定义 b,集合类定义 c,集合类CRUD单个类的方法,如Add(),Remove()等方法 以上三层实现后,就可以在页面的后置代码中引用Common和Business层,在页面中直接使用,避免了将数据库暴露在表示层; 页面与Common和Business类交互,页面{Common,Business}; Business类与Common和DataBase类交互,Buseness{Common,DataBase}; DataBase与数据库交互,DataBase{SQL,MYSQL,Access,Oricle等}; Common这里放的都是定义,没有主动与其它类交互的方法,Common{using System;等}; 举个例子如要求实现数据的CRUD操作,那么如何做呢? 假设页面已经设计好了,现在要做CRUD操作, 第一步,新建一个Common中"单个类"的类实例, 第二步从页面控件中取值填充到该类实例, 第三步,新建一个"Business层"的类实例, 第四步用Business类的方法操作Common中的类实例,如Insert,Update,Delete,Read等方法, 再举个例子如要求实现列表功能, 新建一个集合类的实例, 新建一个Business类的实例, 用Business类中"返回集合类"的方法,返回类集合 将上述集合类实例绑定到DataGrid, 下面是一些代码片断 DataBase类的代码片断,返回DataSet方法, public DataSet select(int hotelId) { string sql = string.Format("select * from HotelPrepayRule where 1=1 and hotelId={0}",hotelId); try { DataSet ds=DBControl.SearchDataSet(CommandType.Text,sql,null); return ds; } catch(Exception exp) { throw exp; } } Business类的代码片断,返回Collect对象的方法 #region 返回类集合 public HotelPrepayRuleInfoCollect GetCollect(int hotelId) { //创建集合类实例 HotelPrepayRuleInfoCollect infos=new HotelPrepayRuleInfoCollect (); //创建DA负责返回DataSet HotelPrepayRuleDA da=new HotelPrepayRuleDA(); //创建DataSet DataSet ds=da.select(hotelId); #region 构造集合类实例 if(ds.Tables[0].Rows.Count>0) { foreach(DataRow row in ds.Tables[0].Rows) { HotelPrepayRuleInfo info=new HotelPrepayRuleInfo(); info.Prepay_aheadDays=Convert.ToInt32(row["aheadDays"].ToString());//提前天数 info.Prepay_content=row["content"].ToString();//详细说明 info.Prepay_describes=Convert.ToInt32(row["describes"].ToString()); info.Prepay_endDate=Convert.ToDateTime(row["endDate"].ToString()); info.Prepay_hotelId=Convert.ToInt32(row["hotelId"].ToString()); info.Prepay_hotelname=row["hotelName"].ToString(); info.Prepay_roleId=Convert.ToInt32(row["ruleId"].ToString()); info.Prepay_startDate=Convert.ToDateTime(row["startDate"].ToString()); infos.Add(info); } } else { return null; } #endregion //返回集合类实例 return infos; } #endregion Common类的代码片断 #region 预付信息集合类 public class HotelPrepayRuleInfoCollect : CollectionBase { public HotelPrepayRuleInfoCollect () : base () { } public void Add(HotelPrepayRuleInfo item) { List.Add(item); } public void Remove(HotelPrepayRuleInfo item) { List.Remove(item); } public HotelPrepayRuleInfo this[int index] { get{return (HotelPrepayRuleInfo)List[index];} set{base.List[index] = value;} } } #endregion 下边的代码来自于页面的后置代码,主要实现DataGrid绑定Collect #region 绑定数据 /// <summary> /// 绑定数据 /// </summary> private void DataBind() { if(null!=Page.Request["HotelId"] && null!=Page.Request["Hotelname"]) { int HotelId=Convert.ToUInt16(Page.Request.QueryString["HotelId"].ToString(),10); string Hotelname=Page.Request.QueryString["hotelname"].ToString(); this.Label1.Text=string.Format("{0}({1})",Hotelname,HotelId); HotelPrepayRule info=new HotelPrepayRule ();//该类来自于Business if(null!=info.GetCollect(HotelId)) { HotelPrepayRuleInfoCollect list=info.GetCollect(HotelId);//在这里调用了Business类的GetCollect方法,并返回集合类的实例 DataGrid1.DataSource=list;//将DataGrid绑定该集合类的实例 DataGrid1.DataBind(); } } } #endregion 先写这么多吧,以上仅是个人拙见,不见得就是正确的或科学的, 写出来的目的仅仅是希望与您就此进行讨论,取长补短互通有无; |
类别:asp/asp.net
| 浏览()
| 评论 (0)