软件架构风格之三层架构
一、前言
软件架构风格(模式)为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性、可扩展性、可重用性和可测试性。三层架构是早期比较流行架构风格,通过分层的思想对系统划分成表示层(UI)、业务逻辑层(BLL)和数据访问层(DAL),其中表示层指负责用户界面和用户交互,是用户直接接触的部分,在早期前端是非前后端分离形式,所以用户层是用户和系统的交互层比如aspx/jsp/php等;业务逻辑层指处理业务规则和业务逻辑,是应用程序的核心部分。它负责数据的处理、验证、计算等业务操作,该层将用户的请求数据、查询数据传输至逻辑层,逻辑层对请求进行业务逻辑的处理;数据访问层指负责与数据库的交互,包括数据的CRUD(创建、读取、更新、删除)操作,该层职责比较明确、方法也比较明确,包括增删改查加上多表复杂查询处理,逻辑层调用数据访问层完成数据操作。
二、实践
通过使用asp.net webform的项目完整的实践一个标准的三层架构,基于学生选课系统的简单业务描述各个层次的编码、关系、类库的引用。其在VS的解决方案如下所示:
1、DAL(数据访问层)类库中包含数据表处理的DAL类或者其他的数据处理类,一般会依据表设计DAL,如上述的StudentDAL。
namespace DAL { /// <summary> /// 学生数据访问类 /// </summary> public class StudentDAL { /// <summary> /// /// </summary> /// <returns></returns> public List<Student> GetStudents() { List <Student> students = new List<Student>(); string selectSql = string.Format("select * from dbo.student"); try { DataTable dataTable = Utils.SqlHelper.ExcuteTable(selectSql); DataRow[] drs = dataTable.Select(); for (var i = 0; i < drs.Length; i++) { Student temp = new Student(); temp.Id = Convert.ToInt32(drs[i]["Id"]); temp.Name = drs[i]["Name"].ToString(); temp.Email = drs[i]["Email"].ToString(); temp.Status = Convert.ToInt32(drs[i]["Status"]); temp.Phone = drs[i]["Phone"].ToString(); temp.Gender = drs[i]["Gender"].ToString(); temp.Password = drs[i]["Password"].ToString(); students.Add(temp); } } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } return students; } } }
2、BLL(业务逻辑层)类库中包含各个业务逻辑处理BLL类,通过表、实体、业务边界进行划分类,类中封装其数据的处理、验证和计算,并且该类库对DAL进行引用。如下对Student的业务处理。
namespace BLL { /// <summary> /// 学生业务逻辑层 /// </summary> public class StudentBLL { /// <summary> /// 数据访问层 /// </summary> private readonly static StudentDAL studentDAL = new StudentDAL(); /// <summary> /// /// </summary> /// <returns></returns> public List<Student> GetStudentList() { List<Student> students = studentDAL.GetStudents(); return students; } } }
3、UI(界面层)对用户的交互界面的设计,如用户的数据提交、获取、事件的响应等,如上UI层是一个asp.net webform的web项目,包括aspx页面,前端静态资源,并且引用BLL层。
namespace Three_Architecture.Demo { /// <summary> /// 学生界面层 /// </summary> public partial class Student : System.Web.UI.Page { /// <summary> /// 学生业务逻辑层 /// </summary> private readonly static StudentBLL studentBLL = new StudentBLL(); /// <summary> /// 加载初始化 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // 第一次执行 } List<Model.Student> students = studentBLL.GetStudentList(); this.DataGrid1.DataSource = students; this.DataGrid1.DataBind(); } /// <summary> /// 取消操作 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void DataGrid1_CancelCommand(object sender, DataGridCommandEventArgs e) { string ID = e.Item.Cells[0].Text; } /// <summary> /// 编辑列表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void DataGrid1_EditCommand(object sender, DataGridCommandEventArgs e) { string ID = e.Item.Cells[0].Text; } /// <summary> /// 保存列表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void DataGrid1_UpdateCommand(object sender, DataGridCommandEventArgs e) { string ID = e.Item.Cells[0].Text; } /// <summary> /// 删除列表 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> public void DataGrid1_DeleteCommand(object sender, DataGridCommandEventArgs e) { string ID = e.Item.Cells[0].Text; } } }
通过上述三层完成了由用户交互->业务逻辑的处理->数据访问管理,达到了构建清晰、可维护、可扩展的系统的目的。除上述三层外,对于三层内数据流转定义公共模型层,管理业务实体、转换实体等数据被三层引用,Util类库是公共工具类,提供公共的帮助方法如SQL帮助类、时间帮助类、序列化帮助类和各个扩展类。
三、总结
三层架构是比较简单的架构风格,是一种经典的软件架构,其按照三层划分方式更多从代码结构层面反映,构建清晰的层次关系。三层架构不仅仅在WEB应用、客户端应用都是适应的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?