您的位置:首页 > 其它

三层

2016-02-14 21:06 190 查看

三层介绍

三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了“高内聚低耦合”的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。

优点

1、开发人员可以只关注整个结构中的其中某一层;

2、可以很容易的用新的实现来替换原有层次的实现;

3、可以降低层与层之间的依赖;

4、有利于标准化;

5、利于各层逻辑的复用。

6、结构更加的明确

7、在后期维护的时候,极大地降低了维护成本和维护时间


缺点

1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。

2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。

3、增加了开发成本。


为什么使用三层

当你的业务复杂到一定程度上,需要数据存储当相应的数据库中。并不是所有的系统中都需要使用三层结构。业务逻辑简单、没有真正的数据存储层(也就不需要数据访问层)

三层的作用

数据访问层

1、DAL的作用

从数据源加载数据(Select)

向数据源写入数据(Insert/Update)

从数据源删除数据(Delete)


显示层

1.UI的作用

向用户展现特定业务数据

采集用户的输入信息和操作

2.UI设计的原则

用户至上,兼顾简洁


业务逻辑层

BLL的作用

从DAL中获取数据,以供UI显示用

从UI中获取用户指令和数据,执行业务逻辑

从UI中获取用户指令和数据,通过DAL写入数据源


具体应用----原则

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

2、UI只负责显示和采集用户操作,不包含任何的业务相关的逻辑处理

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


demo

当用户登录系统后,数据库中会给用户增加10扣积分。

三层的关系图



显示层:View/UI

首先在命名空间添加 using System.Data using System.SqlClient



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);
        }
    }
}
业务逻辑层:BLL(Business Logic Layer)

namespace Login.BLL
{
    public class LoginManager
    {
        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 successful
            {
                Login.DAL.ScoreDAO sDao = new Login.DAL.ScoreDAO();
                sDao.UpdateScore(userName, 10);
                return user;
            }
            else
            {
                
               throw new Exception("登录失败。");
            }
        }
    }
}
数据库访问层DAL:(Data Access Layer)

其中在DAL层中需要有ScoreDAO类、UserDAO类和DbUtil类

DbUtil类 中的代码

namespace Login.DAL

{
    class DbUtil
    {
        public static string ConnString = @"Server=孙东;Database=Login;User ID=sa;Password=sd2850452";
    }
}
UserDAO类 中的代码

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


ScoreDAO类 中的代码

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

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; }
    }
}
数据库需要新建两张表,Users表和Scores表(例子中 使用的为SQL Server)

Users表



Scores表



下面是关于这个例子的一张关系图

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: