【ASP.NET开发】.NET三层架构简单解析

这篇文章本来应该很早就写出来的,但是一直苦于自己的精神能力有限,而且已经到了我们学校的考试周,所以时间上还是有点紧迫。关键的一点就是,找不到合理的思路来写,思路没有的话,就算是再好的素材,也写不来大家喜欢的文章。

之前已经写过关于.NET三层架的两篇文章了,一篇是《【ASP.NET开发】ASP.NET(MVC)三层架构知识的学习总结》和《【ASP.NET开发】ASP.NET对SQLServer的通用数据库访问类》。如果大家有兴趣的话,可以去读一读。当然了,这两篇文章的内容,大部分都不是自己的,自己也是看了别人的博文,然后自己总结一下,拿过来自己用罢了。这次的文章主要是自己亲自使用这些知识做了一个项目(我们学校资环学院的院网站),然后拿出来跟大家分享一下。也不要期望博主能够写出多么有水平的文章,我还是学生(大三),我也是在学习的过程中,写博客之不过是想记录自己学习过程中的点滴和记录自己的进步,如果能够顺便的帮助别人学习就更好了。同时也希望大家能够多给我提意见。

非常感谢 @ 守护晴天 ,@Adming,@ Qlin等博友给我提出的宝贵的修改意见。也希望大家在阅读本博文的时候,如果有什么问题,或者疑问及时的给我留言沟通,大家一起探讨。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

对于三层架构来说,主要是使用设计模式的思想,对于项目的各个模块实现"高内聚,低耦合"的思想。这里就不做详细的介绍了,如果大家有兴趣,可以阅读软件工程和设计模式相关文章。

对于三层架构来说,就是使用类,把我们在做项目的过程中,可能需要反复操作数据库,反复的使用某个方法等等,可能就是操作的参数不同。如果我们如果在每次使用的时候,都去编写相应的代码,无疑会增加程序员的负担。所以,为了增加方法的重用,就把这些能够重用的方法抽象成类,以供程序员在其它地方可以调用。

当然了,这也是面向对象的一部分。其中的三层所指的就是:①视图层(UI)②数据库访问层(DAL)③业务逻辑层(BLL)。当然了,还有所谓的第四层-实体层(model),这一层主要是在这三个层之间进行流动传递。但是为什么不叫四层架构。。。原因我也不知道,可能是因为实体层是外在的可以根据需要会随时变化的(如:项目后续模块的添加等)。而其它三个层,如果搭建完后,可以作为框架来使用的。。。

1)首先还是先来介绍一下实体层吧,就是我们通常所说的model

实体就是我们在开发项目过程中所要涉及的一些对象。把这些所要涉及的对象(如:新闻名称,新闻上传时间,供稿人,上传文件的名称等),都抽象成一个类。使用封装字段方法,我们可以在视图层通(主要是视图层)过实例化对象的方法,来给我们的对象的属性赋值。

简单的看一段代码吧,可能会能够更加的清楚,明白

 1 public class NewsModel
 2 {
 3     //新闻编号
 4     private int nNewsId;
 5 
 6     public int NNewsId
 7     {
 8         get { return nNewsId; }
 9         set { nNewsId = value; }
10     }
11 
12     //新闻名称
13     private string strNewsName;
14 
15     public string StrNewsName
16     {
17         get { return strNewsName; }
18         set { strNewsName = value; }
19     }
20 
21 }

这里的NewsModel就是一个关于新闻的实体类,其中声明了两个private的属性字段(一定要是private,防止非法赋值),使用public的构造函数,可以在外部给字段赋值。

下面的就是在视图层来实例化对象,根据需要来给字段赋值,看下面的一段代码:

NewsModel newModel = new NewsModel();newModel.StrNewsName = this.TextBox1.Text;

当然了,这仅仅是一段代码,其中并没有给字段nNewsId赋值,因为我把它作为数据库的id地段,已经设置成自动增长。这样,就完成了视图层对实体层的调用。

 

2)数据库访问层

数据库库访问层,顾名思义,就是主要来完成对数据库的访问,等一系类的对数据库操作的类。为什么要单独的把对数据库的操作抽象成一个单独的类,我个人理解是因为在整个项目的开发过程中,不仅仅需要一次访问数据库,而是需要多次,如果每次都编写数据库访问代码的话,会增加程序员的个人工作量,而且对于代码的易用性和简洁性来说肯定是非常糟糕的。当然来可能还有其它的一些优点,我暂时还没有发现。

