所谓三层架构就是指数据访问层(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就是一个完全典型的三层架构经典,有兴趣的可以去研究下,保证受益非浅!