.NET解析网站三层架构

来源:互联网 发布:知无涯者拉马努金传 编辑:程序博客网 时间:2024/05/02 02:40
   所谓三层架构就是指数据访问层(Data Access Layer)、业务逻辑层(Business Logic Layer)、界面表示层(英语忘了..)

       MS.NET里,ASP.NET有项技术叫Code Behind,它默认已经提供了二层。比如建立一个网页文件.aspx后就自动有一个.cs文件与之匹配,这里.aspx就是界面表示层而.cs就是业务逻辑层。

       那么三层架构无非是多抽象了一层数据访问层,把所有和数据库打交道的方法都封装到了数据访问层这个抽象类中。以下我举个简单的例子来描述什么是三层架构,界面层就不说了。

       一、简单的数据访问层

       public class Admin

     {

          public static bool Insert(string userName,string userPass)

          {

              //数据库连接字符串

              SqlConnection conn=new SqlConnection("...");

              //SQL语句操作

              SqlCommand cmd=new SqlCommand("insert into admin ...",conn);

              //SQL语句参数

              SqlParameter parm1=new SqlParameter("@User",SqlDbType.VarChar,50);

              parm1.Value=userName;

              ...

              conn.Open();

              //执行SQL语句操作

              cmd.ExecuteNonQuery();

              conn.Close();

         }

         public static bool Update()

     }

       以上抽象了一个Admin类,类中有个静态方法Insert,业务逻辑层如果要调用这个层的方法,只要Admin.Insert(this.tbUser.Text,this.tbPass.Text);

    

     二、简单的业务逻辑层

       public class WebForm1 : System.Web.UI.Page

     {

          protected System.Web.UI.WebControls.TextBox TextBox1;

          protected System.Web.UI.WebControls.TextBox TextBox2;

          protected System.Web.UI.WebControls.Button Button1;

 

          private void Button1_Click(object sender, System.EventArgs e)

         {

              string userName=this.TextBox1.Text;

              string userPass=this.TextBox2.Text;

              Admin.Insert(userName,userPass);

         }   

     }

 

三、改进的数据访问层

心细的读者会发现,上面的抽象类Admin里每个方法都要写SqlConnection、SqlCommand这样的效率是不高的,那么如何来改进呢?答案是再多一个加工类,把日常的数据库操作都封装进去!比如PetShop3.0提供的一个SQLHelper类,那么Admin类中的方法就可以这么写

public class Admin

     {

          public static bool Insert(string userName,string userPass)

          {

              string sql=insert into admin…”;

              SqlParameter[] parm=new SqlParameter[2];

parm[0]= new SqlParameter("@User",SqlDbType.VarChar,50);

parm[0].Value=userName;

              ...

              //SQLHelper.ExecuteNonQuery实现SqlCommand的ExecuteNonQuery功能

              //SQLHelper.CONN_STRING是数据库连接字符串

              SQLHelper.ExecuteNonQuery(SQLHelper.CONN_STRING,sql,);

         }

         public static bool Update()

     }

    

四、再改进的数据访问层

假如有这样的情况,如果上面的Admin类中的Insert方法,参数很多,大于5个,那么业务逻辑层要传递参数时要一个一个传咯?这样显然很不好!不过也好办!再抽象一个类把所有参数封装起来(就象C中的结构体)那么Admin类的方法就变为

public class Admin

     {

          public static bool Insert(AdminInfo adminInfo)

          {

              string sql=insert into admin…”;

              SqlParameter[] parm=new SqlParameter[2];

parm[0]= new SqlParameter("@User",SqlDbType.VarChar,50);

parm[0].Value=adminInfo.userName;

              SQLHelper.ExecuteNonQuery(SQLHelper.CONN_STRING,sql,);

         }

         public static bool Update()

     }

 

     上面实现了最简单的数据访问层以及稍微改进的数据访问层,这样一个三层架构就实现了。比如一个用户想插入一个新Admin信息到数据库,其一般的执行过程是:

       (1) 用户在界面输入用户名和密码 点提交

       (2) 这时到了业务逻辑层,它接受并处理该业务。具体是把界面层传递过来的参数打包封装并传递给数据访问层,然后调用其数据访问层方法

       (3) 数据访问层通过于数据库的交互完成用户的操作,并返回操作结果给上一层

 

目前还有一些工程是四层、五层、N层的。还可以再封装一个数据层接口层与接口工厂类,可以实现完全对数据库透明,即不管数据库采用Sql Server还是Oracle,只要在Web.config里写一个字符串来辨别即可自动转接。微软著名的PetShop3.0就是一个完全典型的三层架构经典,有兴趣的可以去研究下,保证受益非浅!