2009-03-14 10 views
6

현재 응용 프로그램이 인스턴스 기반 데이터 액세스 계층을 사용하고 있습니다. 연결 문자열로 레이어를 인스턴스화합니다. 그런 다음 일종의 명령을 수행 할 메서드를 호출합니다. 예를 들어 데이터 집합을 채울 메소드가 있습니다. 기본적으로 저장 프로 시저 및 모든 SQL 매개 변수를 전달하고 데이터 집합을 가져옵니다. 내 데이터 액세스 또는 인스턴스 기반의 정적 클래스를 사용하는 것이 더 나은가요? 객체가있는 도메인 레이어가 있지만 ORM과 같은 객체를 매핑하지 않습니다. 개체를 공장으로 전달할 때 데이터 계층을 인스턴스화하여 데이터 집합을 다시 가져옵니다. 그런 다음 데이터 세트를 객체에 매핑합니다. 내 앱을 업데이트 할 계획이며 (예, C#으로 옮겨 간다.), 전체 내용을 변경할 시간이 없다. 삽입 업데이트 및 삭제에 대해 동일한 작업을 수행합니다. 내가하고있는 일이 지금은 괜찮다면 알려주세요. 이 접근 방식에 문제가 있습니까? 그렇지 않으면 무엇을해야합니까? 나는이 수업을 쓰지 않았다. 나는 그것을 온라인에서 발견했고, 이것이 내가 필요로하는 것이라고 생각했다. 여기 데이터 액세스 계층 정적 또는 인스턴스 기반?

데이터 클래스의 예는 다음과 같습니다

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을 재검토해야한다고 생각합니다. LINQtoSQL, nHibernate, nTier 또는 심지어 Entity Framework와 같은 기존 (잘 테스트 된) ORM을 사용하여 DAL을 작성, 유지 관리 및 테스트하는 데 많은 시간을 투자합니다. 비즈니스 요구에 직접적으로 이익이되는 코드. 필자의 경우 LINQtoSQL에서 손으로 작성한 DAL과 ORM을 모두 수행했으며 ORM 경로로가는 DAL을 테스트 (및 수정)하는 데 훨씬 적은 시간을 소비하는 것으로 나타났습니다.

+0

전적으로 동의합니다. 나는 LINQtoSQL을 사용할 것이 가장 좋다. 나는 이미 내 애플 리케이션의 다음 반복을 위해 작성된 몇 가지 아이디어와 코드를 가지고있다. 귀하의 의견을 보내 주셔서 감사합니다! – DDiVita

1

인스턴스 기본은보다 유연합니다.

기본 기술을 더 쉽게 변경할 수 있습니다 (다른 구현을 제공함).

데이터 액세스 계층을 프록시 처리 할 수도 있습니다. 내 경우에는 최근에 뭔가를 로컬 데이터베이스에 있는지 확인하고 원격 데이터베이스에서 복사본을 가져 오지 않고 로컬로 저장하는지 확인하기 위해이 작업을 수행했습니다. 이 작업은 나머지 응용 프로그램에 완전히 투명하게 수행되었습니다.

+1

정적 기반 DAL을 사용하는 경우 어떻게 다른 구현을 사용할 수 없습니까? 특정 메소드에 대해 다른 작업을 수행하려면 해당 메소드를 변경하십시오. 필자는 DAL을 사용하는 것이 아니라 호출하는 방법에서 데이터를 곧바로 가져 오는 것입니다. –

관련 문제