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

对于实现登录功能,三层架构划分的效果与描述如图所示:

                                                          三层结构实现登录功能——C#版_第1张图片                                                                                      

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

           三层结构实现登录功能——C#版_第2张图片

1.各层的任务

         数据访问层:使用ADO.NET中的数据操作类,为数据库总的每个表,设计两个数据访问类ScoreDAOI类和UserDAOI类。UserDAOI类中实现用户账号和密码的查询,ScoreDAOI类中实现登录成功后,给该用户添加10个积分。此层的任务是:封装每个数据表的基本记录操作,为实现业务逻辑提供数据库访问基础。

         业务逻辑层:为用户的登录功能模块,设计一个业务逻辑类LoginManager,此时,需要利用相关的数据访问层类中,记录操作方法的特定集合,来实现每个逻辑功能。

          界面层:根据用户的具体要求,即登录窗体,为实现登录功能,对该窗体部署输入控件、操作控件和输出控件,并调用业务逻辑层中类的方法实现功能。

2.层之间的调用关系

数据访问层的类(UserDAOI类和Scores类):直接访问数据库,实现基本记录操作。

业务逻辑层的类(LoginManager类):调用相关的数据访问类,实现用户所需功能。

界面层:部署控件后,调用业务逻辑层的类,实现功能。


3.设计数据库,如图所示

Users表

三层结构实现登录功能——C#版_第3张图片

  

Scores表

三层结构实现登录功能——C#版_第4张图片


在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窗体,如图所示:

   三层结构实现登录功能——C#版_第5张图片

并将每个新建的类的命名空间重命名为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#版)