您的位置: 旅游网 > 情感

ASP.NET:自定义实体类简介(3)_a

发布时间:2020-01-16 17:30:32

什么是自定义实体?

自定义实体是代表业务域的对象,因此,它们是业务层的基础。如果您有一个用户身份验证组件(本指南通篇都使用该示例进行讲解),您就可能具有 User 和 Role 对象。电子商务系统可能具有 Supplier 和 Merchandise 对象,而房地产公司则可能具有 House、Room 和 Address 对象。在您的代码中,自定义实体只是一些类(实体和“类”之间具有非常密切的关系,就像在 OO 编程中使用的那样)。一个典型的 User 类可能如下所示:

'Visual Basic .NET

Public Class User

#Region "Fields and Properties"

Private _userId As Integer

Private _userName As String

Private _password As String

Public Property UserId() As Integer

Get

Return _userId

End Get

Set(ByVal Value As Integer)

_userId = Value

End Set

End Property

Public Property UserName() As String

Get

Return _userName

End Get

Set(ByVal Value As String)

_userName = Value

End Set

End Property

Public Property Password() As String

Get

Return _password

End Get

Set(ByVal Value As String)

_password = Value

End Set

End Property

#End Region

#Region "Constructors"

Public Sub New()

End Sub

Public Sub New(id As Integer, name As String, password As String)

Me.UserId = id

Me.UserName = name

Me.Password = password

End Sub

#End Region

End Class

//C#

public class User {

#region "Fields and Properties"

private int userId;

private string userName;

private string password;

public int UserId {

get { return userId; }

set { userId = value; }

}

public string UserName {

get { return userName; }

set { userName = value; }

}

public string Password {

get { return password; }

set { password = value; }

}

#endregion

#region "Constructors"

public User() {}

public User(int id, string name, string password) {

this.UserId = id;

this.UserName = name;

this.Password = password;

}

#endregion

}

为什么能够从它们获益?

使用自定义实体获得的主要好处来自这样一个简单的事实,即它们是完全受您控制的对象。具体而言,它们允许您:

• 利用继承和封装等 OO 技术。

• 添加自定义行为。

例如,我们的 User 类可以通过为其添加 UpdatePassword 函数而受益(我们可能会使用外部/实用程序函数对数据集执行此类操作,但会影响可读性/维护性)。另外,它们属于强类型,这表示我们可以获得 IntelliSense 支持:

498)this.style.width=498;" border=0>

图 1:User 类的 IntelliSense

最后,因为自定义实体为强类型,所以不太需要进行容易出错的强制转换:

Dim userId As Integer = user.UserId

'与

Dim userId As Integer =

? Convert.ToInt32(ds.Tables("users").Rows(0)("UserId"))

对象关系映射

正如前文所讨论的那样,此方法的主要挑战之一就是处理关系数据和对象之间的差异。因为我们的数据始终存储在关系数据库中,所以我们只能在这两个世界之间架起一座桥梁。对于上文的 User 示例,我们可能希望在数据库中建立一个如下所示的用户表:

498)this.style.width=498;" border=0>

图 2:User 的数据视图

从这个关系架构映射到自定义实体是一个非常简单的事情:

'Visual Basic .NET

Public Function GetUser(ByVal userId As Integer) As User

Dim connection As New SqlConnection(CONNECTION_STRING)

Dim command As New SqlCommand("GetUserById", connection)

command.Parameters.Add("@UserId", SqlDbType.Int).Value = userId

Dim dr As SqlDataReader = Nothing

Try

connection.Open()

dr = command.ExecuteReader(CommandBehavior.SingleRow)

If dr.Read Then

Dim user As New User

user.UserId = Convert.ToInt32(dr("UserId"))

user.UserName = Convert.ToString(dr("UserName"))

user.Password = Convert.ToString(dr("Password"))

Return user

End If

Return Nothing

Finally

If Not dr is Nothing AndAlso Not dr.IsClosed Then

dr.Close()

End If

connection.Dispose()

command.Dispose()

End Try

End 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 的速度。

宝宝健脾的食疗
消肿止痛吃什么消肿快
宝宝咳嗽厉害有痰咳不出来
为什么运动后腿酸
猜你会喜欢的
猜你会喜欢的