ADO.NET实现应用程序数据访问层
规则2:遵守设计准则
在Visual Studio .net随附的联机文档中,有一个标题为“Design Guidelines for Class Library Developers”的主题,它不仅论述您应该遵循的重载成员、构造函数和事件的模式,而且还讨论了类、属性和方法的命名约定。您应该遵守命名约定的主要原因之一是.NET Framework提供的交叉语言继承。如果您要在Visual Basic .NET中生成一个DAL基类,则您需要确保那些使用与.NET Framework兼容的其他语言的开发人员可以从它继承,并能容易地理解它的工作方式。按照我概述过的准则去做,那么您的命名约定和结构将不会是特定于语言的了。举个例子,您会在本文的代码示例中注意到,Camel大小写风格(首个单词小写,并夹杂大写字母)用于方法的参数,Pascal大小写风格(每个单词都大写)用于方法,而基类则具有Base后缀以表示它是一个抽象类。.NET Framework设计准则的必然结果是常规设计模式,就像Gang of Four撰写的Design Patterns(Addison-Wesley, 1995)中所介绍的那些设计模式一样。例如,.NET Framework使用了Observer模式的一个名为Event模式的变体(您在类中公开事件时应当遵循该模式)。
规则3:利用基础结构
.NET Framework包含一些可以帮助处理与基础结构相关的一般性任务(例如,检测和异常处理)的类和结构,通过基类将这些概念与继承相结合可能十分有用。例如,请考虑在System.Diagnostics命名空间中公开的跟踪功能。除了Trace和Debug类,该命名空间还包括从Switch和TraceListener派生的类。Switch类—BooleanSwitch和TraceSwitch,可以通过编程方式以及通过应用程序的配置文件而被配置为打开和关闭。就TraceSwitch而言,可以公开多个级别的跟踪。TraceListener类—TextWriterTraceListener和EventLogTraceListener将Trace和Debug方法的输出分别定向到文本文件和事件日志。因此,您可以将跟踪功能添加到基类中,以便派生类可以轻松地记录消息。继而,应用程序可以使用应用程序配置文件来控制是否启用跟踪。您可以通过包含一个BooleanSwitch类型的私有变量并在构造函数中将其实例化,以将该功能添加到DALBase类中:
BooleanSwitch的参数包括它的名称和说明。您随后可以添加一个受保护属性,以便将开关打开和关闭,并添加另一个受保护属性,以便使用Trace对象的WriteLineIf方法来格式化和写入跟踪消息:Public Sub New(ByVal connect As String) _connection = New SqlConnection(connect) _dalSwitch = New BooleanSwitch("DAL", "Data Access Code") End Sub
这样,派生类无须自己了解开关类和侦听器类,就可以在数据访问类中发生重大事件时轻松地调用WriteTrace方法。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
<?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>
要创建侦听器并将其打开,还可以使用应用程序配置文件。上面显示了一个简单的配置文件,它打开刚刚显示的DAL开关,并通过名为myListener的TextWriterTraceListener将它的输出定向到DALLog.txt文件。当然,您还可以通过从TraceListener类派生并将侦听器直接包含在DAL中,来通过编程方式创建自己的侦听器。
毫无疑问,您应该利用的另一个基础结构是结构化异常处理(SEH)。在最基本的级别,DAL可以公开它自己从System.ApplicationException继承的Exception对象,并且还可以公开自定义成员。例如,下面所示的DALException对象可以用来包装由数据访问类中的代码引发的异常。然后,基类可以公开一个受保护的方法以包装异常、填充自定义成员并将其传回调用方,如下所示: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
这样,派生类可以轻松地调用受保护的方法,传入所截获的特定于数据的异常(通常为SqlException或OleDbException),并添加一个与特定数据域有关的消息。基类在DALException中包装该异常,并将其传回调用方。这使得调用方可以使用单个Catch语句轻松地捕获来自DAL的所有异常。该框架通过一组对象将异常的发布与应用程序日志耦合在一起。实际上,您可以通过从.NET Framework提供的BaseApplicationException类继承自己的自定义异常类,来将它们插入到该框架中。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
0
相关文章