浅谈三层架构

来源:互联网 发布:网络平台服务许可 编辑:程序博客网 时间:2024/05/21 21:37

1、三层结构开发模式   

    三层结构式基于模块化程序设计的思想,为实现分解应用程序的需求,而逐渐形成的一种标准模式的模块划分方法。

 

2、为什么要用三层结构

    个人理解:采用分层增强了类和类之间的独立性,在团队合作开发的过程中能大大提高了开发的速率;在后期的维护工作中更容易;在程序员写代码的过程中,不会因为某个小小的需求的改变而大整整个系统模块,只需要改有问题的那一层就好了,比如说当数据库要改变的时候,只需要调整数据库就好了,不需 要重新开发,只做一些简单的调整即可。但是三层也有缺点就是执行速度不够快,所以说并不是所有的系统都要用三层架构去实现。

 

3、三层架构分类

     三层架构划分为表现层(UI,user interface)、业务逻辑层(BLL,Business Logic Layer)、数据访问层(DAL,Data Access Layer),这样有利于系统的开发、维护、部署,实现了“高内聚,低耦合”。采用分层方法,把问题划分开一个一个解决,易于控制,易于延展,易于分配资源。

 

4、三层结构的概念以及之间的关系

 

概念

表示层位于最上层,用于显示和接收用户提交的数据,为用户提供交互式的界面。表示层一般为Windows窗体应用程序或Web应用程序。

业务逻辑层是表示层和数据访问层之间沟通的桥梁,主要负责数据的传递和处理。

数据访问层主要实现对数据的读取、保存和更新等操作。

 

关系 

下图是各层的工作流程

    在三层结构中,各层之间相互依赖,表示层依赖于业务逻辑层,业务逻辑层依赖于数据访问层。

 

5、如何搭建三层结构?

    

    创建

     打开VS2012,新建一个解决方案,新建一个类库LoginSolution,命名为LoginDAL,如下图

 

添加一个类库,业务逻辑层

 

 

    创建一个WinForm窗体,UI表示层

 

 

代码

 Model层

namespace MyBookShop.Models{    public class User    {        public User() { }        //编号属性        public int id;        public int Id        {            //属性id的get和set方法            get { return id; }            set { id = value; }        }        //登录名属性        private string loginId;        //属性loginId的get和set方法        public string LoginId        {            get { return loginId; }            set { loginId = value; }        }                //密码属性        private string loginPwd;        //loginPwd属性的get和set方法        public string LoginPwd        {            get { return loginPwd; }            set { loginPwd = value; }        }        //姓名属性        private string name;        //属性name的get和set方法        public string Name        {            get { return name; }            set { name = value; }        }    }}


 

 

业务逻辑层BLL

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using MyBookShop.DAL;using MyBookShop.BLL;using MyBookShop.Models;namespace MyBookShop.BLL{    public class UserManager    {        //登录验证        public static bool Login(string loginId, string loginPwd, out User validUser)        {            User user = UserService.GetUserByLoginId(loginId);                       //没有该用户信息            if (user == null)            {                validUser = null;                return false;            }            //密码正确            if (user.LoginPwd == loginPwd)            {                validUser = user;                return true;            }                //密码错误            else            {                validUser = null;                return false;            }        }    }}


 

 

数据访问层DAL

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data;using System.Data.SqlClient;namespace MyBookShop.DAL{    public class UserService    {        //根据登录名查询用户信息        public static User GetUserByLoginId(string LoginId)        {            string sql = "select * from Users where LoginId=@LoginId";            using (SqlDataReader reader = DBHelper.GetReader(sql, new SqlParameter("@LoginId", LoginId)))            {                if (reader.Read())                {                    //找到该用户信息后,将其保存到User对象中,并返回该对象                    User user = new User();                    user.id = (int)reader["Id"];                    user.LoginId = (string)reader["LoginId"];                    user.LoginPwd = (string)reader["LoginPwd"];                    reader.Close();                    return user;                }                else                {                    reader.Close();                    //未找到该用户,返回null                    return null;                }            }        }    }}


 

 表示层UI

  界面

namespace LoginUI{    public partial class Form1 : Form    {        public Form1()        {            InitializeComponent();        }        private void btnLogin_Click(object sender, EventArgs e)        {            string userName = txtUserName.Text.Trim();            string password=txtPassword .Text;            Login.BLL.UserManager mgr = new Login.BLL.UserManager();            Login.Model .User user=mgr.UserLogin(userName, password);            MessageBox.Show("登录用户:" + user.UserName);        }    }}

 

 

 

6、实体类

 把数据表或其它持久化数据的格式映射成的类,就是实体类。

   对实体类的理解:

1)与数据库里面表做对应,一个实体类对应一张表,这样与数据库交互时就可以一一对应,对数据库进行操作

2)把常用的字段封装到一起,为我们在关系数据库和对象之间架起一座桥梁

3)避免U层,B层,D层互相引用,交叉引用

4)实体类用来传输数据的业务数据模型

5)实体类不用知道其他三层的存在