对于登陆实例,我们可以将它看一个业务,即登陆业务。UI层负责界面设计显示和采集用户的操作。BL层通过获取UI传来的操作指令,对数据业务逻辑进行处理,处理完成后,返回必要。DA层主要负责数据库的访问。代码如下:
UIL代码展示:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; 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 btnLogin_Click(object sender, EventArgs e) { string userName = txtUserName.Text.Trim(); string password = txtPassword.Text; Login.BLL.LoginManager mgr = new Login.BLL.LoginManager(); Login.Model.UserInfo user = mgr.UserLogin(userName, password); MessageBox.Show("当前登录用户:" + user.UserName+"\r\n"+"当前登录用户的密码:" + password,"登录"); } } }
BLL代码展示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Login.BLL { public class LoginManager { public Login.Model.UserInfo UserLogin(string userName,string password) { DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model.UserInfo user = uDao.SelectUser(userName, password); if (user != null) //login successfully { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); sDao.UpdateScore(userName,10); return user; } else { throw new Exception("登录失败。"); } } } }
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 Login.DAL { public class UserDAO { public Login.Model.UserInfo SelectUser(string userName, string password) { using (SqlConnection conn = new SqlConnection(@"Server=DESKTOP-LTBMQSK;Database=Login;User ID=sa;Password=jujianfei")) { { 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(); Login.Model.UserInfo user = null; while (reader.Read()) { if (user == null) { user = new Login.Model.UserInfo(); } user.ID = reader.GetInt32(0); user.UserName = reader.GetString(1); user.Password = reader.GetString(2);//not suggestion if (!reader.IsDBNull(3)) { user.Email = reader.GetString(3); } } return user; } } } } }
实体层代码展示:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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;} } }
实体层是封装数据的,保证数据在三个层次之间顺畅流转,独立于其他三个层次,不引用任何一层,而其他三层都需要引用实体,另外三层之间的引用关系是:UIL→BLL→DAL。实体层并不是三层中的一员,简单来看,这就是一个普通的类,不要混淆了。下面展示一幅他们之间的关系图: