对于实现登录功能,三层架构划分的效果与描述如图所示:
三层架构的划分原理如下图:
1.各层的任务
数据访问层:使用ADO.NET中的数据操作类,为数据库总的每个表,设计两个数据访问类ScoreDAOI类和UserDAOI类。UserDAOI类中实现用户账号和密码的查询,ScoreDAOI类中实现登录成功后,给该用户添加10个积分。此层的任务是:封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。
业务逻辑层:为用户的登录功能模块,设计一个业务逻辑类LoginManager,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能。
界面层:根据用户的具体要求,即登录窗体,为实现登录功能,对该窗体部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。
2.层之间的调用关系
数据访问层的类(UserDAOI类和Scores类):直接访问数据库,实现基本记录操作。
业务逻辑层的类(LoginManager类):调用相关的数据访问类,实现用户所需功能。
界面层:部署控件后,调用业务逻辑层的类,实现功能。
3.设计数据库,如图所示
Users表
Scores表
在LoginMedal类中这样描述它
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; } } }
在Modal项目中,为数据库的每个表,都设计一个相应的实体类,这样,就相当于对每个表实体,在.NET程序中,都可以通过类对象来应用。在上面的三层中,通常都会泳道实体类对象。
综上所述,这5个项目之间的关系是这样的:
项目的实施
1.首先,新建一个解决方案,命名为LoginSolution,并新建四个项目,分别为3个类库和1个Windows窗体,如图所示:
并将每个新建的类的命名空间重命名为Login.BLL、Login.DAL、Login.Medal、Login.UI。
2.添加引用
LoginBLL引用LoginDAL和LoginModel
LoginDAL引用LoginModel
LoginUI引用LoginBLL和LoginModel
3.编写代码
LoginDAL项目的LoginManager类
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 ) { Login.DAL.UserDAO uDao = new Login.DAL.UserDAO(); Login.Model.UserInfo user = uDao.SelectUser(userName,password); if (user!=null) { Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO(); sDao.UpdateScore(userName, 10); return user; } else { throw new Exception("登录失败"); } } } }
LoginDAL项目中的ScoreDAOI类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; 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(); } } } }
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(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(); 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); if (!reader.IsDBNull(3)) { user.Email=reader.GetString(3); } } return user; } } } }
LoginUI项目中的Form1窗体
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); }