三层架构

【前言】


在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构,这里的分层不是指物理分层,而是指逻辑上的层次。分层的目的是为了实现“高内聚,低耦合”的思想。有利于系统后期的维护、更新或者移植。 通常意义上的三层架构就是将整个业务应用划分为:界面层、业务逻辑层、数据访问层。每一层都职责明确。

【概念】


三层架构_第1张图片

图片来自网络


界面层(User Interface Layer)


UI层,是整个系统的最外层,和用户直接交互。用于显示数据和接收用户输入的数据。

业务逻辑层(Business Logic Layer)


BL层是系统架构的核心,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。

数据访问层(Data Access Layer)


DA层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。

简单的说法就是实现对数据表的Select,Insert,Update,Delete的操作。



【实现】


这里以一个简单的登陆系统来说明各层之间的联系,以及三层架构在项目中的使用。首先从B层出发开始设计。


实体层:


namespace Login.Model
{
    public class UserInfo
    {
        public int ID { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
      
    }
}



BLL


这一层包含业务逻辑,判断用户输入的用户名和密码是否正确。


namespace Login.BLL
{
    public class LoginManager
    {
        /// 
        /// UserLogin方法,包含登陆功能的业务逻辑
        /// 
        /// 用户名
        /// 密码
        /// UserInfo
        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);//将数据传递到D层
            //如果user不为空,则返回user,否则抛出异常登录失败
            if (user != null)
            {
                return user;
            }
            else
            {
                throw new Exception("登陆失败!");
            }
            
        }
    }
}

DAL


这一层实现对数据库的访问,包含数据库的连接,SQL语句等。

namespace Login.DAL
{
    public class UserDAO
    {
        public Login.Model.UserInfo SelectUser(string username, string password)
        {
            //数据库连接
            using (SqlConnection conn = new SqlConnection(@"Trusted_Connection=True;Server=(local); Database=Login"))
            {

                SqlCommand cmd = conn.CreateCommand();
                cmd.CommandText = @"SELECT ID,UserName,Password FROM USERS WHERE UserName=@UserName AND Password=@Password";
                cmd.CommandType = System.Data.CommandType.Text;
                cmd.Parameters.Add(new SqlParameter("@UserName", username));
                cmd.Parameters.Add(new SqlParameter("@Password", password));
                conn.Open();//打开连接
                SqlDataReader reader = cmd.ExecuteReader(); //根据SQL语句读取数据库
                Login.Model.UserInfo user = null;           //申明user对象,暂不实例化
                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);
                }
                return user;

            }

        }
    }
}


UIL


实现用户界面设计,通过和用户的交互获取相应的数据,并且给用户相应的反馈信息。

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

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        
        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);//调用B层LoginManager类的UserLogin方法,传参
            MessageBox.Show("登陆用户为:" + user.UserName);        //显示登陆信息
        }
    }
}




【规则】


  • 系统各层次及层内部子层次之间都不得跨层调用


下图为各层之间的引用关系:这里需要注意不能跨层调用。

三层架构_第2张图片


  • UI层只能作为一个外壳,不能包含任何业务逻辑的处理过程


  • UI层和BL层不要出现任何SQL语句

【小结】



任何一件事物都具有两面性,三层架构同样也是,有其优点同样也存在不足的地方。不是任何项目都适合使用三层架构,但是无疑对于大型合作开发项目来说,分层思想是适用的。


优点:


解耦和,降低各层之间的依赖性

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

使系统易于更新、修改、后期维护


缺点:


降低了系统性能,增加了中间层来控制对数据库的访问,效率自然比直接访问数据库要低

增加了项目的开发成本


你可能感兴趣的:(☆,Basic,————,计算机基础)