三层架构

为什么使用三层架构?


1.目的是为了高内聚,低耦合的思想
2.可以很容易的使用新的实现来替换原有层次的实现
3.实际开发中开发人员只关注整个结构中的某一层

如何使用三层架构?

三层架构的使用跟项目的规模有关系,一般用于大型的项目中。在没有真正的数据存储时不需要使用。DAL、BLL、UI分别位于不同的程序集中。
DAL层

数据层。只提供基本的数据访问。从数据源中加载数据,向数据源写入数据,从数据源删除数据。也具备访问其他数据库的能力。

BLL层

业务层。负责处理业务逻辑,通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。

UI层

显示层。负责显示和采集用户操作。向用户展现特定的业务数据,采集用户的输入信息和操作。设计原则主要以用户为主。

三层架构的应用

Model实体类

namespace Login.Model
{
public class Userinfo//定义用户类及类的属性
{
    public int ID { get; set; }
    public string UserName { get; set; }
    public string PassWord { get; set; }
    public string Email { get; set; }
}
}

DAL层

namespace Login.DAL
{
    class Dbutil
{
    //定义了一个字符串来连接数据库
    public static string Connstring = @"Server=DESKTOP-MNRLSKH;Database=login;User ID=sa;Password=123456";
}
}

using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class UserDAO
{
    //引用了命名空间Login.Model,并建立Userinfo类的SelectUser方法
    public Login.Model.Userinfo SelectUser(string UserName,string passWord)
    {
        //实例化连接字符串conn
        using (SqlConnection conn = new SqlConnection(Dbutil.Connstring))
        {
            //创建一个命令对象,并添加命令
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "SELECT * FROM Users WHERE UserName=@UserName AND password=@Password";
            //声明该命令对象的执行形式是文本
            cmd.CommandType = CommandType.Text;
            //添加参数值,一个传参的过程
            cmd.Parameters.Add(new SqlParameter("@UserName", UserName));
            cmd.Parameters.Add(new SqlParameter("@PassWord", passWord));
            //打开连接
            conn.Open();
            SqlDataReader reader = cmd.ExecuteReader();//保存读取的数据
            Login.Model.Userinfo user = null;
            while (reader.Read())
            {
                if (user == null)//如果没有,重新生成一个
                {
                    user = new Login.Model.Userinfo();
                }
                //将读取的数据返回给User
                user.ID = reader.GetInt32(0);//转化为int类型数据
                user.UserName = reader.GetString(1);
                user.PassWord = reader.GetString(2);
                if (!reader.IsDBNull(3))//Email可以为空
                {
                    user.Email = reader.GetString(3);
                }
            }
            return user;
        }
    }
}
}

using System.Data;
using System.Data.SqlClient;
namespace Login.DAL
{
public class ScoreDAO
{
    public void UpdateScore(string userName,int value)
    {
        //设置连接数据库
        using (SqlConnection conn=new SqlConnection(Dbutil.Connstring))
        {
            //创建一个命令对象
            SqlCommand cmd = conn.CreateCommand();
            cmd.CommandText = "INSERT INTO Scores(UserName,Score) Values(@UserName,@Score)";//对数据库进行操作的命令语句
            //添加两个参数
            cmd.Parameters.Add(new SqlParameter("@UserName", userName));
            cmd.Parameters.Add(new SqlParameter("@Score", value));
            conn.Open();
            cmd.ExecuteNonQuery();//返回Sql受影响的行数
        }
    }
}
}

BLL层

namespace LoginBLL
{
public class LoginServers 
{
    public Login.Model.Userinfo UserLogin(string userName,string passWord)
    {
        Login.DAL.UserDAO uDao = new Login.DAL.UserDAO();//实例化DAL的UserDAO对象uDao

        Login.Model.Userinfo user=uDao.SelectUser(userName, passWord);//返回uDAO的查找到的用户名和密码赋给Model层的user对象

        if (user != null)//如果user对象不是空值
        {
            Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//实例化对象sDao
            sDao.UpdateScore(userName, 10);//sDao执行更新Score表积分的工作
            return user;
        }
        else//如果数据库中没有该数据
        {
            throw new Exception("登录失败");//登录失败
        }
    }
}
}

UI层

namespace LoginUI
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    private void btnLogin_Click(object sender, EventArgs e)
    {
        string userName = txtusername.Text.Trim();//定义userName来接受用户名的输入数据
        string password = txtpassword.Text;//定义password来接受密码的输入数据
        LoginBLL.LoginServers sgr = new LoginBLL.LoginServers ();//实例化Loginservices对象
        Login.Model.Userinfo user = sgr.UserLogin(userName, password);//实例化一个user对象,赋予

        MessageBox.Show("登录用户" + user.UserName);

    }
}
}

分层架构的缺点

1.需要通过中间层来获得数据,降低了系统的运行性能。
2.会导致级联的修改,这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 42
    评论
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值