您的位置:首页 > 编程语言 > C#

三层结构实现登录功能——C#版

2016-01-25 19:53 453 查看
对于实现登录功能,三层架构划分的效果与描述如图所示:





三层架构的划分原理如下图:



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,数据访问层基本可以不变,一旦用户的需求改变,首先修改业务逻辑层,界面层稍做改动即可。这种做法使程序的可复用性、可修改性,都得到了很好的改善,大大提高了软件工程的效率。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: