ASP.NET开发人员面向对象的编程
本文作者、PH&V信息服务公司的一位负责人Peter Vogel说,在上一期栏目(支持ObjectDataSource控件)中,我开始研究创建能够与ObjectDataSource(对象数据源)一起工作的对象所需要的代码。在本期栏目中,我研究使用能够把一个客户表中的代码行转变为客户对象的方法创建一个对象工厂类,适用于集成到一个使用ObjectDataSource控件的ASP.NET网页。本栏目研究这些客户对象的数据类。
一个简单的数据类
在我的工厂方法中,我使用这行代码创建我的客户对象:
cst = New Customer(rdr(0), rdr(1), rdr(2), …)
在这行代码中,我把我从客户表中提取的这行代码的每一个字段传送到我的类构造函数。那个构造函数(及其封闭类)看起来是这样的(在这个例子中我仅包括了对三个栏的支持):
Public Class Customer
Private _CustomerId As String
Private _CompanyName As String
Private _ContactName As String
Public Sub New()
End Sub
Public Sub New(ByVal CustomerID As String,
ByVal CompanyName As String,
ByVal ContactName As String)
_CustomerId = CustomerID
_CompanyName = CompanyName
_ContactName = ContactName
End Sub
正如你看到的那样,我在这个类构造函数中所做的一切是捕捉传送给它的值并且在私有类水平的变量(字段)中存储这些值。
其它的客户数据类包括返回存储在这些字段中的这些值的属性。这是一个典型的例子:
Public Property CompanyName() As String
Get
Return _CompanyName
End Get
Set(ByVal value As String)
_CompanyName = value
End Set
End Property
如果你要支持在中间层验证数据,你将使用代码简称在这些属性中进入你的应用程序的数据。你还需要声明一些只读的属性,防止用户改变用户接口中的值(例如,返回这个表格的主键的属性)。替代的方法是你可以在那个页本身或者在这个数据库中计算这个验证,避免用户修改任何无效值。
如果你要使用代码中的对象而不仅仅把它与ObjectDataSource联系在一起,你可以考虑其它一些增强的方法。例如,你可以增加额外的方法和属性以支持在一次调用中设置多个相互关联的属性。你还可以增加一个属性以跟踪这个对象的状况(例如,要从这个数据库中删除设个客户吗?)。
一般来说,随着时间的推移,这个类的变化没有工厂类的变化那样多。偶尔将增加一个新的属性以支持数据库中的变化。在某些属性中的验证代码将增加或者增加一种新的方法以简化与这个类一起工作的方式。
扩展数据类
在现实世界中,它是一个不同寻常的应用程序,屏幕显示在这里与表设计相匹配。例如,如果你在检索一个SalesOrderLine(订单明细),那个表可能包括一个保存ProductId(产品编号)的栏。然而,在用户接口中,你不想仅仅显示这个产品编号:你的用户想看到这个ProductName(产品名称)。
这是工厂方式设计模式的优点的一部分:你可以扩展你的工厂方式,包含你在你的数据类中需要的任何信息。例如,我也许会有一个带“GetSOLineBySOWithProdName”方式的“SalesOrderLineFactory”。这种方式看起来是这样的:
Shared Function GetSOLineBySOWithProdName( _
ByVal SalesOrderNumber As String) As List(Of SalesOrderLine)
Dim rdr As SqlDataReader
Dim con As New SqlConnection(…connectionstring…)
Dim cmd As SqlCommand = con.CreateCommand()
md.CommandText = "Select * From SalesOrderLine s " & _
" Inner Join Products p " & _
" On s.ProductId = p.ProductId " & _
" Where SalesOrderNumber = @SONumber"
cmd.Parameters.AddWithValue("SONumber", SalesOrderNumber)
Dim lst As New List(Of SalesOrderLine)
Dim sol As SalesOrderLine
con.Open()
rdr = cmd.ExecuteReader()
Do Until rdr.Read
sol = New SalesOrderLine(rdr(0), rdr(1), rdr(2))
lst.Add(sol)
Loop
Return lst
End Function
使用相关的信息扩展这个数据类仅仅是这个不匹配问题的一个解决方案。这种不匹配一般存在于你的业务对象和你的用户接口之间。我在以后的栏目中将研究更高级的解决方案。
另外,如果你开始考虑“噫,所有这些代码看起来很相似...”,那么,你是对的。编写这些对象的代码可以是很单调和很快的。正是像这样的重复的代码促使我创建了我的第一个代码生成解决方案。当然,比我更聪明的人同时在创建对象关系映射工具。这个工具能够为比我愿意处理的更广泛的各种情况生成这种代码。
然而,我在这些栏目的目标是更集中的:支持ObjectDataSource(对象数据源)。我在下一个栏目将重新介绍如何把工厂对象扩展到支持更新。