三层学习

前言

三层已经学了三天了,从刚开始的什么都不懂,到现在的略知一二。

哪三层?

1.显示层(UI)
UI的作用
向用户展现特定业务数据
采集用户的输入信息和操作
UI设计的原则
用户至上,兼顾简洁
UI常用的技术
WindouwsForm : Form、Control
ASP.NET:aspx、ascx、master、html

2.业务逻辑层(BLL)
BLL的作用
从DAL中获取数据,以供UI显示用
从UI中获取用户指令和数据,执行业务逻辑
从UI获取用户指令和数据,通过DAL写入数据源
BLL的职责机制
UI->BLL->UI
UI->BLL-DAL->BLl->UI

3.数据访问层
DAL的作用:别的不管,只干这三件事
从数据源加在数据(Select)
向数据源写入数据(Insert/Update)
从数据源删除数据(Delete)
DAL中常用的技术
ADO.NET +SQL语句
O/R Mapping框架
访问SQL Sercer数据库时Ling 同SQL

怎么应用?

1.DAL只提供基本的数据访问,不包含任何业务相关的逻辑处理;
2.UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理;
3.BLL负责处理业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要数据给UI。

引用关系?

因为DAL/BLL/UI分别在不同的程序集中,所有各个层之间需要有引用关系:UI->BLL->DAL.
DAL所在程序集不引用BLL和UI
BLL需要引用DAL
UI直接应用BLL,可能会间接引用DAL
我对业务逻辑层的理解是它相当于一个桥梁,传递数据,但是我感觉实际并没有那么简单。我理解的还有些肤浅。

实战-登录

首先设计一个登录界面
在这里插入图片描述

然后先说说数据访问层,这层有三个类,它们的功能分别是:
1.DbUtil类:连接数据库,使程序和数据库交互
2.ScoreDAO类:负责对数据库中Scores表的操作
3.UserDAO类:负责对数据库中Users表的操作

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;
namespace LoginDAL
{
    class DbUtil
    {
        public static string ConnString = @"Server=YXS\CHARGE;Database=Login;User ID=sa;Password=123456";
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.SqlClient;
namespace LoginDAL
{
    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", 100));
                conn.Open();
                cmd.ExecuteNonQuery();
            }
        }
    }
}
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginDAL
{
    public class UserDAO
    {
        public LoginModel.UserInfo SelectUser(string userName, string passWord)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"select ID,UserName,password,Email 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();
                LoginModel.UserInfo user = null;
                while (reader.Read())
                {
                    if (user == null)
                    {
                        user = new LoginModel.UserInfo();
                    }
                    user.ID = reader.GetInt32(0);
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;
            }
        }
    }
}

然后是显示层,显示和接受用户对系统登录窗体输入的数据。
代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

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

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string userID = txtUserName.Text.Trim();
            string passWord = txtPassword.Text;
            LoginBLL.LoginService YXS = new LoginBLL.LoginService();
            LoginModel.UserInfo user = YXS.UserLogin(userID, passWord);
            MessageBox.Show("登录成功" + userID);
           
        }
    }
}

还有一个Model:数据模型,它起到封装数据的作用,它独立于三层,目的是使数据可以在三层之间顺畅流通。
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LoginModel
{
   public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
        
    }
}

最后业务逻辑层,它是把用户输入的用户名,密码等数据传到数据库中核对,显示的同时,又对数据库里面的表进行更新。
代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using LoginDAL;
namespace LoginBLL
{
    public class LoginService
    {
        public LoginModel.UserInfo UserLogin(string userName, string passWord)
        {

            UserDAO uDAO = new UserDAO();
            LoginModel.UserInfo user = uDAO.SelectUser(userName, passWord);
            if (user != null)
            {
              ScoreDAO sDao = new ScoreDAO();
               sDao.UpdateScore (userName,10);
                return user;
            }
            else
            {
                throw new Exception("登录失败");
            }
        }
    }
}

这个登录窗体的意思是每登录成功一次,就在数据库中给该用户增加10分。显示结果如下:在这里插入图片描述

总结

在这期间我走的不是那么的顺利,遇到了好多错误,把视频看了好几遍,看博客,都没解决,最后只能请教高手帮我解决了。我的错误业务逻辑层和数据访问层还有数据模型的输出类型选择了控制台应用程序,应该改成类库,因为它们三个都是为显示层当助手的,所以应该是类库。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 15
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值