您的位置:首页 > 运维架构 > 网站架构

【三层架构】——C#代码分析

2016-01-27 10:26 671 查看



前言

上篇博客我们讲到三层架构的基本理论知识,这篇我们来说一下三层之间信息是如何传递的以及如何表现在代码里。



调用关系


图1


图2

分析:根据图1我们可以看到BLL引用DAL和Model,DAL引用Model,UI引用BLL和Model,所以也就可以转换成图2所示的UI引用BLL,BLL引用DAL,它们三者都引用Model。



代码分析

时序图如下:





U层代码

U层调用B层:在U层中初始化B层,然后将参数传递给实体类中的user。

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btnLogin_Click(object sender, EventArgs e)
        {
            //将UI层文本框获得的数据传给实体类中参数
            string userName = txtUserName.Text.Trim();
            string password = txtPassword.Text.Trim();

            //初始化BLL层中LoginManager类
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
            //将userName和password传到B层,B层返回user到U层
            Login.Model.UserInfo user=mgr.UserLogin (userName ,password );

            MessageBox.Show("登录用户:"+user .UserName );
        }
    }
}




B层代码

B层调用D层:在B层中初始化d层,然后将参数传递给实体类中的user。

namespace Login.BLL
{
    public class LoginManager
    {
        public Login.Model.UserInfo  UserLogin(string userName, string password)
        {
            //初始化D层中的UserDAO类
            Login.DAL.UserDAO uDao=new Login.DAL.UserDAO ();
            //userName和password传到D层,D层返回user到B层
            Login.Model .UserInfo user=uDao.SelectUser(userName,password );
            
            //判断user是否为空
            if (user!=null)
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();//初始化D层中的ScoreDAO类
                sDao .UpdateScore (userName,10);//将userName、10更新到数据库中
                return user;
            }
            else
	        {
                throw new Exception("登录失败"+user.UserName );//抛出异常
	        }
        }
    }
}




D层代码

打开数据库服务器

namespace Login.DAL
{
    class DbUtil
    {
        public static string ConnString = @"Server=HOME-LOVE\MSSQLSERVER1;Database=Login;User ID=sa;Password=1";
    }
}


B层所调用D层的内容,D层连接数据库

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;
            }
        }
    }
}


B层所调用D层的内容(增加积分),D层连接数据库

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();
            }
        }
    }
}




Model层

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; }
    }
}


实体类解析:

在登录窗体中我们可以看到实体类作为一个载体去传递信息,它在三层之间是可以互相传递进入的。打个比方我们要把文件交到省里,首先需要交给学校,然后是市里,最后是省里,期间这个文件是不同的,它是我们沟通的一个桥梁,也就是实体类。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: