浅谈三层结构

来源:互联网 发布:ipv6网络设计 编辑:程序博客网 时间:2024/05/21 06:39

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

一:什么是三层结构;

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

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

    为什么要使用三层结构,它有那些优势?.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; }    }}






 

0 0
原创粉丝点击