设计.NET应用程序数据访问层五大原则 3
点击次数:29 次 发布日期:2008-11-26 10:38:18 作者:源代码网
|
源代码网推荐 源代码网推荐 在你设计数据访问类的方法时,需要考虑它们怎样接受和返回数据。对大多数开发人员来说,主要有三个选择:直接使用ADO.NET对象、使用XML、使用自定义类。 源代码网推荐 源代码网推荐 如果直接暴露ADO.net对象,你能使用一到两个编程模型。第一个包括数据集和数据表对象,它们对不连接数据访问很有用。有很多关于数据集和与它关联的数据表的文章,但是当你必须使用从下层数据存储断开的数据时它才最有用处。换句话说,数据集能在应用程序各层之间传递,即使那些层在物理上是分布式的,当业务和数据服务层放置在同一群服务器上并且与表现服务分开时也能使用。此外,数据集对象是通过基于XML的Web服务返回数据的理想方法,因为它们是可串行化的,因此能在SOAP回应消息中返回。 源代码网推荐 源代码网推荐 这与使用实现IDataReader接口的类(例如SqlDataReader 和OleDbDataReader)访问数据不同。数据阅读器(data reader)用只向前的,只读的方式访问数据。两者之间最大的不同是数据集和数据表对象能在应用程序域之间传递,通过传递值(by value)实现,然而数据阅读器能在各处传递,但是一般通过引用(by reference)实现。在列表5中,Read和GetValues在服务器过程中执行并且它们的返回值复制到客户端。 源代码网推荐
源代码网推荐 图1.远程数据阅读器 源代码网推荐 源代码网推荐 该图显示了数据阅读器怎样存活在应用程序域中,它在那儿它被建立,并且对它的所有访问结果都在客户端和服务器应用程序域之间的循环之中。这意味着当数据访问方法在相同的应用程序域运行时,应该返回数据阅读器作为调用者。 源代码网推荐 源代码网推荐 使用数据阅读器时有两个问题需要考虑。首先,当你从数据访问类的一个方法返回数据阅读器时,你必须考虑与数据阅读器关联的连接对象的生存期。默认情况是当调用程序通过数据阅读器重复时连接仍然是忙的,不幸的是当调用程序结束后,连接仍然打开,因此它不返回到连接池(如果允许连接池)。但是,当通过传递CommandBehavior.CloseConnection 枚举给command对象的ExecuteReader方法,连接的Close方法被调用时,你能命令数据阅读器关闭它的连接。 源代码网推荐 源代码网推荐 其次,为了把表现层从特定的框架组件数据提供程序(例如SqlClient或者OleDb)中分离出来,调用代码应该使用IDataReader接口(例如SqlDataReader)而不是具体类型来引用返回值。通过这种方法,如果应用程序后端从Oracle移植到 SQL Server,或者数据访问类的一个方法的返回类型改变了,表现层也不需要更改。 源代码网推荐 源代码网推荐 如果你希望数据访问类返回XML,你可以从System.Xml名字空间中的XmlDocument和XmlReader中选择一个,它与数据集和IDataReader类似。换句话说,当数据从数据源断开时你的方法应该返回一个XmlDocument(或者XmlDataDocument),然而XmlReader可用于访问XML数据的流。 源代码网推荐 源代码网推荐 最后,你也能决定与公共属性一起返回自定义类。这些类可以使用Serialization(串行化)属性标记,这样它们就能跨越应用程序域复制。另外,如果你从方法中返回多个对象,就需要强化类型(strongly typed)的集合类。 源代码网推荐 源代码网推荐 源代码网推荐 Imports System.Xml.Serialization 源代码网推荐 源代码网推荐 <Serializable()> _ 源代码网推荐 Public Class Book : Implements IComparable 源代码网推荐 <XmlAttributeAttribute()> Public ProductID As Integer 源代码网推荐 Public ISBN As String 源代码网推荐 Public Title As String 源代码网推荐 Public Author As String 源代码网推荐 Public UnitCost As Decimal 源代码网推荐 Public Description As String 源代码网推荐 Public PubDate As Date 源代码网推荐 源代码网推荐 Public Function CompareTo(ByVal o As Object) As Integer _ 源代码网推荐 Implements IComparable.CompareTo 源代码网推荐 Dim b As Book = CType(o, Book) 源代码网推荐 Return Me.Title.CompareTo(b.Title) 源代码网推荐 End Function 源代码网推荐 End Class 源代码网推荐 源代码网推荐 Public NotInheritable Class BookCollection : Inherits ArrayList 源代码网推荐 Default Public Shadows Property Item(ByVal productId As Integer) _ 源代码网推荐 As Book 源代码网推荐 Get 源代码网推荐 Return Me(IndexOf(productId)) 源代码网推荐 End Get 源代码网推荐 Set(ByVal Value As Book) 源代码网推荐 Me(IndexOf(productId)) = Value 源代码网推荐 End Set 源代码网推荐 End Property 源代码网推荐 源代码网推荐 Public Overloads Function Contains(ByVal productId As Integer) As _ 源代码网推荐 Boolean 源代码网推荐 Return (-1 <> IndexOf(productId)) 源代码网推荐 End Function 源代码网推荐 源代码网推荐 Public Overloads Function IndexOf(ByVal productId As Integer) As _ 源代码网推荐 Integer 源代码网推荐 Dim index As Integer = 0 源代码网推荐 Dim item As Book 源代码网推荐 源代码网推荐 For Each item In Me 源代码网推荐 If item.ProductID = productId Then 源代码网推荐 Return index 源代码网推荐 End If 源代码网推荐 index = index + 1 源代码网推荐 Next 源代码网推荐 Return -1 源代码网推荐 End Function 源代码网推荐 源代码网推荐 Public Overloads Sub RemoveAt(ByVal productId As Integer) 源代码网推荐 RemoveAt(IndexOf(productId)) 源代码网推荐 End Sub 源代码网推荐 源代码网推荐 Public Shadows Function Add(ByVal value As Book) As Integer 源代码网推荐 Return MyBase.Add(value) 源代码网推荐 End Function 源代码网推荐 End Class 源代码网推荐 列表6.使用自定义类 源代码网推荐 源代码网推荐 源代码网推荐 源代码网推荐 上列表(列表6)包含了一个简单的Book类和与它关联的集合类的例子。你能注意到Book类用Serializable做了标记,使它跨越应用程序域能使用"by value"语法。该类实现了IComparable接口,因此当它包含在一个集合类中的时候,默认情况下它将按Title排序。BookCollection类从System.Collections名字空间的ArrayList衍生,并且为了将该集合限制到Book对象而隐藏了Item属性和ADD方法。 源代码网推荐 源代码网推荐 通过使用自定义类你完全地控制了数据的表现、开发人员的效率并且没有依赖ADO.NET的调用。但是这种途径需要更多的代码,因为.NET框架组件没有包含任何与对象相关的技术映射。在这种情况下,你应该在数据访问类中建立一个数据读取器并使用它来组合自定义类。 源代码网推荐 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
