1

这是我目前的设置:

Public Interface IDatabase
   Function CreateParameter(name as String, dbType as <dbTypeEnumeration>)
End Interface

Public Class OracleDatabaseRepository
    Implements IDatabase
    Public Function CreateParameter(ByVal name As String, ByVal dbtype As <dbTypeEnumeration>) As Object
    End Function
End Class

Public Class SQLServerRepository
    Implements IDatabase
    Public Function CreateParameter(ByVal name As String, ByVal dbtype As <dbTypeEnumeration>) As Object
    End Function
End Class

Public Class DatabaseService
    Private _rep As IDatabase
    Sub New(ByRef rep As IDatabase)
        _rep = rep
    End Sub
    Public Function CreateParameter(ByVal name As String, ByRef dbtype As <dbTypeEnumeration>) As Object
       _rep.CreateParameter(name, dbtype)
    End Function
End Class

这里的问题是 dbTypeEnumeration 到底是什么。在上面的示例中,它只是我的问题所在的占位符。由于我们同时使用 Oracle 和 SQL Server 数据库,因此 DbType 因所使用的数据库而异。对于 Oracle,OracleClient 对象有自己的 OracleDbType 枚举类型。SQL Server 也有自己的枚举。

我的问题是:是否可以根据注入 DatabaseService 构造函数的存储库来显示那些特定于数据库的枚举?如果没有,最好的方法是什么?我想分离两个数据库,共享逻辑,并允许未来的开发,将接口作为该开发的代码契约。

4

2 回答 2

0

撇开存储库实现的正确性不谈,我会更改DbType抽象级别。

interface与数据库无关。

Public Interface IDatabase
    Function CreateParameter(ByVal name As String, ByVal type As Type) As Object
End Interface

db 约束的实现应该在你的具体Repository本身中。您还希望如何保持其通用性但在两种类型之间仍然存在差异?

Public Class SqlServerRepo : Implements IDatabase

    Private Shared typeLookup As Dictionary(Of Type, Data.SqlDbType) = New Dictionary(Of Type, SqlDbType)

    Shared Sub New()
       (...Fill the dict according to your specification ...)
    End Sub

    Public Function CreateParameter(name As String, type As Type) As Object Implements IDatabase.CreateParameter
        Dim concreteDbType = typeLookup(type)
        (.. your parameter creation here ..)
    End Function
End Class

Public Class OracleServerRepo : Implements IDatabase

    Private Shared typeLookup As Dictionary(Of Type, OracleType) = New Dictionary(Of Type, OracleType)

    Shared Sub New()
        (...Fill the dict according to your specification ...)
    End Sub

    Public Function CreateParameter(name As String, type As Type) As Object Implements IDatabase.CreateParameter
        Dim concreteDbType = typeLookup(type)
         (.. your parameter creation here ..)
    End Function
End Class
于 2012-04-17T12:40:39.427 回答
0

尽管您的类中有存储库一词,但它们并没有真正遵循存储库设计模式。看看这个MSDN 对 Repository Design Pattern 的详细描述。存储库应返回代表应用程序域的实体/对象,而不是数据库特定信息(即 dbType)。存储库从数据库详细信息中封装用户,并将处理将 DB 类型转换为适当的 .NET 类型。

于 2012-04-17T12:24:10.523 回答