欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

三层架构

程序员文章站 2022-03-14 10:14:12
...

在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构,这里的分层不是指物理分层,而是指逻辑

上的层次。分层的目的是为了实现“高内聚,低耦合”的思想。有利于系统后期的维护、更新或者移植。通常意义

上的三层架构就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层。每一层都职责明确。



三层架构

图片来自网络

概念简介

1.表现层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得。

2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理。

3.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、更新、查找等。

表示层

位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。

业务逻辑层

业务逻辑层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的

制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很

多时候,也将业务逻辑层称为领域层。例如Martin Fowler

Patterns of Enterprise Application Architecture》一书中,将整个架构分为三个主要的层:表示层、领域

层和数据源层。作为领域驱动设计的先驱Eric Evans,对业务逻辑层作了更细致地划分,细分为应用层与领域层,

通过分层进一步将领域逻辑与领域逻辑的解决方案分离。   业务逻辑层在体系架构中的位置很关键,它处于数

据访问层与表示层中间,起到了数据交换中承上启下的作用。由于层是一种弱耦合结构,层与层之间的依赖是向下

的,底层对于上层而言是无知的,改变上层的设计对于其调用的底层而言没有任何影响。如果在分层设计时,

遵循了面向接口设计的思想,那么这种向下的依赖也应该是一种弱依赖关系。因而在不改变接口定义的前提下,理

想的分层式架构,应该是一个支持可抽取、可替换的抽屉式架构。正因为如此,业务逻辑层的设计对于一个支

持可扩展的架构尤为关键,因为它扮演了两个不同的角色。对于数据访问层而言,它是调用者;对于表示层而言,

它却是被调用者。依赖与被依赖的关系都纠结在业务逻辑层上,如何实现依赖关系的解耦,则是除了实现业务逻辑

之外留给设计师的任务。 

数据层

数据访问层:有时候也称为是持久层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本

文档或是XML文档。

简单的说法就是实现对数据表的SelectInsertUpdateDelete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。

DAL层:

        /// <summary>
        /// 数据库连接字段
        /// </summary>
        static string sqlstr = ConfigurationManager.ConnectionStrings[""].ConnectionString;
        /// <summary>
        /// 执行查询语句
        /// </summary>
        /// <param name="command">查询语句</param>
        /// <returns></returns>
        public static int happ(string command)
        {
            SqlConnection conn = new SqlConnection(sqlstr);
            SqlCommand comm = new SqlCommand(command,conn);
            int result = 0;
            try
            {
                conn.Open();
                result=comm.ExecuteNonQuery();
            }
            catch
            {
                throw;
            }
            finally
            {
                if (conn.State==ConnectionState.Open)
                {
                    conn.Close();
                }
            }
            return result;
        }
        /// <summary>
        /// 执行非查询语句
        /// </summary>
        /// <param name="select">增删改语句</param>
        /// <returns></returns>
        public static DataTable sda(string select)
        {
            SqlDataAdapter sda = new SqlDataAdapter(select,sqlstr);
            DataTable dt = new DataTable();
            sda.Fill(dt);
            return dt;
        }

BLL层:

        /// <summary>
        /// 获取指定学生的成绩
        /// </summary>
        /// <param name="id">学号</param>
        /// <returns></returns>
        public static List<Marks> getMarks(int id)
        {
            return MarksService.getMarks(id);
        }

        /// <summary>
        /// 获取全部成绩
        /// </summary>
        /// <returns></returns>
        public static List<Marks> getMarks()
        {
            return MarksService.getMarks();
        }

        /// <summary>
        /// 添加成绩
        /// </summary>
        /// <param name="mark">成绩</param>
        /// <returns></returns>
        public static bool addMarks(Marks mark)
        {
            return MarksService.addMarks(mark);
        }

        /// <summary>
        /// 修改成绩
        /// </summary>
        /// <param name="mark">成绩</param>
        /// <returns></returns>
        public static bool updateMarks(Marks mark)
        {
            return MarksService.updateMarks(mark);
        }

        /// <summary>
        /// 删除成绩
        /// </summary>
        /// <param name="mark"></param>
        /// <returns></returns>
        public static bool deleteMarks(Marks mark)
        {
            return MarksService.deleteMarks(mark);
        }

MODEL层:

 private int sid;

        /// <summary>
        /// 学号
        /// </summary>
        public int Sid
        {
            get { return sid; }
            set { sid = value; }
        }

        private string name;

        /// <summary>
        /// 姓名
        /// </summary>
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private string sex;

        /// <summary>
        /// 性别
        /// </summary>
        public string Sex
        {
            get { return sex; }
            set { sex = value; }
        }

优点

1、开发人员可以只关注整个结构中的其中某一层;  

2、可以很容易的用新的实现来替换原有层次的实现;   

3、可以降低层与层之间的依赖;   

4、有利于标准化;   

5、利于各层逻辑的复用。