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

来源:互联网 发布:御天神帝txt下载知轩 编辑:程序博客网 时间:2024/05/21 07:02
Public Sub New(ByVal connect As String)
 _connection = New SqlConnection(connect)
 _dalSwitch = New BooleanSwitch("DAL", "Data Access Code")
End Sub
  BooleanSwitch的参数包括它的名称和说明。您随后可以添加一个受保护属性,以便将开关打开和关闭,并添加另一个受保护属性,以便使用Trace对象的WriteLineIf方法来格式化和写入跟踪消息:

Protected Property TracingEnabled() As Boolean
 Get
  Return _dalSwitch.Enabled
 End Get
 Set(ByVal Value As Boolean)
  _dalSwitch.Enabled = Value
 End Set
End Property

Protected Sub WriteTrace(ByVal message As String)
 Trace.WriteLineIf(Me.TracingEnabled, Now & ": " & message)
End Sub
  这样,派生类无须自己了解开关类和侦听器类,就可以在数据访问类中发生重大事件时轻松地调用WriteTrace方法。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.diagnostics>
<switches>
<add name="DAL" value="1" />
</switches>
<trace autoflush="true" indentsize="4">
<listeners>
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="DALLog.txt"/>
</listeners>
</trace>
</system.diagnostics>
</configuration>                     图3 跟踪配置

  要创建侦听器并将其打开,还可以使用应用程序配置文件。图3显示了一个简单的配置文件,它打开刚刚显示的DAL开关,并通过名为myListener的TextWriterTraceListener将它的输出定向到DALLog.txt文件。当然,您还可以通过从TraceListener类派生并将侦听器直接包含在DAL中,来通过编程方式创建自己的侦听器。

Public Class DALException : Inherits ApplicationException

 Public Sub New()
  MyBase.New()
 End Sub

 Public Sub New(ByVal message As String)
  MyBase.New(message)
 End Sub

 Public Sub New(ByVal message As String, ByVal innerException As Exception)
  MyBase.New(message, innerException)
 End Sub

 '''' Add custom members here
 Public ConnectString As String
End Class                       图4 自定义异常类

  毫无疑问,您应该利用的另一个基础结构是结构化异常处理(SEH)。在最基本的级别,DAL可以公开它自己从System.ApplicationException继承的Exception对象,并且还可以公开自定义成员。例如,图4中所示的DALException对象可以用来包装由数据访问类中的代码引发的异常。然后,基类可以公开一个受保护的方法以包装异常、填充自定义成员并将其传回调用方,如下所示:

Protected Sub ThrowDALException(ByVal message As String, _
ByVal innerException As Exception)

Dim newMine As New DALException(message, innerException)

newMine.ConnectString = Me.Connection.ConnectionString
Me.WriteTrace(message & "{" & innerException.Message & "}")
Throw newMine
End Sub
  这样,派生类可以轻松地调用受保护的方法,传入所截获的特定于数据的异常(通常为SqlException或OleDbException),并添加一个与特定数据域有关的消息。基类在DALException中包装该异常,并将其传回调用方。这使得调用方可以使用单个Catch语句轻松地捕获来自DAL的所有异常。有关信息,请参阅MSDN上发布的 《Exception Management Application Block Overview》一文(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnbda/html/emab-rm.asp)。该框架通过一组对象将异常的发布与应用程序日志耦合在一起。实际上,您可以通过从.NET Framework提供的BaseApplicationException类继承自己的自定义异常类,来将它们插入到该框架中。