三层篇--宏观总结

《前言》

还没有开始学习三层的时候,就总是听他们说三层啊、七层的,当时特别好奇,是不是就像汉堡王一样,一层一层的夹起来?那三层究竟是什么东西呢?怎么样才叫做三层?三层用来做什么?带着问题开始了初步的三层学习。

《三层架构》

简单解释一下,代码中所有的三层项目都会在一个解决方案中,应用的关系是表示层依赖业务逻辑层,业务逻辑层依赖的数据访问层,从这里也体现出了低耦合,客户端不会直接和数据库进行交互,而是COM/DCOM通讯与数据库进行交互。

《搭建三层步骤》

(1)、搭建表达层(window)

(2)、搭建业务逻辑层(类)

(3)、搭建数据访问层(类)

(4)、实现各层之间的相互依赖

从步骤上来讲都很好理解,但是我们都知道数据在各层之间表达需要定义,那么我们知道ADO.NET中有DataSet组件帮我们做这个工作,它是从数据源中检索到的数据在内存中的缓存,应用它会使数据结构暴露在业务逻辑层和表达层中,因此,我们引入了实体,三层的demo:

通过王继斌老师讲的三层登录的Demo的就很好理解了,其中做了一个LoginUI的客户端,做了一个LoginBLL和一个LoginDAL,特殊的是还有一个LoginModel类,而这就是实体类,它可以与UI、BLL、DAL进行双向的传输。

下面是登录的三层例子:

UI:

namespace LoginUI
{    
    public partial class Form1 : Form   
   {       
       public Form1()      
        {          
           InitializeComponent();    
        }      
       private void btnLogin_Click(object sender, EventArgs e)      
        {            
           string userName = txtName.Text.Trim();     //给实体层传值          
           string password = txtPassword.Text;           
           Login.BLL.loginService mgr = new Login.BLL.loginService();        //实例化业务层            
           Login.Model .UserInfo user=mgr.UserLogin (userName, password);  //实体层传来的值
           
           MessageBox.Show("登陆用户:" + user.UserName);      
         }    
    }
}

BLL:

namespace Login.BLL
{    
    public class loginService    
    {        
        public Login.Model.UserInfo UserLogin(string userName,string password)       
        {                    
            //throw new NotImplementedException();            
            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.UpdataScore(userName, 10);                
                return user;            
            }            
            else             
            {                
            throw new Exception("登陆失败!");                 //抛出错误            
            }        
        }    
     }
}

 DAL:

连接数据库字段:


namespace Login.DAL
{
    class DbUtil
    {
        public static string ConnString = @"Server=mx; Database=Login; User ID=sa; Password=123456";//连接数据库的字段
    }
}

User表:


namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName, string password)    
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))        //用了using关键字,可以不用关闭连接

            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password,Email FROM [dbo].[User] 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;                                 //声明一个变量user,初始值为null,不指向任何内存空间
                while (reader.Read())
                {
                    if (user == null)                                              //判断user是否为空
                    {
                        user = new Login.Model.UserInfo();
                    }
                    user.ID = reader.GetInt32(0);                                  //获取ID列的32为整数值 ,赋值
                    user.UserName = reader.GetString(1);
                    user.Password = reader.GetString(2);
                    if (!reader.IsDBNull(3))
                    {
                        user.Email = reader.GetString(3);
                    }
                }
                return user;
            }
        }
    }
}

 score表:


namespace Login.DAL
{
    public class ScoreDAO
    {
        public void UpdataScore(string userName,int value)
        {
            using (SqlConnection conn = new SqlConnection(DbUtil.ConnString))                                     //连接数据库            {
                SqlCommand cmd =conn.CreateCommand();                                                             //command类
                cmd.CommandText = @"INSERT INTO Score(UserName,Score) Values(@UserName,@Scores)";                 //插入列
                cmd.Parameters.Add(new SqlParameter("@UserName", userName));                                      //增加属性
                cmd.Parameters.Add(new SqlParameter("@Scores", value));
                conn.Open();
                cmd.ExecuteNonQuery();                                                                            //查询            }
        }
    }
}

Model:


namespace Login.Model
{
    public class UserInfo                             //定义了4个属性
    {
        public int ID{get;set;}
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
    }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值