既然是对数据库的操作类,而且对数据库的操作,无非就是四种:增删改查。所以一个能提供增删改查的通用类是必不可少的。这就是我们经常所说的,通用数据库访问类(很多的程序员都喜欢把这个类命名为SqlHelper,既然是名字,都是可以随意起的,只要不违反C#语法命名规范,当然这样命名也是有好处,就是可以使其他程序员根据类的名称,大概判断出这个类是要干什么的)。

当然了,我这次做自己项目的时候,所写的数据库访问类就没有我上次看周金桥老师的书,然后模仿写的数据库访问类那么的复杂了(《【ASP.NET开发】ASP.NET对SQLServer的通用数据库访问类》)。当然了,我这里的数据库访问类,主要还是为了简介,和易用,只要满足我自己当前项目的需要就可以了,不是每做一个项目,都要写一个功能全面的数据库访问类。

代码如下,请大家参考,更喜欢哪个访问类,自己可以根据自己口味,或者需要,直接用也可以:

/// <summary>
///创建一个SqlHelper的数据库访问通用类,完成对数据库的所有操作
/// </summary>
public class SqlHelper
{//定义数据库的连接字符串private static readonly string connectionString = ConfigurationManager.ConnectionStrings["strConnectionString"].ConnectionString;/// <summary>/// 创建方法,完成对数据库的非查询的操作/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">传入的参数</param>/// <returns></returns>public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters){using (SqlConnection con = new SqlConnection(connectionString)){con.Open();using (SqlCommand cmd = con.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);string str = sql;return cmd.ExecuteNonQuery();}}}/// <summary>/// 完成查询的结果值/// </summary>/// <param name="sql">sql语句</param>/// <param name="parameters">传入的参数数组</param>/// <returns></returns>public static int ExecuteScalar(string sql, params SqlParameter[] parameters){using (SqlConnection con = new SqlConnection(connectionString)){con.Open();using (SqlCommand cmd = con.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);return Convert.ToInt32( cmd.ExecuteScalar());}}}/// <summary>/// 主要执行查询操作/// </summary>/// <param name="sql">执行的sql语句</param>/// <param name="parameters">参数数组</param>/// <returns></returns>public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters){using (SqlConnection con = new SqlConnection(connectionString)){con.Open();using (SqlCommand cmd = con.CreateCommand()){cmd.CommandText = sql;cmd.Parameters.AddRange(parameters);SqlDataAdapter adapter = new SqlDataAdapter(cmd);DataTable dt = new DataTable();adapter.Fill(dt);return dt;}}}
}

这样的类创建好以后,其他的需要访问数据库的类,就可以根据自己的需要,完成相应的增删改查的操作了。还是用一段代码来演示吧:

/// <summary>
///NewsDALL 的摘要说明
/// </summary>
public class NewsDALL
{//向数据库中插入新闻public int AddNews(NewsModel model){string sql = "insert into News (name,author,time,content,sort,isdelete) values(@name,@author,@time,@content,@sort,@isdelete)";int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@name", model.StrNewsName), new SqlParameter("@author",model.StrNewsAuthor),new SqlParameter("@time", model.StrAddTime), new SqlParameter("@content", model.StrNewsContent), new SqlParameter("@sort", model.Sort), new SqlParameter("@isdelete", model.IsDelete1));return nResult;}//执行数据库的删除操作public int DeleteNew(int id){string sql = "delete from News where id=@id";int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@id", id));return nResult;}//执行数据库的更新操作public int UpdateNew(NewsModel model, int nID){string sql = "update News set name=@name,time=@time,content=@content where id=" + nID;int nResult = SqlHelper.ExecuteNonQuery(sql, new SqlParameter("@name", model.StrNewsName), new SqlParameter("@time", model.StrAddTime), new SqlParameter("@content", model.StrNewsContent));return nResult;}//执行数据库的查询操作public NewsModel GetNewsModel(int id)//声明一次从数据库中读取新闻的条数
    {string sql = "select * from News where id=@id";DataTable dt = SqlHelper.ExecuteDataTable(sql, new SqlParameter("@id", id));if (dt.Rows.Count <= 0){return null;}else if (dt.Rows.Count == 1){NewsModel newModel = new NewsModel();DataRow dr = dt.Rows[0];newModel.StrNewsName = dr["name"].ToString();newModel.StrNewsAuthor = dr["author"].ToString();newModel.StrAddTime = dr["time"].ToString();newModel.StrNewsContent = dr["content"].ToString();newModel.Sort = (int)dr["sort"];return newModel;}else{throw new Exception("出现异常!");}}
}

这里的这个NewsDALL类,主要是来完成有关新闻需要对数据库的各种操作,当然了,这只是这个类的一部分,主要是来演示NewsDALL类怎样调用SqlHelper类中的方法,来完成对数据库的操作的。

3)接下来就是最后一层,业务逻辑层了。

业务逻辑层的话主要来处理视图层和数据库访问层之间的关系的。当然了,也可以直接在视图层调用数据库访问层,但是对于关系来说可能会增加复杂性,所以前辈们就专门的抽象出来一个业务逻辑层,把所有的业务逻辑关系都在这一层处理清楚之后再,访问数据库访问层,进行对数据的操作。(当然这是我自己的理解,如果有什么不对的话,请大家指正)

在我这次的项目中,貌似我的这一层完全是多余的,因为不需要什么太多的业务逻辑的处理,可以完全在视图层直接访问数据库访问层的。

还是使用代码说话吧,当然这个仍然是NewsBLL类代码的一部分:

/// <summary>
///业务逻辑层主要处理视图层和数据库访问直接的关系
/// </summary>
public class NewsBLL
{//完成对数据库的添加public static int AddNew(NewsModel model){NewsDALL newDALL = new NewsDALL();return newDALL.AddNews(model);}//完成对数据的删除public static int DeleteNew(int i){NewsDALL newDALL = new NewsDALL();return newDALL.DeleteNew(i);}//返回一个新闻分类的对象public static NewsModel GetModel(int intSort){NewsModel model = new NewsModel();if (intSort == 1){model.StrNewSort1 = "学院新闻";model.StrNewSort2 = "";model.StrNewSort3 = "";}else if (intSort == 2){model.StrNewSort1 = "公告通知";model.StrNewSort2 = "";model.StrNewSort3 = "";}..........return model;}
}

接下来就是在视图层来通过访问,业务逻辑层来和实体层,来玩成所需要的数据操作了。

还是使用代码来描述吧,这个代码主要来完成对数据进行添加:

public void InsertData(){NewsModel newModel = new NewsModel();newModel.StrNewsName = this.TextBox1.Text;newModel.StrNewsAuthor = this.TxtBoxAuthor.Text;newModel.StrAddTime = this.TxtDate.Text;newModel.StrNewsContent = Server.HtmlDecode(FCKeditor1.Value);newModel.Sort =Convert.ToInt32( this.DropDownList2.SelectedValue.ToString());//NewsBLL newBLL = new NewsBLL();int nResult= NewsBLL.AddNew(newModel);if (nResult != 0){Response.Write("<script>alert('添加成功!')</script>");}else{Response.Write("<script>alert('添加失败!')</script>");}}

我以前自己做的图,被大家指出了很多的错误。所以,我就引用了网络上的一个图片来解释(如果侵害了您的版权,请您联系我)

据我自己的理解,三层架构可以算是一个团队项目开发的基本框架,在这个框架的基础上可以满足一些设计模式的需要。当然可以满足模块开发的需要。

总结:

对于我这次的开发项目来说,收获还是很多的,以前仅仅是知道有三层架构这个东西,也看书,照着别人的代码写过,但是却不能体会到这其中的真正意义。

优点:①使代码的重用更加的高了,不需要像以前做项目,每次在一个页面反复的编写操作数据库的代码,而使用三层架构的话,只需要把注意力放在业务逻辑层     的业务逻辑的处理和数据库访问层的sql语句的编写。

 ②代码的整洁性,和易用性更加的高了。因为不同的操作都分别放在了不同的层,所以代码逻辑更加清晰,如果做好注释的话,别人能够更加清楚的理解    编写者的意图。

 ③可扩展型更加的高了,根据需要在不同的层编写代码,然后调用就可以了。

 ④非常利于团队开发。

当然了,三层架构的有点不仅仅有这些,不然也不会成为现在企业开发的基本框架,这只不过是我在开发中明显的发现的优点,拿出来跟大家分享一下。

缺点:①就是性能上肯定比以前直接在相应的页面编写数据库操作代码上有点降低。但是这个完全是可以接受的,况且,对于我现在的水平就是代码质量上可定还     有待提高,有更大的优化空间。

  ②就是在我的项目中,我觉得最大的浪费就是可以在视图层直接访问数据库访问层,因为要处理的业务逻辑实在是不多,所以还是有点代码冗余吧。所以,     以后还是要跟据自己项目的需要,来灵活的使用,不一定要按照规定必须这样做。

这仅仅是我的一点拙见,有什么地方错误,请大家积极指正。也欢迎大家跟我交流。

 

转载于:https://www.cnblogs.com/yisuowushinian/archive/2013/01/16/2863201.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C和C++里面常见错误和异常出现怎么解决总结(不断更新)

1、cannot open Debug/first.exe for writing 如下图: 原因:控制台没有关闭,不能写,因为编译的exe文件正在运行,而再次编译是要修改这个exe文件的,因为不让写,所以就抱着这个错。 解决办法:是看有没有运行编译后文件,如果正运行着,就将其关掉。 2、cannot conver…

有关[Http持久连接]的一切,卷给你看

上文中我的结论是&#xff1a; HTTP Keep-Alive 是在应用层对TCP连接进行滑动续约复用&#xff0c; 如果客户端/服务器稳定续约&#xff0c;就成了名副其实的长连接。目前所有的Http网络库都默认开启了HTTP Keep-Alive&#xff0c;今天我们从底层TCP连接和排障角度撕碎HTTP持久…

他从小把数学书当小说看,凭借一本书将全世界狠狠甩在身后,被誉为中国的牛顿...

全世界只有3.14 % 的人关注了爆炸吧知识你知道吗&#xff1f;我国也有牛顿哦。他就是魏晋时期的数学家——刘徽&#xff0c;人称“中国数学史上的牛顿”。刘徽沉迷学习公元225年&#xff0c;刘徽出生在山东滨州邹平市的一所农家小院里。从小&#xff0c;刘徽就表现得与别的孩子…

C和C++语言编程里面常用函数或者编程技巧总结(不断更新)

1、我们输入字符串输出字符串可以这样 char a[20];gets(a);puts(a);puts("hello word"); 2、输出字符串putchar()、printf("%p\n",p);cout<<p; #include<stdio.h> void main(){char a[20]={"chenyu1"};char *c="chenyu2"…

python 3.* + Eclipse mar.2 +pydev 5.0 环境搭建

为什么80%的码农都做不了架构师&#xff1f;>>> 这个是版本问题&#xff0c;官方已给出答案 如果要用pydev 5.0 JDK 必须 1.8&#xff0c;1.7是不行的。 PyDev does not appear after install! Well, the main issue at this time is that PyDev requires Java 8 i…

php7 不是有效的32位,Win7系统安装软件提示“不是有效的win32应用程序”怎么办?...

用户在Win7系统中安装软件时&#xff0c;时常会出现一些64bit和86bit的提示&#xff0c;这个和系统32位与64位有关&#xff0c;笔者便不多说。还有一些在Win7系统中比较少见的提示&#xff1a;“不是有效的Win32程序”会偶尔出现&#xff0c;这类错误发生的原因是为软件不完整或…

关于async和await的探讨

缘起最近在看《深入解析C#&#xff08;第4版&#xff09;》这本书&#xff0c;看到了第五章&#xff0c;这一章节是关于异步。之前对异步这个概念只能算是一知半解&#xff0c;了解了它的概念和用法&#xff0c;但是对它的实际场景和为了解决什么问题而诞生的是不太清楚的。于是…

令人惋惜的天才新秀:16岁上剑桥大学,27岁就出名,数学事业一路畅通无阻,但自从结婚后,人生从此翻天覆地······

全世界只有3.14 % 的人关注了爆炸吧知识据说&#xff0c;在网上流传着这么一则笑话&#xff1a;“费马&#xff0c;泰勒&#xff0c;拉格朗日&#xff0c;洛必达&#xff0c;史称&#xff1a;“马勒格必”。嘘&#xff01;这可不是在口吐芬芳&#xff0c;这可是让无数高数学渣头…

jQuery的.live()和.die()

2019独角兽企业重金招聘Python工程师标准>>> 很多开发者都知道jQuery的.live()方法&#xff0c;他们大部分知道这个函数做什么&#xff0c;但是并不知道是怎么实现的&#xff0c;所以用的并不那么舒适。而且他们却从未听过还有解除绑定的.live()事件的.die()方法。即…

简洁强大的JavaWeb框架Blade

English Blade是什么? blade 是一个轻量级的MVC框架. 它拥有简洁的代码&#xff0c;优雅的设计。 如果你喜欢,欢迎 Star and Fork, 谢谢! 特性 [x] 轻量级。代码简洁,结构清晰,更容易开发[x] 模块化(你可以选择使用哪些组件)[x] 插件扩展机制[x] Restful风格的路由接口[x] 多种…

SQL SERVER 数据压缩

从SQL SERVER 2008开始&#xff0c;SQL SERVER 提供了对数据进行压缩的功能&#xff0c;启用数据压缩无须修改应用程序。 数据压缩可有效减少数据的占用空间&#xff0c;读取和写入相同数据花费的IO也响应减少&#xff0c;从而可以有效缓解IO压力&#xff0c;但由于数据在读取和…

C语言基本数据类型short、int、long、char、float、double

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程 1.概述 C 语言包含的数据类型如下图所示 2.各种数据类型介绍 2.1整型 整形包括短整型、整形和长整形。 2.1.1短整形 short a=1; 2.1.2整形 一般占4个字节(32位),…

是的,我打败了一个奥特曼。

全世界只有3.14 % 的人关注了爆炸吧知识春节将至&#xff0c;超模君给各位带来了春节好礼——《数学之旅闪耀人类的54位数学家》文化礼盒&#xff0c;集结阿基米德、欧几里得、芝诺、高斯、欧拉等54位数学家&#xff0c;跨越2600年的数学之旅&#xff0c;为各位新一年的学习之旅…

你有多少个前男友?

1 给我整不会了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 这是送分题还是送命题&#xff1f;▼3 有梦想谁都了不起&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 &#xff1f;&#xff1f;&#xff08;via.偷听bot&#xff0c;侵删&#xff09;…

里程碑!中文版.NET官网发布,.NET开发起飞!

重磅官宣&#xff0c;微软.NET官网正式发布简体中⽂版&#xff0c;而且是官方支持语言第一梯队&#xff0c;由此可见微软对中国.NET市场的重视。这些年&#xff0c;微软一直在加大.NET在中国的支持和推广&#xff0c;努力让更多传统行业、互联网公司、创业团队的中国开发者选择…

来一个可能防止恶意采集和爬虫的SH

没办法&#xff0c;公司的要求&#xff0c;还有&#xff0c;一些山寨爬虫完全不够我们运维人员的感觉&#xff0c; 一天爬虫搞个三四十万的LOG&#xff0c;那我只好干了。。 人家GOOGLE&#xff0c;BAIDU&#xff0c;一天大约也就五六千吧。。 有一个小的SSH技巧&#xff0c;是…

面对焦虑,我们能做什么?

全世界只有3.14 % 的人关注了爆炸吧知识你在犹豫&#xff0c;你在抱怨&#xff0c;你埋怨这个社会的不公平&#xff1b;你埋怨自己的运气不好&#xff0c;你埋怨付出了得不到结果。其实你只是还不够努力。从此刻起开始改变自己一切还来得及。从现在开始&#xff0c;你有多努力就…

验证规则构建神器 FluentValidation.md

上一篇文章《MediatR在.NET应用中的实践》中&#xff0c;我们在讲MediatR的管线内容时&#xff0c;提到过可以在管线中增加 Command/Query 的验证。今天我来带领大家了解一个.NET技术领域中很「流行」的强类型验证规则构建库&#xff1a;FluentValidation。FluentValidation 简…

基本排序算法一

一 选择排序 原理&#xff1a;选择排序很简单&#xff0c;他的步骤如下&#xff1a; 从左至右遍历&#xff0c;找到最小(大)的元素&#xff0c;然后与第一个元素交换。从剩余未排序元素中继续寻找最小&#xff08;大&#xff09;元素&#xff0c;然后与第二个元素进行交换。以此…

老大爷的手法一看就不一般!

1 超市门口的双枪老大爷▼2 小朋友&#xff1a;谢邀&#xff0c;人在机场&#xff0c;刚下飞船▼3 向你保证这真的是一副刺绣作品▼4 外国最新挑战【我打我自己接力】▼5 疫情期间在家隔离的健身人士们快要被逼疯了▼6 给大家表演一个大变活人吧▼7 家有神兽的家长最近一…