从上个星期就打算研究三层,但是中间有许多事情耽搁了,断断续续的研究,今天终于算是对三层有一个比较整体的认识
这篇博客我准备从基础理论和实际代码两方面讲讲我这个菜鸟学习三层的历程,好啦废话少说,下面开始:
<一>三层理论
一个三层的应用程序通常有:表现层、业务层和数据层。下面让我们看看每层都做些什么。
1:
表现层(Presentation Layer)
表现层用于用户接口的展示,以及用业务层的类和对象来“驱动”这些接口。
在ASP.NET中,该层包括aspx页面、用户控制、服务器控制以及某些与安全相关的类和对象。
2:
业务层(Business Tier)
业务层用于访问数据层,从数据层取数据、修改数据以及删除数据,并将结果返回给表现层。
在ASP.NET中,该层包括使用SqlClient或OleDb从SQL Server或Access数据库取数据、更新数据及删除数据,并把取得的数据放到DataReader或DataSet中返回给表现层。返回的数据也许只有一个整型数字,比如一个表的行记录数目,但这也要用数据层的数据进行计算。
3:
数据层(Data Tier)
数据层是数据库或者数据源。在.NET中,通常它是一个SQL Server或Access数据库,但不仅限于此两种形式,它还可能是Oracle,mySQL,甚至是XML。
其实各层的定义都很简单也很容易理解:
下面是两幅图:反应的是三层之间的依赖关系和数据传递方向
从上图可以了解到:
1:三层之间的的依赖性是从高到低的,表示层的显示内容,要靠业务层访问数据层,再将结果返回给表示层
2:数据的传递方向:高层请求低层、低层响应高层
<二>三层搭建方法
1、搭建表示层
2、搭建业务逻辑层(类库)
3、搭建数据访问层(类库)
4、添加各层之间的相互依赖
<三>三层结构中实体类的使用
实体类就是描述一个业务实体的类,即:
将数据表中的每一个字段定义成属性,并将这些属性用一个类封装,这个类就称为实体类。
三层结构中实体类的使用
业务实体可以认为属于业务逻辑层。如果将层次分得更细点,可以将业务实体单独作为一层称为业务实体层。
表示层、业务逻辑层、数据访问层都依赖于业务实体。各层之间数据的传递主要是实体对象。 通过使用实体类,可以将数据作为对象来使用。
下面将用一个实例详细讲述搭建过程
<四>三层实例(用户登录案例)
环境:vs2008,数据库用的是vs内置的sql(用起来方便)
因为我是用vs内置的数据库,所以我得先建表现层,这一点可能和大家在网上看的有点不一样.别人可能想建实体层,我的想法是,你做项目,肯定是先设计数据库,先把表建好,再写后台代码.
<1>建立各层:
step1:新建一个asp.net网站(表现层).生成解决方案
step2:在解决方案上右击,选择添加类,分别创建业务逻辑层BLL,数据层DAL,业务实体层Model三个类
例图:
在这里大家可能迷惑了:这不是四层了吗,model是干嘛的!其实model就是数据的实体(参考上方的三层结构中实体类的使用)
你可以这样理解:三层包括表现层,业务层<业务实体,业务逻辑>,数据层.其中业务实体层是将数据映射层对象,在各层之间传递;
<2>创建数据库,配置web.config
用vs内置的数据库
配置config文件:
<add name="ConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Database.mdf;Integrated Security=True;User Instance=True"
providerName="System.Data.SqlClient"/>
<3>添加各层之间的引用
首先UI层引用BLL和Model,DAL引用Model,BLL引用DAL和Model和configuration(因为DAL层要调用config文件张的连接字符串)
经过上面三步,基本的框架就搭好了,下面开始编写代码
写代码的顺序:Model--》DAL--》BLL--》UI
下面直接上代码:
1:model层
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 7 namespace Model 8 { 9 public class User 10 { 11 public User() { } //空的类构造函数 12 13 private string _name; 14 private string _password; 15 16 public string name //name属性 17 { 18 set { _name = value; } 19 get { return _name; } 20 } 21 public string password //password属性 22 { 23 set { _password = value; } 24 get { return _password; } 25 } 26 27 } 28 }
有没有看出实体类干了什么????
2:DAL层
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using System.Configuration; 6 using System.Data.SqlClient; 7 using Model; 8 namespace DAL 9 { 10 public class UserDb 11 { 12 public bool Exits(Model.User user) 13 { 14 //连接字符串 15 string connString = ConfigurationManager.ConnectionStrings["ConnectionString"].ToString(); 16 //select语句 17 string cmdString = "select count(*) from login where name=@name and password=@password"; 18 19 SqlConnection conn = new SqlConnection(connString); 20 SqlCommand cmd = new SqlCommand(cmdString, conn); 21 22 cmd.Parameters.Add("@name", user.name); 23 cmd.Parameters.Add("@password", user.password); 24 25 cmd.Connection.Open(); 26 try 27 { 28 int dataReater = int.Parse(cmd.ExecuteScalar().ToString());//执行操作 29 30 //对返回的数进行判断 31 if (dataReater == 1) 32 { 33 return true; 34 } 35 else 36 { 37 return false; 38 } 39 40 } 41 catch 42 { 43 return false; 44 45 } 46 finally 47 { 48 conn.Close(); 49 conn.Dispose(); 50 } 51 } 52 53 } 54 }
3:BLL层
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 using DAL; 6 using Model; 7 8 namespace BLL 9 { 10 public class BUser 11 { 12 public BUser(){}//空的类的构造函数 13 14 public static bool login(string loginName,string passWord) 15 { 16 Model.User user1 = new User(); 17 user1.name = loginName; 18 user1.password = passWord; 19 20 DAL.UserDb dalBool = new UserDb(); 21 return dalBool.Exits(user1); 22 } 23 24 } 25 26 }
4:UI.aspx
1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> 2 3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 4 <html xmlns="http://www.w3.org/1999/xhtml"> 5 <head runat="server"> 6 <title>无标题页</title> 7 </head> 8 <body> 9 <form id="form1" runat="server"> 10 <div> 11 name:<asp:TextBox ID="txtName" runat="server"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator1" runat="server" ErrorMessage="*非空" 12 ControlToValidate="txtName"></asp:RequiredFieldValidator></br> 13 password:<asp:TextBox ID="txtPassword" runat="server"></asp:TextBox><asp:RequiredFieldValidator ID="RequiredFieldValidator2" runat="server" ErrorMessage="*非空" ControlToValidate="txtPassword"> 14 </asp:RequiredFieldValidator></br> 15 <asp:Button ID="login" runat="server" Text="login" OnClick="login_Click" /> 16 </div> 17 </form> 18 </body> 19 </html>
UI.aspx.cs
1 using System; 2 using System.Configuration; 3 using System.Data; 4 using System.Linq; 5 using System.Web; 6 using System.Web.Security; 7 using System.Web.UI; 8 using System.Web.UI.HtmlControls; 9 using System.Web.UI.WebControls; 10 using System.Web.UI.WebControls.WebParts; 11 using System.Xml.Linq; 12 using BLL; 13 using Model; 14 15 16 public partial class _Default : System.Web.UI.Page 17 { 18 protected void Page_Load(object sender, EventArgs e) 19 { 20 21 } 22 protected void login_Click(object sender, EventArgs e) 23 { 24 bool eixt = BLL.BUser.login(txtName.Text.Trim(), txtPassword.Text.Trim()); 25 if (eixt == true) 26 { 27 //Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('登录成功!');</script>"); 28 29 Page.ClientScript.RegisterStartupScript(Page.GetType(),"message","<scipt language='javascript'>alert('login success';</script>)"); 30 } 31 else 32 { 33 Page.ClientScript.RegisterStartupScript(Page.GetType(),"message","<scipt language='javascipt'>alert('login failed');</scipt>"); 34 } 35 36 } 37 }
以上完毕:写的比较简单,但是也算的上是我写的最长的一片博客了,花了一个多小时啊.不过写着写着自己对三层架构有了更新的认识
其实三层只是一种框架,三个层之间相互的引用,已达到取数据,显示数据的功能.其中UI层及时显示数据,DAL就是从数据库中取数据,而BLL层就是逻辑判断,操作定向别忘了业务实体层对数据的对象化起到的作用.
好啦!下午再继续研究三层!