2023年6月21日发(作者:)

【开发】.NET三层架构简单解析这篇⽂章本来应该很早就写出来的,但是⼀直苦于⾃⼰的精神能⼒有限,⽽且已经到了我们学校的考试周,所以时间上还是有点紧迫。关键的⼀点就是,找不到合理的思路来写,思路没有的话,就算是再好的素材,也写不来⼤家喜欢的⽂章。之前已经写过关于.NET三层架的两篇⽂章了,⼀篇是和。如果⼤家有兴趣的话,可以去读⼀读。当然了,这两篇⽂章的内容,⼤部分都不是⾃⼰的,⾃⼰也是看了别⼈的博⽂,然后⾃⼰总结⼀下,拿过来⾃⼰⽤罢了。这次的⽂章主要是⾃⼰亲⾃使⽤这些知识做了⼀个项⽬(我们学校资环学院的院⽹站),然后拿出来跟⼤家分享⼀下。也不要期望博主能够写出多么有⽔平的⽂章,我还是学⽣(⼤三),我也是在学习的过程中,写博客之不过是想记录⾃⼰学习过程中的点滴和记录⾃⼰的进步,如果能够顺便的帮助别⼈学习就更好了。同时也希望⼤家能够多给我提意见。⾮常感谢 @ ,@,@ 等博友给我提出的宝贵的修改意见。也希望⼤家在阅读本博⽂的时候,如果有什么问题,或者疑问及时的给我留⾔沟通,⼤家⼀起探讨。----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------对于三层架构来说,主要是使⽤设计模式的思想,对于项⽬的各个模块实现"⾼内聚,低耦合"的思想。这⾥就不做详细的介绍了,如果⼤家有兴趣,可以阅读软件⼯程和设计模式相关⽂章。对于三层架构来说,就是使⽤类,把我们在做项⽬的过程中,可能需要反复操作数据库,反复的使⽤某个⽅法等等,可能就是操作的参数不同。如果我们如果在每次使⽤的时候,都去编写相应的代码,⽆疑会增加程序员的负担。所以,为了增加⽅法的重⽤,就把这些能够重⽤的⽅法抽象成类,以供程序员在其它地⽅可以调⽤。当然了,这也是⾯向对象的⼀部分。其中的三层所指的就是:①视图层(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 StrNewsName16 {17 get { return strNewsName; }18 set { strNewsName = value; }19 }20

21 }这⾥的NewsModel就是⼀个关于新闻的实体类,其中声明了两个private的属性字段(⼀定要是private,防⽌⾮法赋值),使⽤public的构造函数,可以在外部给字段赋值。下⾯的就是在视图层来实例化对象,根据需要来给字段赋值,看下⾯的⼀段代码:NewsModel newModel = new NewsModel(); sName = ;

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

2)数据库访问层数据库库访问层,顾名思义,就是主要来完成对数据库的访问,等⼀系类的对数据库操作的类。为什么要单独的把对数据库的操作抽象成⼀个单独的类,我个⼈理解是因为在整个项⽬的开发过程中,不仅仅需要⼀次访问数据库,⽽是需要多次,如果每次都编写数据库访问代码的话,会增加程序员的个⼈⼯作量,⽽且对于代码的易⽤性和简洁性来说肯定是⾮常糟糕的。当然来可能还有其它的⼀些优点,我暂时还没有发现。既然是对数据库的操作类,⽽且对数据库的操作,⽆⾮就是四种:增删改查。所以⼀个能提供增删改查的通⽤类是必不可少的。这就是我们经常所说的,通⽤数据库访问类(很多的程序员都喜欢把这个类命名为SqlHelper,既然是名字,都是可以随意起的,只要不违反C#语法命名规范,当然这样命名也是有好处,就是可以使其他程序员根据类的名称,⼤概判断出这个类是要⼲什么的)。当然了,我这次做⾃⼰项⽬的时候,所写的数据库访问类就没有我上次看周⾦桥⽼师的书,然后模仿写的数据库访问类那么的复杂了()。当然了,我这⾥的数据库访问类,主要还是为了简介,和易⽤,只要满⾜我⾃⼰当前项⽬的需要就可以了,不是每做⼀个项⽬,都要写⼀个功能全⾯的数据库访问类。代码如下,请⼤家参考,更喜欢哪个访问类,⾃⼰可以根据⾃⼰⼝味,或者需要,直接⽤也可以:///

///创建⼀个SqlHelper的数据库访问通⽤类,完成对数据库的所有操作/// public class SqlHelper{ //定义数据库的连接字符串 private static readonly string connectionString = tionStrings["strConnectionString"].ConnectionString; /// /// 创建⽅法,完成对数据库的⾮查询的操作 /// /// sql语句 /// 传⼊的参数 /// public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters); string str = sql; return eNonQuery();

} } } ///

