ADO.NET实现应用程序数据访问层1

本文介绍了一个抽象基类DALBase的设计与实现,该基类简化了数据访问层(Data Access Layer, DAL)中SqlConnection对象的管理和使用。通过示例展示了如何通过继承此基类来减少重复代码,并讨论了在COM+环境中使用的更复杂的服务组件基类。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
Imports System.Data.SqlClient

Namespace ACME.Data

Public MustInherit Class DALBase : Implements IDisposable

 Private _connection As SqlConnection

 Protected Sub New(ByVal connect As String)
  _connection = New SqlConnection(connect)
 End Sub

 Protected ReadOnly Property Connection() As SqlConnection
 Get
  Return _connection
 End Get
End Property

Public Sub Dispose() Implements IDisposable.Dispose
 _connection.Dispose()
End Sub

End Class

End Namespace
                 图1 简单的基类

  正如您在该图中看到的那样,DALBase类被标记为MustInherit(在C#中为abstract),以确保它用于继承关系。该类随后会包含一个在公共构造函数(它接受连接字符串作为参数)中实例化的私有SqlConnection对象。然后,受保护的Connection属性允许派生类访问该连接对象,而IDisposable接口中的Dispose方法则确保该连接对象得以被处理。即使是在下面这个简化的示例中,您也可以从中注意到抽象基类的用处:

Public Class WebData : Inherits DALBase
Public Sub New()
 MyBase.New(ConfigurationSettings.AppSettings("ConnectString"))
End Sub

Public Function GetOrders() As DataSet
 Dim da As New SqlDataAdapter("usp_GetOrders", Me.Connection)
 da.SelectCommand.CommandType = CommandType.StoredProcedure
 Dim ds As New DataSet()
 da.Fill(ds)
 Return ds
End Function
End Class

  在该示例中,WebData类继承自DALBase,因此它不需要考虑实例化SqlConnection对象的问题,而只需通过MyBase关键字(或C#中的base关键字)将连接字符串传递给基类。WebData类的GetOrders方法可以使用Me.Connection(在C#中为this.Connection)访问受保护的属性。尽管该示例相对简单,但如果您看了规则2和规则3的话,就会发现该基类还可以提供其他服务。

  当DAL需要在COM+环境中运行时,抽象基类尤其有用。在这种情况下,因为允许组件使用COM+所需的代码更为复杂,所以创建一个如图2中所示的服务组件基类是有意义的。

<ConstructionEnabled(True), _
Transaction(TransactionOption.Supported), _
EventTrackingEnabled(True)> _
Public MustInherit Class DALServicedBase : Inherits ServicedComponent

Private _connection As SqlConnection

 Protected Overrides Sub Construct(ByVal s As String)
  _connection = New SqlConnection(s)
 End Sub

 Protected ReadOnly Property Connection() As SqlConnection
 Get
  Return _connection
 End Get
End Property

End Class
                     图2 服务组件基类

  在该代码中,DALServicedBase类基本上包含了与图1中相同的功能,但是它另外继承了System.EnterpriseServices命名空间中的ServicedComponent,并且包含了一些属性以指明该组件支持对象结构、事务和统计信息跟踪。然后,该基类负责捕捉在组件服务管理器中配置的结构字符串,并再一次创建和公开SqlConnection对象。需要注意的是,当一个类从DALServicedBase继承时,它还将继承属性的设置。换句话说,派生类也会将它的事务选项设置为Supported。如果该派生类想要重写该行为,则它可以在类级别重新定义该属性。此外,派生类还应该在适当位置对自身利用重载方法和共享方法。主要有两种使用重载方法(具有多个签名的单个方法)的情况。第一,当方法需要接收改变其类型的参数时,可以使用它们。在Framework中,这一类型的典型示例是System.Convert类的方法。例如,ToString方法包括18个接收一个参数的重载方法,每个方法都具有不同的类型。第二,重载方法可以用来公开参数数量不断增加(但不一定是不同类型的参数)的签名。这种类型的重载证明在DAL中非常有效,因为可以使用它来公开用于数据检索和修改的备用签名。例如,可以重载GetOrders方法以便一个签名不接收任何参数并返回所有订单,而另一个签名则接收一个表明调用方只打算检索特定客户订单的参数,如下面的代码所示:

Public Overloads Function GetOrders() As DataSet
Public Overloads Function GetOrders(ByVal customerId As Integer) As DataSet

  在这种情况下,良好的实现技巧是将GetOrders方法的功能抽象到一个可以由每个重载签名调用的私有或受保护的方法中。还可以使用共享方法(在C#中为static方法)来展开可供数据访问类的所有实例访问的字段、属性和方法。尽管不能将共享成员与使用组件服务的类结合使用,但是对于可以在数据访问类的共享构造函数中检索然后被所有实例读取的只读数据来说,它们可能十分有用。在对读/写数据使用共享成员时要特别小心,这是因为多个执行线程可能会竞争使用对共享数据的访问权。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值