我会尝试将所有数据访问逻辑放入数据访问层。理想情况下,这应该位于单独的库和命名空间中,但并非必须如此。我会使用类,通常每个表/实体一个,并将所有类设计为无状态的(因此您不必重复使用数据访问对象的同一实例,您可以在需要时随时实例化一个新的类)访问数据库)。
我不想让它返回数组,而是让它返回数据对象(通常称为 DTO - 数据传输对象)。如果可能的话,我会保持 DTO 类尽可能干净,仅包含公共属性而不包含方法。数据访问类应该全部实现接口,以便可以创建每个数据访问类的多个版本。一个用于 Access,一个用于 Oracle,一个用于 SQL,等等。然后,无论我需要访问数据库的任何地方(希望仅在我的业务层中,而不是在我的 UI 层中),我都会通过它们的“ generic”接口类型(因此需要工厂类将正确的具体数据访问对象类型注入到我的业务对象中)。
这是 DTO 的一个真实简单的示例:
Public Class Employee
Public Id As Guid
Public Name As String
Public StartDate As Date
End Class
这是一个数据访问接口示例
Public Interface IEmployeeDataAccess
Function GetEmployee(id As Guid) As Employee
Function GetEmployees() As List(Of Employee)
End Interface
这是数据访问类的示例:
Public Class SqlEmployeeDataAccess
Inherits IEmployeeDataAccess
Public Function GetEmployee(id As Guid) As Employee Implements IEmployeeDataAccess.GetEmployee
Dim employee As New Employee()
' Connect to SQL DB and populate employee DTO object
Return employee
End Function
Public Function GetEmployees() As List(Of Employee) Implements IEmployeeDataAccess.GetEmployees
Dim employees As New List(Of Employee)()
' Connect to SQL DB and populate list of employee DTO objects
Return employees
End Function
End Interface
然后你可以创建类似的类AccessEmployeeDataAccess
and OracleEmployeeDataAccess
它还实现了 IEmployeeDataAccess 接口。然后,同样在数据访问层中,我将为每个受支持的数据库提供程序创建一个工厂类。我会让所有 DataAccess 工厂实现相同的接口,如下所示:
Public Interface IDataAccessFactory
Function NewEmployeeDataAccess() As IEmployeeDataAccess
End Interface
Public Class SqlDataAccessFactory
Implements IDataAccessFactory
Public Function NewEmployeeDataAccess() As IEmployeeDataAccess
Return New SqlEmployeeDataAccess()
End Function
End Class
然后,在我的商务课上,我可能会做这样的事情:
Public Class EmployeeBusiness
Public Sub New(employeeDataAccess As IEmployeeDataAcess)
_employeeDataAccess = employeeDataAccess
End Sub
Private _employeeDataAccess As IEmployeeDataAcess
Public Function GetEmployee(id As Guid) As Employee
Return _employeeDataAccess.GetEmployee(id)
End Function
End Class
然后在我的企业工厂中,我会做这样的事情:
Public Class BusinessFactory
Public Sub New()
Select Case dataAccessType
Case "SQL"
_dataAccessFactory = New SqlDataAccessFactory()
Case "Oracle"
_dataAccessFactory = New OracleDataAccessFactory()
Case "Access"
_dataAccessFactory = New AccessDataAccessFactory()
End Select
End Sub
_dataAccessFactory As IDataAccessFactory
Public Function NewEmployeeBusiness() As IEmployeeBusiness
Return New EmployeeBusiness(_dataAccessFactory.NewEmployeeDataAccess())
End Function
End Class
通过使用一组可与任何数据库提供程序一起使用的数据访问对象,可以大大简化这一过程。为此,您只需使用基本 ADO 类型,如 IDbConnection 而不是 SqlConnection,以及 IDbCommand 而不是 SqlCommand。然后,只要 DataAccess 类需要一个连接,您的数据访问对象就可以请求一个 DB Provider 工厂,该工厂可以创建一个新连接等。然而,当您只是调用存储过程或其他东西时,这更容易做到。通常,特别是当您在代码中动态构建 SQL 语句时,提供程序之间存在太多差异,因此您不能仅对所有数据库提供程序使用相同的 DataAccess 类。
但是,那只是我...