“3W1H法”浅析三层架构

    前言:

    在学习UML的时候,为了更加深刻的理解类图和包图,就提前学习了一些“三层”的知识,当时还没有面向对象的语言基础,只是大概的知道而已,并没有深入的去研究。

    现在经过了C#,设计模式,VB.NET的学习,与“面向对象”进行了多次碰撞,这次就是用C#语言做了一个运用三层的小Demo,下面就详细的介绍一下三层的“3W1H”。



一、what

    首先我们先来看第一个“W”,什么是三层架构?

“3W1H法”浅析三层架构_第1张图片

    如图所示,最常见的三层架构组成就是表示层、业务逻辑层、数据访问层。

    1、表示层UI:展示数据,采集用户输入的信息和操作。
    2、业务逻辑层BLL:桥梁,数据处理,传递。
    3、数据访问层DAL:与数据源打交道,实现与数据库的交互和访问。

    总体上看,分层的原则就是各司其职,实现数据的操作与显示的分离,体现高内聚,低耦合的原则。



二、why

       说到为什么使用三层架构??一个必要前提就是分析一下这个东西的利弊,我们使用一个东西之前,一定是进行了权衡利弊的。
       
       优点:
       1、复用
       2、解耦
       3、易维护

       缺点:
       1、降低性能
       2、级联修改
       3、增加成本

       简而言之,分析了三层的利弊,使用三层的目的是各类别职责单一,使用方便。这让我想起了设计模式中的单一职责的原则,差不多大同小异吧。



三、where

      学习了为什么使用三层,下一步就要讨论一下在什么情况下使用三层??

     不用:
     1、逻辑简单
     2、没有数据存储需求
    
     用:
     1、逻辑复杂
     2、数据存储成库
    
     总之,人尽其才,物尽其用。画蛇添足,往往是无用功的。软件开发也是一样,做小项目的时候,分不分层确实看不出什么差别,并显得啰嗦。但当项目变复杂时,分层就显出它的优势了,所以使用三层,视情况而定。



四、how

       那么如何使用三层架构呢?下面就通过一个使用了三层的系统登陆的demo,让大家了解一下三层中的“ HOW”。
     
     在看代码前,我们先要搞清楚两件事情:

     1、三层的依赖关系。如下图

“3W1H法”浅析三层架构_第2张图片
     
    2 、三层间的数据传递。如下图
“3W1H法”浅析三层架构_第3张图片
代码如下:

1、DAL层的UserDAO类,用于User表的操作。ScoreDAO类略

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string userName,string password)
        {
            using(SqlConnection conn=new SqlConnection (DbUtil.Connntring ))
            {
                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,PWD,Email
                                    FROM USERS WHERE Username=@Username AND PWD=@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;
            }
        }
    } 
}

2、DAL层的DbUtil类,用于连接数据源的。

namespace Login.DAL
{
    public class DbUtil
    {
        public static string Connntring = @"Server=AZZ-PC;Database=AZZ_Charge;User ID=sa;Password=123456";
    }
}

3、BLL层的LoginManager类。
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 ("登陆失败。");
            }
        }
    }
}

4、Model实体中的UserInfo类,用于封装数据,使数据可以在三层之中调用,本身不知道被谁调用了。

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

    }
}

5、UI层,收集用户输入的信息,并做简单的判断。

namespace LoginUI
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void btnLogin_Click(object sender, EventArgs e)
        {
            //IDbConnection conn = new SqlConnection("c......");
            //IDbCommand cmd = conn.CreateCommand();
            //cmd.CommandText = "Select UserName Form USERS WHERE";
            //cmd.ExecuteReader();
            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);
        }
    }
}

五、小结


    首先,学习三层架构更多体会到了i+1有效输入的作用,当初在UML初次接触了三层,没有碰触什么火花,但是也留下了一下印象,让我这次再接触三层的时候,有了熟悉的感觉。再来,就是3W1H的学习方法,让我们直观的认识了一个新事物,从陌生到熟悉。最后,对于三层的学习只是初了解,有什么理解不对的地方,请多多指教。


你可能感兴趣的:(三层)