心得经验总结:浅谈三层架构

简介: 心得经验总结:浅谈三层架构

三层架构并不是MVC,MVC是一个很早就有的经典的程序设计模式,M-V-C分为三层,M(Model)-V(View)-C(Control)。而web开发中的三层架构是指:数据访问层(DAL-DatabaseAccessLayer),业务逻辑层(BLL-BusinessLoginLayer),以及用户界面层(UI-UserInterface,实际就是网页后台的具体调用BLL层)。这个是基本概念。曾经我以为三层架构就是在AppCode中,分为三个大类与若干小类,各司其职。在经过一番洗礼后,才发觉多么的无知。

首先AppCode中,放的是通用类,如数据库通用类,实现数据库连接,基本的SqlCommand创建,自定义CRUD的方法等,与三层架构毫无关系,就是常用的开发模式中存放类(Class)的文件夹。

其次,当使用三层架构时,一定是在大项目中,因为三层架构的目的是提高项目的松散性和降低项目的耦合度,使之更容易扩展或者维护。小项目使用了三层架构,由于过度的在意分层而导致了项目的复杂度增加。

创建三层架构的应用程序。我们必须对这三层分别创建不同的类库(ClassLibrary),而不是普通的类(Class)。我们对于任何一个模块或者功能进行OOP,把它扩展为对象(面向对象的思想就是:将所操作的目标当成一个对象,对它进行的操作,将由对象自己的方法进行,而非外界传参。譬如注册用户,用面向过程的方法事先,就是:public static bool Register(string userName, string userPwd)。若用OO的思想,我们不可将账号密码作为参数传入,而是将用户作为一个对象,这个对象具有private _userName,和private _userPwd的属性。在注册时,用构造函数初始化一个新的对象,User one = new User(userName,userPwd),使之在初始化后具有这两个字段的值。然后调用User类中的public static bool Register()方法(注意这个方法是不进行传参的),而在这个Register方法中,使用对象的_userName和_userPwd属性进行注册。),那么,我们在这个对象中的任何操作都将以该对象的方法(函数)实现。

在进行三层分类时,这样新建类库。

1.文件->新建项目->其他项目类型->空白解决方案。

2.在右侧的“资源管理器”中,选中当前解决方案,右键添加->新建项目->类库(ClassLibrary),分别创建BLL,DAL,UL类库。(若添加后看不到解决方案则在菜单->工具->选项->项目和解决方案->总是显示解决方案)。

3.右键,向解决方案中添加一个网站(新网站或者现有网站)。

4.根据需求删除或者保留默认添加项(默认的class1.cs或Default.aspx文件)。

这样一个三层架构的网站雏形就搭建好了。因为UI层要被其他两层引用,DAL层要被BLL层引用。所以需要相互添加引用,方法是在类库上点击右键->添加引用->项目->选择其他类库。并且在具体类中引入命名空间(using namespace)。

ps:类库其实就是类的集合,三层架构的目的就是,将同一项目的不同模块都划分为各自的三层,各司其职,将具体实现方法用类写出,添加到该层的类库中,这样,一个网站下的类库就只有三层,每一层中都包含了各个模块相对应层的实现方法。在以后修改或扩展时,在对应层中进行操作就可以了。

一般的项目,涉及最多的就是对数据库的CRUD,DAL层只负责与数据库的交互,BLL层是最重要的一层,他负责将DAL层的的结果呈现给UI层,但是恰恰BLL层的存在似乎有点鸡肋,他起到的仅仅是转发DAL层数据的作用,而具体的逻辑操作是与数据库的交互,应该写在DAL层,这就好像BLL层是在重复DAL层的劳动一样,其实BLL层的作用在于除了调用DAL层访问数据库,还可以进行逻辑判断,当符合的时候,才进行允许进行DAL的操作,或者进行额外的操作(如加密,转换等)。而DAL层可不管这些,他只管进行CRUD的动作。UI层就是操作抽象出来的实体对象,它包含了各种属性。

一个三层架构的小例子:注册新用户。

先写模块的实体类,是数据库中表的抽象,假设数据库中注册信息只有账号,密码两个字段。那么抽象到实体类就是这样:

【c-sharp】 view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Entity

{

class UserInfo

{

public string UserName { get; set; } //C#3.0中属性构造器的新写法;

public string UserPwd { get; set; }

}

}

再写DAL层:

【c-sharp】 view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using System.Data.SqlClient;

using Entity; //这里添加对Entity实体类的引用;

namespace DAL

{

public class UserDAL

{

//在该类中,为了方便,一般会构造一个DataBaseFactory,方便进行代码的操作。所以以下代码仅为逻辑实现,不代表代码正确。

public bool AddUser(UserInfo uInfo) //这里将实体类作为参数传入;

{

string sqlStr="INSERT INTO UserInfo(Name,Pwd) VALUES(@name,@pwd)";

SqlCommand cmd=new SqlCommand(sqlStr);

cmd.Parameters.Clear();

cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = uInfo.UserName; //调用实体类的属性

cmd.Parameters.Add("@pwd", SqlDbType.NVarChar, 50).Value = uInfo.UserPwd;

return Convert.ToInt32(cmd.ExecuteNonQuery()) > 0 ? true : false;

}

public DataTable GetUserInfo(string name) //根据用户名获得用户的具体信息

{

string sqlStr="SELECT * FROM UserInfo WHERE Name=@name";

SqlCommand cmd=new SqlCommand(sqlStr);

cmd.Parameters.Clear();

cmd.Parameters.Add("@name", SqlDbType.NVarChar, 50).Value = name;

SqlDataAdapter sda = new SqlDataAdapter(cmd);

DataSet ds=new DataSet();

sda.Fill(ds,"UserInfo");

return ds.Tables【"UserInfo"】;

}

}

}

再写BLL层:

【c-sharp】 view plain copy

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Data;

using Entity; //添加对Entity类库的引用

using DAL; //添加对DAL类库的引用

namespace BLL

{

public class UserBLL

{

public static bool AddUser(UserInfo uInfo) //BLL层的方法多为静态方法,DAL层也可以为静态方法。

{

UserDAL uDal = new UserDAL();

DataTable dTable = uDal.GetUserInfo(uInfo.UserName);

if (dTable.Rows.Count > 0) //这里对注册用户有一个判断,从DAL层中先通过注册名获得用户的具体信息,若可以获得则证明该用户名已被注册,返回false;

//代码效果参考:http://www.zidongmutanji.com/zsjx/423467.html

return false;

else

return uDal.AddUser(uInfo);

}

}

}

最后构建UI层代码,即我们的aspx.cs页面代码,该层应该直接调用BLL层的方法。该页面引用BLL和Entity的命名空间,并向Button控件注册事件:

【c-sharp】 view plain copy

protected void btnRegister_OnClick(object sender, EventArgs e)

{

UserInfo uInfo = new UserInfo(textUserName.text, textUserPwd.text);

if (UserBLL.AddUser(uInfo))

Response.Write("注册成功!");

else

Response.Write("注册失败!");

}

这样一个小的三层架构程序就出来了。

这个程序中,操作的实体为UserInfo表的抽象。在DAL层进行了AddUser()的方法,在BLL层也进行了AddUser()的方法,唯一的区别是BLL层做了逻辑判断,如果用户名存在,则注册失败。

三层架构的特点:

1.数据库访问层(DAL)仅提供对数据库的CRUD操作,而不管操作后的结果,也不管逻辑过程(譬如同名用户,不合法用户名)。

2.业务逻辑层(BLL)不会直接与数据库交互,他与数据库的交互是通过DAL提供的方法。在调用这些方法前,要加入自己的逻辑判断或者业务处理。另外业务逻辑层(BLL)还有可能不会去调用DAL层的方法,而是进行其他业务处理。

3.用户界面层(UI)层是不会调用DAL层的,他只调用BLL层提供的方法,再由BLL层自己决定是否继续调用DAL层。

这个例子可以看出三层架构的优点就是结构清晰,容易扩展与维护。缺点就是,复杂。仅仅一个注册用户,就这么麻烦,所以对于小项目来说,费这么大劲换取一个相对较清晰的分层结构是不划算的。

相关文章
|
5天前
|
缓存 前端开发 安全
探索现代Web开发中的前端架构模式
【6月更文挑战第23天】随着互联网技术的飞速发展,前端架构在Web开发中扮演着越来越重要的角色。本文将深入探讨现代Web开发中使用的几种主流前端架构模式,包括单页面应用(SPA)、微前端架构和JAMStack等,并分析它们的优势与应用场景。通过实例演示,我们将看到如何根据项目需求选择合适的前端架构,以及如何利用这些架构模式提升开发效率和应用性能。
|
2天前
|
设计模式 前端开发 数据库连接
心得经验总结:浅谈三层架构
心得经验总结:浅谈三层架构
|
8月前
|
SQL 分布式计算 数据库
C#三十五 三层架构企业应用
C#三十五 三层架构企业应用
47 0
|
缓存 前端开发 JavaScript
前端领域驱动设计的一些思考
前端领域驱动设计的一些思考
655 0
|
9月前
|
开发者
由三层架构说起...
由三层架构说起...
29 0
|
11月前
|
数据库
|
11月前
|
前端开发
架构——MVC的升华
结合上篇说到 架构——MVC的理解 ,本次又被彻底洗礼了一次,通过量子化的思考方式、学习方式将mvc又重新做了梳理,又岂止是上了一个层次。
|
11月前
|
弹性计算 缓存 前端开发
前端(二)——软件设计的架构模式
前端(二)——软件设计的架构模式
102 0
|
设计模式 前端开发 Java
MVC和三层架构总结【动力节点老杜】
操作数据库的代码和业务逻辑混杂在一起,很容易出错。编写代码的时候很容易出错,无法专注业务逻辑的编写。
153 0
MVC和三层架构总结【动力节点老杜】
|
存储 消息中间件 缓存
还在搞三层架构?DDD 分层架构了解下!
DDD(Domain DrivenDesign,领域驱动设计)作为一种软件开发方法,它可以帮助我们设计高质量的软件模型。在正确实现的情况下,我们通过DDD完成的设计恰恰就是软件的工作方式。
216 0
还在搞三层架构?DDD 分层架构了解下!