/// 完成查询的结果值 /// /// sql语句 /// 传⼊的参数数组 /// public static int ExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters); return 32( eScalar()); } } } /// /// 主要执⾏查询操作 /// /// 执⾏的sql语句 /// 参数数组 /// public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters);

SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); (dt); return dt; } } }}这样的类创建好以后,其他的需要访问数据库的类,就可以根据⾃⼰的需要,完成相应的增删改查的操作了。还是⽤⼀段代码来演⽰吧:///

///NewsDALL 的摘要说明/// 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 = eNonQuery(sql, new SqlParameter("@name", sName), new SqlParameter("@author",sAuthor),new SqlParameter("@time", Time), new SqlParameter("@content return nResult; } //执⾏数据库的删除操作 public int DeleteNew(int id) { string sql = "delete from News where id=@id"; int nResult = eNonQuery(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 = eNonQuery(sql, new SqlParameter("@name", sName), new SqlParameter("@time", Time), new SqlParameter("@content", sContent)); return nResult; } //执⾏数据库的查询操作 public NewsModel GetNewsModel(int id)//声明⼀次从数据库中读取新闻的条数 { string sql = "select * from News where id=@id"; DataTable dt = eDataTable(sql, new SqlParameter("@id", id)); if ( <= 0) { return null; } else if ( == 1) { NewsModel newModel = new NewsModel(); DataRow dr = [0]; sName = dr["name"].ToString(); sAuthor = dr["author"].ToString(); Time = dr["time"].ToString(); sContent = dr["content"].ToString(); = (int)dr["sort"]; return newModel; } else { throw new Exception("出现异常!"); } }}这⾥的这个NewsDALL类,主要是来完成有关新闻需要对数据库的各种操作,当然了,这只是这个类的⼀部分,主要是来演⽰NewsDALL类怎样调⽤SqlHelper类中的⽅法,来完成对数据库的操作的。3)接下来就是最后⼀层,业务逻辑层了。业务逻辑层的话主要来处理视图层和数据库访问层之间的关系的。当然了,也可以直接在视图层调⽤数据库访问层,但是对于关系来说可能会增加复杂性,所以前辈们就专门的抽象出来⼀个业务逻辑层,把所有的业务逻辑关系都在这⼀层处理清楚之后再,访问数据库访问层,进⾏对数据的操作。(当然这是我⾃⼰的理解,如果有什么不对的话,请⼤家指正)在我这次的项⽬中,貌似我的这⼀层完全是多余的,因为不需要什么太多的业务逻辑的处理,可以完全在视图层直接访问数据库访问层的。还是使⽤代码说话吧,当然这个仍然是NewsBLL类代码的⼀部分:/// ///业务逻辑层主要处理视图层和数据库访问直接的关系/// public class NewsBLL{ //完成对数据库的添加 public static int AddNew(NewsModel model) { NewsDALL newDALL = new NewsDALL(); return s(model); } //完成对数据的删除 public static int DeleteNew(int i) { NewsDALL newDALL = new NewsDALL(); return New(i); }

//返回⼀个新闻分类的对象 public static NewsModel GetModel(int intSort) { NewsModel model = new NewsModel(); if (intSort == 1) { Sort1 = "学院新闻"; Sort2 = ""; Sort3 = ""; } else if (intSort == 2) { Sort1 = "公告通知"; Sort2 = ""; Sort3 = ""; } .......... return model; }}接下来就是在视图层来通过访问,业务逻辑层来和实体层,来玩成所需要的数据操作了。还是使⽤代码来描述吧,这个代码主要来完成对数据进⾏添加:public void InsertData() { NewsModel newModel = new NewsModel(); sName = ; sAuthor = ; Time = ; sContent = code(); =32( ng()); //NewsBLL newBLL = new NewsBLL(); int nResult= (newModel); if (nResult != 0) { (""); } else { (""); } }我以前⾃⼰做的图,被⼤家指出了很多的错误。所以,我就引⽤了⽹络上的⼀个图⽚来解释(如果侵害了您的版权,请您联系我)据我⾃⼰的理解,三层架构可以算是⼀个团队项⽬开发的基本框架,在这个框架的基础上可以满⾜⼀些设计模式的需要。当然可以满⾜模块开发的需要。总结:对于我这次的开发项⽬来说,收获还是很多的,以前仅仅是知道有三层架构这个东西,也看书,照着别⼈的代码写过,但是却不能体会到这其中的真正意义。优点:①使代码的重⽤更加的⾼了,不需要像以前做项⽬,每次在⼀个页⾯反复的编写操作数据库的代码,⽽使⽤三层架构的话,只需要把注意⼒放在业务逻辑层 的业务逻辑的处理和数据库访问层的sql语句的编写。 ②代码的整洁性,和易⽤性更加的⾼了。因为不同的操作都分别放在了不同的层,所以代码逻辑更加清晰,如果做好注释的话,别⼈能够更加清楚的理解 编写者的意图。 ③可扩展型更加的⾼了,根据需要在不同的层编写代码,然后调⽤就可以了。 ④⾮常利于团队开发。当然了,三层架构的有点不仅仅有这些,不然也不会成为现在企业开发的基本框架,这只不过是我在开发中明显的发现的优点,拿出来跟⼤家分享⼀下。缺点:①就是性能上肯定⽐以前直接在相应的页⾯编写数据库操作代码上有点降低。但是这个完全是可以接受的,况且,对于我现在的⽔平就是代码质量上可定还 有待提⾼,有更⼤的优化空间。 ②就是在我的项⽬中,我觉得最⼤的浪费就是可以在视图层直接访问数据库访问层,因为要处理的业务逻辑实在是不多,所以还是有点代码冗余吧。所以, 以后还是要跟据⾃⼰项⽬的需要,来灵活的使⽤,不⼀定要按照规定必须这样做。这仅仅是我的⼀点拙见,有什么地⽅错误,请⼤家积极指正。也欢迎⼤家跟我交流。

2023年6月21日发(作者:)

【开发】.NET三层架构简单解析这篇⽂章本来应该很早就写出来的,但是⼀直苦于⾃⼰的精神能⼒有限,⽽且已经到了我们学校的考试周,所以时间上还是有点紧迫。关键的⼀点就是,找不到合理的思路来写,思路没有的话,就算是再好的素材,也写不来⼤家喜欢的⽂章。之前已经写过关于.NET三层架的两篇⽂章了,⼀篇是和。如果⼤家有兴趣的话,可以去读⼀读。当然了,这两篇⽂章的内容,⼤部分都不是⾃⼰的,⾃⼰也是看了别⼈的博⽂,然后⾃⼰总结⼀下,拿过来⾃⼰⽤罢了。这次的⽂章主要是⾃⼰亲⾃使⽤这些知识做了⼀个项⽬(我们学校资环学院的院⽹站),然后拿出来跟⼤家分享⼀下。也不要期望博主能够写出多么有⽔平的⽂章,我还是学⽣(⼤三),我也是在学习的过程中,写博客之不过是想记录⾃⼰学习过程中的点滴和记录⾃⼰的进步,如果能够顺便的帮助别⼈学习就更好了。同时也希望⼤家能够多给我提意见。⾮常感谢 @ ,@,@ 等博友给我提出的宝贵的修改意见。也希望⼤家在阅读本博⽂的时候,如果有什么问题,或者疑问及时的给我留⾔沟通,⼤家⼀起探讨。----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------对于三层架构来说,主要是使⽤设计模式的思想,对于项⽬的各个模块实现"⾼内聚,低耦合"的思想。这⾥就不做详细的介绍了,如果⼤家有兴趣,可以阅读软件⼯程和设计模式相关⽂章。对于三层架构来说,就是使⽤类,把我们在做项⽬的过程中,可能需要反复操作数据库,反复的使⽤某个⽅法等等,可能就是操作的参数不同。如果我们如果在每次使⽤的时候,都去编写相应的代码,⽆疑会增加程序员的负担。所以,为了增加⽅法的重⽤,就把这些能够重⽤的⽅法抽象成类,以供程序员在其它地⽅可以调⽤。当然了,这也是⾯向对象的⼀部分。其中的三层所指的就是:①视图层(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 StrNewsName16 {17 get { return strNewsName; }18 set { strNewsName = value; }19 }20

21 }这⾥的NewsModel就是⼀个关于新闻的实体类,其中声明了两个private的属性字段(⼀定要是private,防⽌⾮法赋值),使⽤public的构造函数,可以在外部给字段赋值。下⾯的就是在视图层来实例化对象,根据需要来给字段赋值,看下⾯的⼀段代码:NewsModel newModel = new NewsModel(); sName = ;

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

2)数据库访问层数据库库访问层,顾名思义,就是主要来完成对数据库的访问,等⼀系类的对数据库操作的类。为什么要单独的把对数据库的操作抽象成⼀个单独的类,我个⼈理解是因为在整个项⽬的开发过程中,不仅仅需要⼀次访问数据库,⽽是需要多次,如果每次都编写数据库访问代码的话,会增加程序员的个⼈⼯作量,⽽且对于代码的易⽤性和简洁性来说肯定是⾮常糟糕的。当然来可能还有其它的⼀些优点,我暂时还没有发现。既然是对数据库的操作类,⽽且对数据库的操作,⽆⾮就是四种:增删改查。所以⼀个能提供增删改查的通⽤类是必不可少的。这就是我们经常所说的,通⽤数据库访问类(很多的程序员都喜欢把这个类命名为SqlHelper,既然是名字,都是可以随意起的,只要不违反C#语法命名规范,当然这样命名也是有好处,就是可以使其他程序员根据类的名称,⼤概判断出这个类是要⼲什么的)。当然了,我这次做⾃⼰项⽬的时候,所写的数据库访问类就没有我上次看周⾦桥⽼师的书,然后模仿写的数据库访问类那么的复杂了()。当然了,我这⾥的数据库访问类,主要还是为了简介,和易⽤,只要满⾜我⾃⼰当前项⽬的需要就可以了,不是每做⼀个项⽬,都要写⼀个功能全⾯的数据库访问类。代码如下,请⼤家参考,更喜欢哪个访问类,⾃⼰可以根据⾃⼰⼝味,或者需要,直接⽤也可以:///

///创建⼀个SqlHelper的数据库访问通⽤类,完成对数据库的所有操作/// public class SqlHelper{ //定义数据库的连接字符串 private static readonly string connectionString = tionStrings["strConnectionString"].ConnectionString; /// /// 创建⽅法,完成对数据库的⾮查询的操作 /// /// sql语句 /// 传⼊的参数 /// public static int ExecuteNonQuery(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters); string str = sql; return eNonQuery();

} } } ///

/// 完成查询的结果值 /// /// sql语句 /// 传⼊的参数数组 /// public static int ExecuteScalar(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters); return 32( eScalar()); } } } /// /// 主要执⾏查询操作 /// /// 执⾏的sql语句 /// 参数数组 /// public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters) { using (SqlConnection con = new SqlConnection(connectionString)) { (); using (SqlCommand cmd = Command()) { dText = sql; ge(parameters);

SqlDataAdapter adapter = new SqlDataAdapter(cmd); DataTable dt = new DataTable(); (dt); return dt; } } }}这样的类创建好以后,其他的需要访问数据库的类,就可以根据⾃⼰的需要,完成相应的增删改查的操作了。还是⽤⼀段代码来演⽰吧:///

///NewsDALL 的摘要说明/// 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 = eNonQuery(sql, new SqlParameter("@name", sName), new SqlParameter("@author",sAuthor),new SqlParameter("@time", Time), new SqlParameter("@content return nResult; } //执⾏数据库的删除操作 public int DeleteNew(int id) { string sql = "delete from News where id=@id"; int nResult = eNonQuery(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 = eNonQuery(sql, new SqlParameter("@name", sName), new SqlParameter("@time", Time), new SqlParameter("@content", sContent)); return nResult; } //执⾏数据库的查询操作 public NewsModel GetNewsModel(int id)//声明⼀次从数据库中读取新闻的条数 { string sql = "select * from News where id=@id"; DataTable dt = eDataTable(sql, new SqlParameter("@id", id)); if ( <= 0) { return null; } else if ( == 1) { NewsModel newModel = new NewsModel(); DataRow dr = [0]; sName = dr["name"].ToString(); sAuthor = dr["author"].ToString(); Time = dr["time"].ToString(); sContent = dr["content"].ToString(); = (int)dr["sort"]; return newModel; } else { throw new Exception("出现异常!"); } }}这⾥的这个NewsDALL类,主要是来完成有关新闻需要对数据库的各种操作,当然了,这只是这个类的⼀部分,主要是来演⽰NewsDALL类怎样调⽤SqlHelper类中的⽅法,来完成对数据库的操作的。3)接下来就是最后⼀层,业务逻辑层了。业务逻辑层的话主要来处理视图层和数据库访问层之间的关系的。当然了,也可以直接在视图层调⽤数据库访问层,但是对于关系来说可能会增加复杂性,所以前辈们就专门的抽象出来⼀个业务逻辑层,把所有的业务逻辑关系都在这⼀层处理清楚之后再,访问数据库访问层,进⾏对数据的操作。(当然这是我⾃⼰的理解,如果有什么不对的话,请⼤家指正)在我这次的项⽬中,貌似我的这⼀层完全是多余的,因为不需要什么太多的业务逻辑的处理,可以完全在视图层直接访问数据库访问层的。还是使⽤代码说话吧,当然这个仍然是NewsBLL类代码的⼀部分:/// ///业务逻辑层主要处理视图层和数据库访问直接的关系/// public class NewsBLL{ //完成对数据库的添加 public static int AddNew(NewsModel model) { NewsDALL newDALL = new NewsDALL(); return s(model); } //完成对数据的删除 public static int DeleteNew(int i) { NewsDALL newDALL = new NewsDALL(); return New(i); }

//返回⼀个新闻分类的对象 public static NewsModel GetModel(int intSort) { NewsModel model = new NewsModel(); if (intSort == 1) { Sort1 = "学院新闻"; Sort2 = ""; Sort3 = ""; } else if (intSort == 2) { Sort1 = "公告通知"; Sort2 = ""; Sort3 = ""; } .......... return model; }}接下来就是在视图层来通过访问,业务逻辑层来和实体层,来玩成所需要的数据操作了。还是使⽤代码来描述吧,这个代码主要来完成对数据进⾏添加:public void InsertData() { NewsModel newModel = new NewsModel(); sName = ; sAuthor = ; Time = ; sContent = code(); =32( ng()); //NewsBLL newBLL = new NewsBLL(); int nResult= (newModel); if (nResult != 0) { (""); } else { (""); } }我以前⾃⼰做的图,被⼤家指出了很多的错误。所以,我就引⽤了⽹络上的⼀个图⽚来解释(如果侵害了您的版权,请您联系我)据我⾃⼰的理解,三层架构可以算是⼀个团队项⽬开发的基本框架,在这个框架的基础上可以满⾜⼀些设计模式的需要。当然可以满⾜模块开发的需要。总结:对于我这次的开发项⽬来说,收获还是很多的,以前仅仅是知道有三层架构这个东西,也看书,照着别⼈的代码写过,但是却不能体会到这其中的真正意义。优点:①使代码的重⽤更加的⾼了,不需要像以前做项⽬,每次在⼀个页⾯反复的编写操作数据库的代码,⽽使⽤三层架构的话,只需要把注意⼒放在业务逻辑层 的业务逻辑的处理和数据库访问层的sql语句的编写。 ②代码的整洁性,和易⽤性更加的⾼了。因为不同的操作都分别放在了不同的层,所以代码逻辑更加清晰,如果做好注释的话,别⼈能够更加清楚的理解 编写者的意图。 ③可扩展型更加的⾼了,根据需要在不同的层编写代码,然后调⽤就可以了。 ④⾮常利于团队开发。当然了,三层架构的有点不仅仅有这些,不然也不会成为现在企业开发的基本框架,这只不过是我在开发中明显的发现的优点,拿出来跟⼤家分享⼀下。缺点:①就是性能上肯定⽐以前直接在相应的页⾯编写数据库操作代码上有点降低。但是这个完全是可以接受的,况且,对于我现在的⽔平就是代码质量上可定还 有待提⾼,有更⼤的优化空间。 ②就是在我的项⽬中,我觉得最⼤的浪费就是可以在视图层直接访问数据库访问层,因为要处理的业务逻辑实在是不多,所以还是有点代码冗余吧。所以, 以后还是要跟据⾃⼰项⽬的需要,来灵活的使⽤,不⼀定要按照规定必须这样做。这仅仅是我的⼀点拙见,有什么地⽅错误,请⼤家积极指正。也欢迎⼤家跟我交流。