当前位置:文档之家› .NET三层架构与三层架构下GridView控件增删改操作详解

.NET三层架构与三层架构下GridView控件增删改操作详解

.NET三层架构与三层架构下GridView控件增删改操作详解(一)所谓三层架构(3-tier application)就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。

区分层次的目的即为了“高内聚、低耦合”的思想。

1、表现层(UI):主要是指与用户交互的界面,用于显示数据和接受用户输入的数据,将用户输入的数据传递给业务逻辑层,一般不包含任何实际的业务处理,当业务逻辑层的数据发生变化时,表示层就会显示出更新的结果。

表示层提供应用程序的用户界面,通常为Windows 应用程序或Web应用程序。

2、业务逻辑层(BLL):是表示层和数据访问层之间的桥梁,它代表应用程序的核心功能,负责处理数据层的数据,实现业务逻辑。

业务逻辑层通常为类库。

3、数据访问层(DAL):主要实现对数据的保存和读取操作,将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库中。

数据访问层可以访问关系数据库、文本文件或者XML文档,通常为类库。

三层架构对应的图如下图所示:为了更好地让初学者轻松入门,这里仍然采用趣味性的方式聊一些常用技术点,致力于.NET 新手们的快速提高!知识都是普通的,关键是学习的思路。

技术源于生活,技术原来可以这样学。

抛砖引玉而已。

层次结构在现实社会里随处可见。

记得有个笑话讲有个村长得意地向他老婆吹牛:“全中国只有四个人比我官大,乡长、县长、省长和国务院总理”。

这个笑话也体现了真实社会中分层的现象。

社会人群会分层,公司人员结构也会分层,楼房是分层的,甚至做包子的笼屉都是分层的。

虽然分层的目的各有不同,但都是为解决某一问题而产生的。

所以,分层架构其实是为了解决某一问题而产生的一种解决方案。

1、常用的三层架构设计软件系统最常用的一般会讲到三层架构,其实就是将整个业务应用划分为表示层、业务逻辑层、数据访问层等,有的还要细一些,通过分解业务细节,将不同的功能代码分散开来,更利于系统的设计和开发,同时为可能的变更提供了更小的单元,十分有利于系统的维护和扩展。

常见的三层架构基本包括如下几个部分,如图1所示。

图1 常见的三层架构* 数据访问层DAL:用于实现与数据库的交互和访问,从数据库获取数据或保存数据到数据库的部分。

* 业务逻辑层BLL:业务逻辑层承上启下,用于对上下交互的数据进行逻辑处理,实现业务目标。

* 表示层Web:主要实现和用户的交互,接收用户请求或返回用户请求的数据结果的展现,而具体的数据处理则交给业务逻辑层和数据访问层去处理。

日常开发的很多情况下为了复用一些共同的东西,会把一些各层都用的东西抽象出来。

如我们将数据对象实体和方法分离,以便在多个层中传递,例如称为Model。

一些共性的通用辅助类和工具方法,如数据校验、缓存处理、加解密处理等,为了让各个层之间复用,也单独分离出来,作为独立的模块使用,例如称为Common。

此时,三层架构会演变为如图2所示的情况。

图2 三层架构演变结果*业务实体Model:用于封装实体类数据结构,一般用于映射数据库的数据表或视图,用以描述业务中客观存在的对象。

Model分离出来是为了更好地解耦,为了更好地发挥分层的作用,更好地进行复用和扩展,增强灵活性。

*通用类库Common:通用的辅助工具类。

在第 5.2节中我们讲过可以将对数据库的共性操作抽象封装成数据操作类(例如DbHelperSQL),以便更好地复用和使代码简洁。

数据层底层使用通用数据库操作类来访问数据库,最后完整的三层架构如图3所示。

图3 最后完整的三层架构数据库访问类是对的封装,封装了一些常用的重复的数据库操作。

如微软的企业库SQLHelper.cs,动软的DBUtility/DbHelperSQL等,为DAL提供访问数据库的辅助工具通过以上分析,我们知道如今常用的三层架构是个什么样子,同时,我们也知道了三层架构在使用过程中的一些演化过程。

那么,为什么要这样分层,每层结构到底又起什么作用呢?我们继续往下看。

2、趣味理解:三层架构与养猪看新闻报道今年猪肉价格一路高涨,据说有人养猪都发财致富奔小康了,程序员都说写代码没前途了,还不如去养猪,不过,可别认为养猪没有技术含量,比写代码容易,其实养猪也大有学问。

为了更好地理解三层架构,就拿养猪来做个例子吧。

俗话说:“没吃过猪肉,还没见过猪跑啊!”。

图4是三层架构化的养猪产业流水线趣味对此图。

图4 三层结构与养猪对比图3与图4,我们可以看出:* 数据库好比猪圈,所有的猪有序地按区域或编号,存放在不同的猪栏里。

