三层-架构星星之火

  前言

   在上篇博客中我们已经了解了三层的一些基本概念,定义和为什么用三层。对于三层有了宏观上的概念,知道在软件架构设计中所处的位置,我们要做的是能够不断改进、持续完善的软件,这也正是三层存在的重大意义。解耦是重点,各个层次、模块之前的耦合度太高的话,根本不利于软件的维护和扩展。UML结合三层思想做出的软件是今后发展趋势。


  原则

   DAL:提供基本的数据访问,不包含任何业务相关的逻辑处理。 

    UI:负责显示和采集用户操作。不包含相关的业务处理。只是将数据传给了业务逻辑层。

    BLL:负责相关的业务逻辑。通过获取UI传来的操作指令,决定执行业务逻辑,在需要访问数据源的时候直接交给DAL处理。处理完成后,返回必要的数据给UI.


  包图

    业务复杂一定程度,数据访问和业务访问层分开,UI与业务访问分开。用一个包图表示他们关系

    在包图中我们看到每一层都在调用实体层,而三层之间的联系不是错综复杂的,简单的联系而已,这就是需要我们知道“高内聚、低耦合”之所以做成这样,目的就是降低耦合,都是为了减少犯错,减少繁琐度,修改也只需要改实体就行。

    之前看过师姐描述三层结合生活,服务员(只管接待客人)、厨师(只管做客人点的菜)和采购员(只管按客人点菜的要求采购食材之间的关系,很生动形象的描述三层之间的数据传递。他们各负其职,服务员不用了解厨师如何做菜,不用了解采购员如何采购食材;厨师不用知道服务员接待了哪位客人,不用知道采购员如何采购食材;同样,采购员不用知道服务员接待了哪位客人,不用知道厨师如何做菜

    Entity将三层联系起来,也就是顾客把他们联系到一起为提供吃饭的条件。实体层是必不可少的一层。


  代码实现


  DAL(数据访问层)

public class UserDAO    //数据访问对象
    {
        //public Login.Model.UserInfo SelectUser(string userName, string password)
        //{
        //    throw new NotFiniteNumberException();

        //}
        public Login.Model.UserInfo SelectUser(string userName, string password)
        {
            using (SqlConnection conn = new SqlConnection(Dbutil1.ConnString))
            {
                conn.Open();   //打开
                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));//传参数username  
                cmd.Parameters.Add(new SqlParameter("@Password", password));
                SqlDataReader reader = cmd.ExecuteReader();
                Login.Model.UserInfo user = null;

                while (reader.Read())
                {
                    reader.GetInt32(0);
                    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;
            }
        }
    }

class Dbutil1
    {
        public static string ConnString = @"Server=zjc;Database=机房重构;User ID=zhaojinchao;Password=zjc";
    }
  Entity(Model)层:

public  class UserInfo
    {


        public int ID { get;set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public string Email { get; set; }
  
    }
  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)//判断user值,做出相应处理,如果user为null值,那么说明用户名或密码错误;
            {
                Login.DAL.ScoreDAO sDAO = new Login.DAL.ScoreDAO();
                sDAO.UpdateScore(userName, 10);
                return user;
            }
            else
            {
                throw new Exception("登录失败");
            }
        }
    }
   UI

private void btnLogin_Click(object sender, EventArgs e)
        {
            //IDbConnection conn = new SqlConnection("c");
            //IDbCommand cmd = conn.CreateCommand();
            //cmd.CommandText = "Selelcct UserName From USERS WHERE";
            //cmd.ExecuteReader//显示层不能直接跟数据打交道
            string userName=txtUserName.Text .Trim ();
            string password=txtPassword.Text.Trim  ();
            Login.BLL.LoginManager mgr = new Login.BLL.LoginManager();
            Login.Model.UserInfo user=mgr.UserLogin (userName,password);

            //Login.BLL.LoginService sve = new Login.BLL.LoginService();
            //Login.Model.UserInfo user=sve.UserLogin(userName, password);
            MessageBox.Show("登录用户:" + user.UserName);
        }


  总结
   通过实现登陆分析好三层之间的关系,清楚其中的一条数据传递线,在我们的学习过程中是极其重要的。BLL其实主要调用DAL层的操作,返回DAL层添加用户的Message(true或者false)。客户端与数据库之间犹豫存在业务逻辑层,使得两层的依赖性减小,降低之间的耦合度,便于为何更改。UI层则主要完成收取、显示响应用户的需求,去调用BLL层实现的a方法,DAL层就是实实在在做这件事情的操作。




评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值