浅谈三层架构

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)实体类不用知道其他三层的存在

 

 

评论 50
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值