* DAL好比是屠宰场,把猪从猪圈取出来进行(处理)屠杀,按要求取出相应的部位(字段),或者进行归类整理(统计),形成整箱的猪肉(数据集),传送给食品加工厂(BLL)。

本来这里都是同一伙人既管抓猪,又管杀猪的,后来觉得效率太低了,就让一部分人出来专管抓猪了(DBUtility),根据要求来抓取指定的猪。

* BLL好比食品加工厂,将猪肉深加工成各种可以食用的食品(业务处理)。

* Web好比商场,将食品包装成漂亮的可以销售的产品,展现给顾客(UI表现层)。

* 猪肉好比Model,无论是哪个厂(层),各个环节传递的本质都是猪肉,猪肉贯穿整个* 通用类库Common相当于工人使用的各种工具,为各个厂(层)提供诸如杀猪刀、绳子、剪刀、包装箱、工具车等共用的常用工具(类)。

其实,每个部门本来是可以自己制作自己的工具的,但是那样会使效率比较低,而且也不专业,并且很多工作都会是重复的。

因此,就专门有人开了这样的工厂来制作这些工具,提供给各个工厂,有了这样的分工,工厂就可以专心做自己的事情了。

当然,这里只是形象的比喻,目的是为了让大家更好地理解,实际的情况在细节上会有所不同。

这个例子也只是说明了从猪圈到商场的单向过程,而实际三层开发中的数据交互是双向的,可取可存。

不过,据说有一种机器,把猪从这头赶进去,另一头就噗噗噜噜地出火腿肠了。

如果火腿肠卖不了了,从那头再放进去,这头猪又原原本本出来了,科幻的机器吧,没想到也可以和三层结构联系上。

以上只是笑谈,不过也使三层架构的基本概念更容易理解了。

上面谈了那么多,有人会问,我直接从数据库取出内容直接操作不可以吗?为什么要这么麻烦地用三层架构呢?三层架构到底有什么好处呢?不分层,当然可以,就好比整个过程不分屠宰场、加工场之类的,都在同一个场所(工厂)完成所有的活(屠杀、加工、销售)。

但为什么要加工厂和商场呢?因为当规模比较大的时候,管理起来就会变得非常复杂,这样的养殖方式已经无法满足规模化的需要了。

并且,从社会的发展来看,社会分工是人类进步的表现。

社会分工的优势就是让适合的人做自己擅长的事情,使平均社会劳动时间大大缩短,生产效率显著提高。

能够提供优质高效劳动产品的人才能在市场竞争中获得高利润和高价值。

人尽其才,物尽其用最深刻的含义就是由社会分工得出的。

软件开发也一样,做小项目的时候,分不分层确实看不出什么差别,并且显得更麻烦啰嗦了。

但当项目变大和变复杂时,分层就显示出它的优势来了。

所以分不分层要根据项目的实际情况而定,不能一概而论。

NET三层架构与三层架构下GridView控件增删改操作详解(二)(由于代码过多文章发表不了,所以很多代码用截图表示)1 新建一个数据库test,新建一个表Users,表中有如下字段(ID,username,password)。

其中ID为表示字段。

结构如下图:2 新建三个类库DiaryBLL(业务逻辑层),DiaryDAL(数据访问层),DiaryModel(业务实体层),将上述三个类库放至解决方案DiaryPro中,然后在新建一个网站DiaryWeb。

然后右键单击网站,设为启动项目,结构图如下:3 添加类库的引用关系DiaryBLL添加DiaryDAL和DiaryModel,如下图所示:DiaryDAL添加DiaryModel,如下图所示:表示层Web添加上述三个,如下图所示:4 类库中类的编写1)DiaryModel(业务实体层),新建一个User类代码如下:该类可以获得User类的各个字段。

2)DiaryDAL(数据访问层)由于本层要用到数据库的相关操作,所以这里用到了微软封装的DBHelper.cs类。

DBHelper类访问了Web网站的配置文件,获得连接字符串,DiaryDAL要添加引用System.configuration。

Web网站的Web.config文件相关代码如下:(将DBHelper.cs类纺织DiaryDAL目录下,要注意的是DBHelper类下的命名空间要改为DiaryDAL)点击查看DBHelper类新建一个UserService.cs类,实现增删改查等相关操作,具体代码如下所示:3)DiaryBLL(业务逻辑层)新建一个UserManage.cs类,具体代码如下:4 Web网站的设计为了实现三层架构下的增删改操作,我们用到了GridView控件,界面如下如所示:GridView的设计过程如下:拖放一个GridView控件到页面中,然后添加三个BoundField字段,HeaderText属性分别为用户ID、用户名、密码,绑定字段分别为ID,username,password,一个CommandField字段,显示编辑按钮和删除按钮,然后再将上述四个字段转化为模板列。

Web网站的设计前台代码如下:<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "/TR/xhtml1/DTD/xhtml1-tran<html xmlns="/1999/xhtml" ><head runat="server"><title>无标题页</title></head><body><form id="form1" runat="server"><div>用户列表:<br /><asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"BackColor="White" BorderColor="#CCCCCC" BorderStyle="None" BorderWidth="1px"CellPadding="3" PageSize="4" Width="778px" OnRowDeleting="GridView1_RowDeleting" OnRowDataBound="GridVie OnRowEditing="GridView1_RowEditing"OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowUpdating="GridView1_RowUpdating"><FooterStyle BackColor="White" ForeColor="#000066" /><RowStyle ForeColor="#000066" /><Columns><asp:TemplateField HeaderText="用户ID"><ItemTemplate><asp:Label ID="Label1" runat="server" Text='<%# Bind("UserID") %>'></asp:Label></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="用户名"><EditItemTemplate><asp:TextBox ID="TextBox2" runat="server" Text='<%# Bind("UserName") %>'></asp:TextBox> </EditItemTemplate><ItemTemplate><asp:Label ID="Label2" runat="server" Text='<%# Bind("UserName") %>'></asp:Label></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="密码"><EditItemTemplate><asp:TextBox ID="TextBox3" runat="server" Text='<%# Bind("Password") %>'></asp:TextBox> </EditItemTemplate><ItemTemplate><asp:Label ID="Label3" runat="server" Text='<%# Bind("Password") %>'></asp:Label></ItemTemplate></asp:TemplateField><asp:TemplateField HeaderText="操作" ShowHeader="False"><EditItemTemplate><asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="True" CommandName="Update"Text="更新"></asp:LinkButton><asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Cancel"Text="取消"></asp:LinkButton></EditItemTemplate><ItemTemplate><asp:LinkButton ID="LinkButton1" runat="server" CausesValidation="False" CommandName="Edit"Text="编辑"></asp:LinkButton><asp:LinkButton ID="LinkButton2" runat="server" CausesValidation="False" CommandName="Delete" OnClient 除么?');" Text="删除"></asp:LinkButton></ItemTemplate></asp:TemplateField></Columns><PagerStyle BackColor="White" ForeColor="#000066" HorizontalAlign="Left" /><SelectedRowStyle BackColor="#669999" Font-Bold="True" ForeColor="White" /><HeaderStyle BackColor="#006699" Font-Bold="True" ForeColor="White" /></asp:GridView></div><br /><br /><br />添加用户<br />用户名:<asp:TextBox ID="tb_username" runat="server"></asp:TextBox><br />密码:&nbsp;&nbsp;<asp:TextBox ID="tb_pwd" runat="server"></asp:TextBox><br /><asp:Button ID="Button1" runat="server" Text="添加" OnClick="Button1_Click" /></form></body></html>后台代码如下:using System.Data;using System.Configuration;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;using DiaryModel;public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){Bind();}}protected void Bind(){GridView1.DataSource = erManage.GetAllUsers();GridView1.DataBind();}protected void Button1_Click(object sender, EventArgs e){Users user = new Users();erName = this.tb_username.Text.ToString().Trim();user.Password = this.tb_pwd.Text.ToString().Trim();bool bol=erManage.Add(user);if (bol){Response.Redirect("Default.aspx");}}protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e){int UserID = Convert.ToInt32((GridView1.Rows[e.RowIndex].FindControl("Label1") as Label).Text);bool bol = erManage.Delete(UserID);{Bind();}else{Response.Write("<script>alert('删除失败');location.href=Default.aspx;</script>");}}protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e){if (e.Row.RowType == DataControlRowType.DataRow){LinkButton lb = e.Row.FindControl("LinkButton2") as LinkButton;if (lb.Text == "删除"){lb.Attributes.Add("onclick", "return confirm('确认要删除么?');");}}}/// <summary>/// 让当前处于修改状态/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e){GridView1.EditIndex = e.NewEditIndex;Bind();}/// <summary>/// 让当前行处于绑定状态/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) {GridView1.EditIndex = -1;Bind();}/// <summary>/// 更新至数据库/// </summary>/// <param name="sender"></param>/// <param name="e"></param>protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e){Users user = new Users();erID = Convert.ToInt32((GridView1.Rows[e.RowIndex].FindControl("Label1") as Label).Text);erName = (GridView1.Rows[e.RowIndex].FindControl("TextBox2") as TextBox).Text.ToString();user.Password = (GridView1.Rows[e.RowIndex].FindControl("TextBox3") as TextBox).Text.ToString();bool bol = erManage.Modify(user);if (bol){Response.Write("<script>alert('修改成功');</script>");GridView1.EditIndex = -1;Bind();}else{Response.Write("<script>alert('修改失败');</script>");}}}。

相关主题