三层结构实现登录功能——C#版
2016-01-25 19:53
453 查看
对于实现登录功能,三层架构划分的效果与描述如图所示:
三层架构的划分原理如下图:
1.各层的任务
数据访问层:使用ADO.NET中的数据操作类,为数据库总的每个表,设计两个数据访问类ScoreDAOI类和UserDAOI类。UserDAOI类中实现用户账号和密码的查询,ScoreDAOI类中实现登录成功后,给该用户添加10个积分。此层的任务是:封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。
业务逻辑层:为用户的登录功能模块,设计一个业务逻辑类LoginManager,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能。
界面层:根据用户的具体要求,即登录窗体,为实现登录功能,对该窗体部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。
2.层之间的调用关系
数据访问层的类(UserDAOI类和Scores类):直接访问数据库,实现基本记录操作。
业务逻辑层的类(LoginManager类):调用相关的数据访问类,实现用户所需功能。
界面层:部署控件后,调用业务逻辑层的类,实现功能。
3.设计数据库,如图所示
Users表
Scores表
在LoginMedal类中这样描述它
将表中的每个字段抽取为类的字段(注意类型匹配),并封装成属性,设计构造函数,来将表抽取为实体类。这个抽取过程称为对象关系映射ORM。
在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类
LoginDAL项目中的ScoreDAOI类
UserDAO类
LoginUI项目中的Form1窗体
总结:虽然使用三层仅仅是实现了登录窗体的功能,但从这里我们可以看出三层架构给我们带来的巨大好处。将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。
三层架构的划分原理如下图:
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; } } }
将表中的每个字段抽取为类的字段(注意类型匹配),并封装成属性,设计构造函数,来将表抽取为实体类。这个抽取过程称为对象关系映射ORM。
在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(); } } } }
UserDAO类
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); }
总结:虽然使用三层仅仅是实现了登录窗体的功能,但从这里我们可以看出三层架构给我们带来的巨大好处。将应用程序的功能分层后,对于固定的DBMS,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。
相关文章推荐
- C# 常用加密处理
- C#使用SharpZipLib解压Zip单个文件到内存
- C# Post方式传输报文,和处理响应
- C#报错:InvalidOperationException: out of sync
- C# 日期格式化的中的 正斜杠的问题
- C#实现软件注册码算法
- c#获取带有汉字的字符串长度
- 在C#中保存Bouncy Castle生成的密钥对 【自用笔记】
- cer, pfx 创建,并且读取公钥/密钥,加解密 (C#程序实现) 【笔记】
- C#图片处理常见方法性能比较
- C#入门经典Lambda
- c# 天气预报
- 根据表名得到表信息,包括字段说明,生成C#类属性
- C#中DataTable的用法
- C# 指南之装箱与拆箱
- c#+arcgisengine 对属性表创…
- C# DataGridView使用代码
- C# 测试代码段性能耗时
- C#“可访问性不一致”问题
- C#中Dictionary的用法