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データベースとSQLServerデータベースの両方を使用するため、DbTypeは使用するデータベースによって異なります。Oracleの場合、OracleClientオブジェクトには、タイプを含む独自のOracleDbType列挙があります。SQLServerにも独自の列挙型があります。

私の質問は、DatabaseServiceコンストラクターに注入されたリポジトリーに応じて、これらのデータベース固有の列挙を表示することは可能ですか?そうでない場合、これを行うための最良の方法は何ですか?2つのデータベースを分離し、ロジックを共有し、将来の開発を可能にしたいのですが、その開発のコードコントラクトとしてのインターフェイスです。

4

2 に答える 2

0

リポジトリの実装の正確さはさておき、DbType抽象化のレベルを変更します。

これinterfaceはdbに依存しません。

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

db制約付きの実装は、具体的なものにする必要がありますRepository。他にどのようにそれを一般的に保ちたいが、それでも2つのタイプの間で異なりますか?

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の詳細な説明をご覧ください。リポジトリは、データベース固有の情報(dbTypeなど)ではなく、アプリケーションドメインを表すエンティティ/オブジェクトを返す必要があります。リポジトリは、データベースの詳細からユーザーをカプセル化し、DBタイプから適切な.NETタイプへの変換を処理します。

于 2012-04-17T12:24:10.523 に答える