百度首页 | 百度空间
 
查看文章
 
我理解的三层架构(.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)
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu