软件架构风格之三层架构

一、前言

  软件架构风格(模式)为开发者提供了一套组织和管理代码的指导原则,以提高软件的可维护性、可扩展性、可重用性和可测试性。三层架构是早期比较流行架构风格,通过分层的思想对系统划分成表示层(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应用、客户端应用都是适应的。

posted @   tuqunfu  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示