三層架構實現登錄(工廠+反射+配置文件)
分層思想:
三層開發就是將整個業務應用劃分為表示層、業務邏輯層、數據訪問層、數據庫等,明確地將客戶端的表示層、業務邏輯訪問、和數據訪問及數據庫訪問劃分出來,有利于系統的開發,維護、部署和擴展。
其實總結一句話,是為了實現“高內聚、低耦合”。采用“分而治之”的思想,把問題劃分開來各個解決,易于控制,易于延展,易于分配資源。
以登錄demo為例:
工廠+反射+配置文件
三層 UML圖:
通過UML圖,我們可以很清楚的看到各層間的依賴關系。
NET設計方案:
各層代碼實現:
UI層
- '--界面
- Imports Entity
- Imports BLL
- Public Class Login
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim EntityUser As New Entity.EntityUser
- Dim BLLUser As New BLL.BLLUser
- EntityUser.User_ID = txtID.Text
- EntityUser.User_Key = txtKey.Text
- If BLLUser.GetBase(EntityUser) Then
- MsgBox("登錄成功!")
- Else
- MsgBox("登錄失?。?quot;)
- End If
- End Sub
- End Class
BLL層
- '-- Dim DalF As New Factory,在調用工廠的時候將接口的類型做為參數傳進去,在工廠中在通過接口類型去查找具體的實現對象
- Imports Entity
- Imports [Interface]
- Imports FactoryClass
- Public Class BLLUser
- Public Function GetBase(ByVal EntityUser As Entity.EntityUser) As Boolean
- Dim DalF As New Factory
- Dim Entity_User As New Entity.EntityUser
- Entity_User.User_ID = EntityUser.User_ID
- Entity_User = DalF.Interface_User.GetBase(Entity_User)
- If Entity_User.User_Key = EntityUser.User_Key Then
- Return True
- Else
- Return False
- End If
- End Function
- End Class
Factory類
- '-- 反射+配置文件實現數據庫訪問,更換數據庫只需要更改配置文件
- '--AppSetting讀取配置文件中的類別字符串
- Imports [Interface]
- Imports System.Reflection
- Public Class Factory
- Private Shared ReadOnly AssemblyName As String = "DAL"
- Dim DataBase As String = System.Configuration.ConfigurationSettings.AppSettings("sql")
- Function Interface_User() As [Interface].InterfaceUser
- Dim ClassName As String = AssemblyName + "." + DataBase + "DALUser"
- Return CType(Assembly.Load(AssemblyName).CreateInstance(ClassName), [Interface].InterfaceUser)
- End Function
- End Class
Interface接口層
- <span style="color:#000000;">'--定義接口,通過引用使DAL層繼承,實現接口
- Imports Entity
- Public Interface InterfaceUser
- Function GetBase(Entity_User As Entity.EntityUser) As Entity.EntityUser
- End Interface</span>
DAL層
- <span style="color:#000000;">'--操作數據庫
- Imports Entity
- Imports [Interface]
- Imports System.Data.SqlClient
- Public Class DALUser : Implements [Interface].InterfaceUser
- Dim ConnStr As String = System.Configuration.ConfigurationSettings.AppSettings("ConnStr")
- Dim sqlconn As SqlConnection = New SqlConnection(ConnStr) '---連接收據庫
- Function GetBase(Entity_User As Entity.EntityUser) As Entity.EntityUser Implements [Interface].InterfaceUser.GetBase
- Dim sqldata As String = "select * from User_Info where User_ID='" & Entity_User.User_ID & "'" '---SQL語句,從User_Info中讀取所有信息
- Dim sqlcmd As New SqlCommand(sqldata, sqlconn) '---連接數據庫 打開User_Info表
- Dim sqlread As SqlDataReader '---SqlDataReader讀取數據庫的方法,只讀
- Try
- sqlconn.Open()
- sqlread = sqlcmd.ExecuteReader '---ExecuteReader 方法,查詢數據庫并得到結果。ExecuteReader 返回SqlDataReader
- sqlread.Read() '---sqlcmd.ExecuteReader 的 Read() 讀取表中的記錄,每次調用都是返回一行的結果集。
- Entity_User.User_ID = sqlread.Item("User_ID")
- Entity_User.User_Key = sqlread.Item("User_Key")
- Return Entity_User
- Catch ex As Exception
- Entity_User.User_Key = ""
- Return Entity_User
- End Try
- End Function
- End Class
- </span>
Entity實體層
- '----實體類負責實體的表示和數據的傳遞,不包含任何邏輯性內容。
- Public Class EntityUser
- Private strUser_ID As String
- Private strUser_Key As String
- Public Property User_ID As String
- Get '---獲取值
- Return (strUser_ID) '---獲取User_ID屬性返回strUser_ID
- End Get
- Set(value As String) '---設置值
- strUser_ID = value '---傳值,放在value參數里
- End Set
- End Property
- Public Property User_Key As String
- Get
- Return (strUser_Key)
- End Get
- Set(value As String)
- strUser_Key = value
- End Set
- End Property
- End Class
配置文件
- '--
- <?xml version="1.0" encoding="utf-8" ?>
- <configuration>
- <startup>
- <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
- </startup>
- <appSettings>
- <add key ="ConnStr" value="Data Source=(Local);DataBase=Login;User ID=sa;Password=123456"></add>
- <add key ="sql" value =""></add>
- </appSettings>
- </configuration>
雖然只有幾十行的代碼,但是現在理解的還不夠透徹,實現過程中也遇到了很多問題,學到了很多,還缺乏更多的實踐去學習,去發現問題。