2009-03-14 12 views
6

私の現在のアプリケーションは、インスタンスベースのデータアクセス層を使用しています。私は接続文字列でレイヤーをインスタンス化します。次に、ある種のコマンドを実行するメソッドを呼び出します。たとえば、データセットを埋めるメソッドがあります。基本的には、ストアドプロシージャとSQLパラメータを渡してデータセットを取得します。データアクセスやインスタンスベースの静的なクラスを持つ方が良いでしょうか?私はオブジェクトを持つドメイン層を持っていますが、私はORMのようにオブジェクトをマッピングしていません。オブジェクトをファクトリに渡して、データレイヤをインスタンス化してデータセットを取り戻します。次に、データセットをオブジェクトにマップします。私は私のアプリを更新する計画を立てている(そしてC#に移行している)が、全体を変更する時間はない。私は、挿入の更新と削除についても同じことをします。私がやっていることが今のところOKなら、私に知らせてください。あなたはこのアプローチの問題を見ますか?さもなければ、私は何をしていますか?私はこのクラスを書きませんでした。私はそれをオンラインで見つけ、これが私が必要としているものだと思った。ここでデータアクセス層静的またはインスタンスベース?

は、データクラスの例である:

Public Sub New(ByVal connectionString As String) 
     _connectionString = connectionString 
    End Sub 

Public Function FillDataset(ByVal cmd As String, ByVal cmdType As CommandType, Optional ByVal parameters() As SqlParameter = Nothing) As DataSet 
     Dim connection As SqlConnection = Nothing 
     Dim command As SqlCommand = Nothing 
     Dim sqlda As SqlDataAdapter = Nothing 
     Dim res As New DataSet 
     Try 
      connection = New SqlConnection(_connectionString) 
      command = New SqlCommand(cmd, connection) 
      command.CommandType = cmdType 
      AssignParameters(command, parameters) 
      sqlda = New SqlDataAdapter(command) 
      sqlda.Fill(res) 
     Catch ex As Exception 
      'CreateDataEntry(ex, WriteType.ToFile, cmd) 
     Finally 
      If Not (connection Is Nothing) Then connection.Dispose() 
      If Not (command Is Nothing) Then command.Dispose() 
      If Not (sqlda Is Nothing) Then sqlda.Dispose() 
     End Try 
     Return res 
    End Function 

     Public Function ExecuteNonQuery(ByVal spname As String, ByVal ParamArray parameterValues() As Object) As Object 
     Dim connection As SqlConnection = Nothing 
        Dim command As SqlCommand = Nothing 
     Dim res As Object = Nothing 
     Try 
      connection = New SqlConnection(_connectionString) 
      command = New SqlCommand(spname, connection) 
      command.CommandType = CommandType.StoredProcedure 
      command.Parameters.AddRange(parameterValues) 
      connection.Open() 
      command.ExecuteNonQuery() 
      res = command.Parameters(command.Parameters.Count - 1).Value 
     Catch ex As Exception 
      CreateDataEntry(ex, WriteType.ToFile, spname) 
      If Not (transaction Is Nothing) Then 
       transaction.Rollback() 
      End If     
     Finally 
      If Not (connection Is Nothing) AndAlso (connection.State = ConnectionState.Open) Then connection.Close() 
      If Not (command Is Nothing) Then command.Dispose()     
     End Try 
     Return res 
    End Function 

答えて

7

まず、私は、インスタンス・ベースのアプローチが正しいことだと思います。静的クラスを使用すると、DALを単体テストすることが難しくなり、他のクラスを単体テストするときにDALをモックすることが難しくなります。第二に、私はあなた自身のDALの構築を再検討すべきだと思います。既存の(よくテストされた)ORMのようなLINQtoSQL、nHibernate、nTier、さらにはEntity Frameworkを使用することで、DALの作成、保守、テストに多くの時間を費やすことになります。ビジネスニーズに直接役立つコード。私はLINQtoSQLで手作りのDALとORMの両方を行ってきましたが、DALがORMルートをテスト(そして修正)する時間を大幅に短縮することができました。

+0

私は全く同意します。私はLINQtoSQLを使うのが最も好きです。私は既に、私のアプリの次の繰り返しのために書かれたアイデアとコードを持っています。あなたのご意見ありがとうございます! – DDiVita

1

インスタンスベースの方が柔軟性があります。

基礎となるテクノロジを簡単に変更することができます(別の実装を提供するだけです)。

また、データアクセスレイヤーをプロキシすることもできます。私の場合は最近、何かがローカルデータベースにあるかどうかをチェックし、リモートデータベースからそのコピーを取得せずにローカルに保存するかどうかをチェックしました。これは、アプリケーションの残りの部分に対して完全に透過的に行われました。

+1

スタティックベースのDALを使用すると、別の実装を使用できないのを忘れていると思いますか?特定のメソッドに対して異なる処理を行う場合は、メソッドを変更します。私にとっては、DALを使用する点は、呼び出し側のメソッドでデータを直接取得する点です。 –

関連する問題