三层架构视频学习总结

学习三层的资料是王继彬视频,下面先总结一下视频里面的知识点。

                    

结合这张图,说一下自己对三层的理解。

1.三层架构的构成:

   

 

【表现层(UI)】通俗是展现给用户的界面,及用户在使用一个系统的时候他的所见所得.

    作用:向用户展示特定的业务数据、采集用户的输入信息和操作

    原则:用户至上、兼顾简洁

【业务逻辑层(BLL)】针对具体问题操作,也可以说是对数据层的操作,对数据业务逻辑处理

    作用:从数据访问层获取数据,显示在显示层,从显示层获取用户指令和数据,执行业务逻辑;从显示层获取用户指令和数据,通过数据访问层写入数据源。UI提出请求,收集数据传给业务逻辑层转向BLL再返回给UI

【数据访问层(DAL)】该层所做事物直接访问数据库,针对数据库的增,删,改,查等.

    作用:从数据源加载、写入、删除数据

【实体层】可以简单的理解为是一个描述业务实体的类,是数据传输的载体。

    作用:为我们在关系数据库和对象之间架起了一座桥梁。

    重要性:它不是属于三层,但却是三层中必不可少的元素。

2.主要思想:降低耦合性。(分层是为了使任何一层的变化都不影响其他层)

3.各层之间的引用关系、原则

  从上图中我们可以看出:U层引用B层、B层引用D层、三层均引用实体层。而且按照请求执行的方向,信息反馈再沿着相反方向反馈回来,完成命令的执行。

  原则:各层之间不可相互引用。

4.为什么要使用三层?

  区分层次的目的即为了“高内聚,低耦合”的思想。
  优点
  ①开发人员可以只关注整个结构中的其中某一层;②可以很容易的用新的实现来替换原有层次的实现;③可以降低层与层之间的依赖;④有利于标准化;⑤利于各层逻辑的复用。
  缺点
  ①降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。②有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。
5.什么时候需要用到三层?
 一般较大型的项目才会用到三层架构,中小型的项目不用三层反而更方便。
6.举例说明(视频中讲的那个登录的例子)

  项目描述:实现一个用户登录的功能,并且要求每登录一次加10个积分。

  代码思路:首先是划分三层:表现层(显示用户需求界面)、业务逻辑层(编写业务处理流程代码)、数据访问层(新建数据库并做好数据连接访问。)实体层(考虑到User类和Score类,使用的频率较大,较复杂,所以抽象出来便于访问。)

  具体代码实现:

  Ⅰ、U层:

   

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

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

  Ⅱ接下来要设计B层:业务逻辑分析,需要注意的是,编码的时候应该考虑到登录的各种具体情况。

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("登录失败.");
            }
        }
    }
}
  Ⅲ、分析完需求并设计好界面之后,需要把这些东西存储在数据库中,接下来转向D层的设计。

 public static string ConnString = @"Server=.; Database=Login; User ID=sa; Password=***";
 namespace Login.DAL//User类
{
    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;
            }

        }
    }
}
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();
           }
       }
    }
  Ⅳ、很明显,各层中均会用到User和Password,相互引用会引起不必要的麻烦,所以在这里有必要抽象出一个实体类来。

 

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

    }
}

学习总结:

见到过这样的说法:成也三层,败也三层。由此可见三层的重要性。用好了的话,能更好的服务于我们设计研发的软件。一定要理解其思想,将其运用到实际当中。




 

 

 

 

 

posted @ 2014-12-13 14:51  幻想泡沫  阅读(188)  评论(0编辑  收藏  举报