浅谈三层结构

    最近在学习三层结构,将所学的知识总结如下。

一:什么是三层结构;

    所谓的三层开发就是将整个业务应用划分为表示层-业务逻辑层―数据访问层-数据库等,有的还要细一些,明确地将客户端的表示层、业务逻辑访问、和数据访问及数据库访问划分出来,十分有利于系统的开发,维护、部署和扩展。

二:为什么要使用三层结构,即使用三层结构的好处;

    为什么要使用三层结构,它有那些优势?.net平台为我们提供强大的技术支持,通过code behind的强大支持,可以将页面设计和代码设计进行有效的分离,看起来非常清晰,也没有什么不好的。但是这种情况对于简单的应用来说,结构简单,代码清晰,这种一层结构开发就完全够了,没有必要使用分层结构。但是对于复杂的系统而言,如果不使用分层结构,将带来很大的麻烦。比如:在开发过程中会用到大量的重复或是相似的代码,导致代码冗长。一个很小的业务更改就有可能导致整个系统的大修,不利于修改。更为重要的是没有很好的利用面向对象的编程思想,是利用面向对象幌子走得确是面向过程的老路,不利于并行开发。

三:三层简介及其结构关系图

    三层及作用:

    1:显示层(UI):向用户展现特定业务数据,采集用户的输入信息和操作;

    2:业务逻辑层(BLL):从DAL中获取数据,以供UI层显示,从UI层获取用户指令和数据,执行业务逻辑,从UI层中获取用户指令和数据,通过DAL写入数据库;

    3:数据访问层(DAL):从数据源加载数据(select),向数据源写入数据(insert/update),从数据源中删除数据(delete);

 

四:小的实例

用单层结构和三层结构分别实现简单的登录。

单层结构:

using System;
using System.Data.SqlClient;
using System.Windows.Forms;

namespace Login
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_submit_Click(object sender, EventArgs e)
        {
            string userName = txt_name.Text.ToString().Trim();
            string password = txt_pwd.Text.Trim();
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = " Server=.;DataBase =DB_text;user Id=sa; Password=123456; ";
            string selectstring = "select * from T_Login where UserName = '" + userName + "'";
            SqlCommand cmd = new SqlCommand(selectstring, conn);
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                if (dr[2].ToString().Trim() == password)
                {
                    MessageBox.Show("登录成功!");
                }
                else
                {
                    MessageBox.Show("密码错误!");
                }
            }
            else
            {
                MessageBox.Show("用户名错误!");
            }
            dr.Close();
            conn.Close();

        }
    }
}


三层结构:

UI层代码:

using System;
using System.Windows.Forms;

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btn_submit_Click(object sender, EventArgs e)
        {
            string userName = txt_name.Text.ToString().Trim();
            string password = txt_pwd.Text.ToString().Trim();
            LoginBLL.UserManager umg = new LoginBLL.UserManager();
            UserModel.UserInfo user = umg.userLogin(userName,password);
            if (user != null) //不知道这段代码写在这里是否合适???
            {
                if(user.password == password)
                    MessageBox.Show("登录成功!");
                else
                    MessageBox.Show("密码错误!");
            }
            else
                MessageBox.Show("用户名错误!");
        }
    }
}

BLL层代码:

namespace LoginBLL
{
    public class UserManager
    {
        public UserModel.UserInfo userLogin(string userName, string password)
        {
            LoginDAL.UserDAO uDAO = new LoginDAL.UserDAO();
            UserModel.UserInfo user = uDAO.checkUser(userName,password);
            return user;//这里是将user直接返回给UI层,是不是可以在这里做个判断?
        }
    }
}

DAL层代码:

1:负责与数据库连接的连接字符串

namespace LoginDAL
{
    public class DBUtil
    {
        public static string connString = "Server=.;DataBase =DB_text;user Id=sa; Password=123456;";
    }
}

对数据库的操作:

using System.Data.SqlClient;

namespace LoginDAL
{
    public class UserDAO
    {
        public UserModel.UserInfo checkUser(string userName, string password)
        {
            UserModel.UserInfo user = null;
            SqlConnection conn = new SqlConnection();
            conn.ConnectionString = DBUtil.connString;
            string selectstring = "select * from T_Login where UserName = '"+userName+"'";
            SqlCommand cmd = new SqlCommand(selectstring, conn);
            conn.Open();
            SqlDataReader dr = cmd.ExecuteReader();
            if (dr.Read())
            {
                if(user==null)
                    user=new UserModel.UserInfo();
                user.name = dr.GetString(1);
                user.password = dr.GetString(2);
            }
            dr.Close();
            conn.Close();
            return user;
        }
    }
}

负责联系三层的数据模型:

namespace UserModel
{
    public class UserInfo
    {
        public string name { get; set; }
        public string password { get; set; }
    }
}






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值