上篇博客简单介绍了下三层架构,看着很简单,无非是功能去分层实现,每层有每层的职责,让数据在三层之间来回传输就可以了,从而更好地解耦,但是作为一个小小小菜鸟,一旦实际使用还是很伤脑筋的,下面以用户登录为例,来看看三层架构是如何被应用的。
UI层
向用户展现特定的数据,采集用户的输入信息和操作,与用户进行交互。
Public Class Form1 Private Sub btnLogin_Click(sender As Object, e As EventArgs) Handles btnLogin.Click Dim manager As New LoginBLL.LoginManager '实例化并引用 Dim user As New LoginModel.UserInfo user.UserName = txtUserName.Text.Trim '给实体层赋值 user.Password = txtPassword.Text manager.UserLogin(user) '调给B层并判断 MessageBox.Show("登录用户" + user.UserName) End Sub End ClassBLL层
BLL层是三层架构的核心,业务逻辑放到这一层,相当于数据的中转站了,分别从UI层和DAL层获取用户信息和数据信息,然后再回馈给这两层。
Public Class LoginManager Public Function UserLogin(ByVal user As LoginModel.UserInfo) As LoginModel.UserInfo Dim uDao As New LoginDAL.UserDAO '实例化D层中UserDAO对象 Dim Uuser As New LoginModel.UserInfo '定义实体层参数用来赋值 Uuser = uDao.SelectUser(user) '将实体user传给D层 If IsNothing(Uuser.UserName) Then Throw New Exception("登录失败") Else MsgBox("登陆成功") End If Return Uuser '将实体user返回到U层 End Function End ClassDAL层
这一层就是和数据库打交道了,执行数据库信息的增删改查。
Imports System.Data.SqlClient Public Class UserDAO Public conn As New SqlConnection("Server=DESKTOP-5KMOCVI;Database=Login;User ID=sa;Password=123") '连接数据库 Public Function SelectUser(ByVal user As LoginModel.UserInfo) As LoginModel.UserInfo '传实体UserInfo以便参数调用 Dim sql As String = "SELECT ID,UserName,Password FROM USERS WHERE UserName=@UserName AND Password=@Password" 'SQL查询语句 Dim cmd As New SqlCommand(sql, conn) '构造方法,执行和连接 '增加两个参数@UserName、@Password cmd.Parameters.Add(New SqlParameter("@UserName", user.UserName)) cmd.Parameters.Add(New SqlParameter("@Password", user.Password)) conn.Open() '打开数据连接 Dim reader As SqlDataReader = cmd.ExecuteReader '定义类型为sqlDatareader的变量reader,并执行SQL语句 Dim Buser As New LoginModel.UserInfo '实例化新的UserInfo '使用SqlDataReader对象Read()方法进行逐行读取 While (reader.Read()) Buser.UserName = reader.GetString(1) '获取第一列中的数据 Buser.Password = reader.GetString(2) '获取第二列中的数据 End While Return Buser '返回对象 conn.Close() '关闭数据连接 End Function End Class实体层
数据那么多,当然得定义一个实体来封装数据啦,用以在三层之间来回调用。
Public Class UserInfo Private _username As String '封装一些属性,用来在三层之间传输数据 Public Property UserName As String Get Return _username End Get Set(value As String) _username = value End Set End Property Private _password As String Public Property Password As String Get Return _password End Get Set(value As String) _password = value End Set End Property End Class
各层之间的引用:UI引用BLL,BLL引用DAL,Model被这仨都引用,除此之外没引用关系喽。
小结
这只是对三层架构的一个小小应用,对系统的分层体现了“高内聚,低耦合”的思想,然而这只是一个小小的起步,因为后面还有加了设计模式的七层~~小小小菜鸟,还得继续加油啊!