什麼是自訂實體? 自訂實體是代表業務域的對象,因此,它們是業務層的基礎。如果您有一個使用者身分識別驗證功能(本文通篇都使用該樣本進行講解),您就可能具有 User 和 Role 對象。電子商務系統可能具有 Supplier 和 Merchandise 對象,而房地產公司則可能具有 House、Room 和 Address 對象。在您的代碼中,自訂實體只是一些類(實體和“類”之間具有非常密切的關係,就像在 OO 編程中使用的那樣)。一個典型的 User 類可能如下所示: 'Visual Basic .NET聲明User資訊表類Public Class UserE#Region "Fields and Properties"定義表中各種資訊 Private _UserID As String Private _PWD As String Private _Level As String Private _UserName As String Private _Head As String '對User表中欄位UserID的存取 Public Property UserID() As String Get Return _UserID End Get Set(value As String) _UserID = value End Set End Property '對user表中欄位密碼的存取 Public Property PWD() As String Get Return _PWD End Get Set(value As String) _PWD = value End Set End Property '對User表中欄位Level的存取 Public Property Level() As String Get Return _Level End Get Set(value As String) _Level = value End Set End Property '對user表中欄位UserName的存取 Public Property UserName() As String Get Return _UserName End Get Set(value As String) _UserName = value End Set End Property '對User表中欄位Head的存取 Public Property Head() As String Get Return _Head End Get Set(value As String) _Level = value End Set End Property End Class 為什麼能夠從它們獲益? 使用自訂實體獲得的主要好處來自這樣一個簡單的事實,即它們是完全受您控制的對象。具體而言,它們允許您: • 利用繼承和封裝等 OO 技術。 • 添加自訂行為。 例如,我們的 User 類可以通過為其添加 UpdatePassword 函數而受益(我們可能會使用外部/公用程式函數對資料集執行此類操作,但會影響可讀性/維護性)。另外,它們屬於強型別,這表示我們可以獲得 IntelliSense 支援: 圖 1:User 類的 IntelliSense( IntelliSense翻譯為智能感應功能 ) 最後,因為自訂實體為強型別,所以不太需要進行容易出錯的強制轉換: Dim UserId As Integer = User.UserId'與Dim UserId As Integer = ? Convert.ToInt32(ds.Tables("users").Rows(0)("UserId")) 對象關係映射 正如前文所討論的那樣,此方法的主要挑戰之一就是處理關係資料和對象之間的差異。因為我們的資料始終儲存在關聯式資料庫中,所以我們只能在這兩個世界之間架起一座橋樑。對於上文的 User 樣本,我們可能希望在資料庫中建立一個如下所示的使用者表: 圖 2:User 的資料檢視 從這個關係架構映射到自訂實體是一個非常簡單的事情: 'Visual Basic .NETPublic Function GetUser(ByVal userId As Integer) As UserDim connection As New SqlConnection(Connection_String)Dim command As New SqlCommand("GetUserById", Connection)command.Parameters.Add("@UserId", SqlDbType.Int).Value = UserIdDim dr As SqlDataReader = NothingTryConnection.Open()dr = command.ExecuteReader(CommandBehavior.SingleRow)If dr.Read ThenDim user As New UserUser.UserId = Convert.ToString (dr("UserId"))User.UserName = Convert.ToString(dr("UserName"))User.Password = Convert.ToString(dr("Password"))Return UserEnd IfReturn NothingFinallyIf Not dr is Nothing AndAlso Not dr.IsClosed Thendr.Close()End IfConnection.Dispose()command.Dispose()End TryEnd Function//C#public User GetUser(int userId) {SqlConnection connection = new SqlConnection(CONNECTION_STRING);SqlCommand command = new SqlCommand("GetUserById", connection);command.Parameters.Add("@UserId", SqlDbType.Int).Value = userId;SqlDataReader dr = null;try{connection.Open();dr = command.ExecuteReader(CommandBehavior.SingleRow);if (dr.Read()){User user = new User();user.UserId = Convert.ToInt32(dr["UserId"]);user.UserName = Convert.ToString(dr["UserName"]);user.Password = Convert.ToString(dr["Password"]);return user; }return null;}finally{if (dr != null && !dr.IsClosed){dr.Close();}connection.Dispose();command.Dispose();}} 我們仍然按照通常的方式設定串連和命令對象,但接著建立了 User 類的一個新執行個體並從 DataReader 中填充該執行個體。您仍然可以在此函數中使用 DataSet 並將其映射到您的自訂實體,但 DataSet 相對於 DataReader 的主要好處是前者提供了資料的中斷連線的視圖。在本例中,User 執行個體提供了中斷連線的視圖,使我們可以利用 DataReader 的速度 。 以上是我的簡單理解,如有出入,請勿見諒。 |