2011-01-19 3 views
0

데이터베이스 액세스에 사용한 다음 패턴에 대한 코드 검토를 제공하는 사람은 누구입니까? 기본 아이디어를 보여주기 위해 더 간단한 데이터 계층 중 하나를 제공했습니다.(3 계층) 데이터베이스 액세스 패턴 코드 검토

특히 공유 방법을 사용하는 것이 좋은 아이디어 였고 그로 인해 어떤 문제가 발생할 수 있는지 궁금한 점이 있습니까? 이 구현은 ASP.Net과 같은 스레드 환경에서 실패합니까?

Public Interface IFillable 

    Sub Fill(ByVal Datareader As Data.IDataReader) 

End Interface 

Public Class BaseDataLayer 

    Public Shared Function FillObject(ByVal IFillable As IFillable, ByVal IDatareader As IDataReader) As IFillable 
     If IDatareader.Read Then 
      IFillable.Fill(IDatareader) 
      Return IFillable 
     Else 
      Return Nothing 
     End If 
    End Function 

    Public Shared Function FillCollection(ByVal IFillable As IFillable, ByVal IDatareader As IDataReader) As IFillable 
     IFillable.Fill(IDatareader) 

     Dim list As IList = DirectCast(IFillable, IList) 

     If list.Count > 0 Then 
      Return IFillable 
     Else 
      Return Nothing 
     End If 
    End Function 

End Class 

Public Class SupplierDataLayer 
    Inherits BaseDataLayer 

Public Shared Function GetSupplierListByLastUpdated(ByVal LastUpdated As Date, ByVal FromRow As Integer, ByVal ToRow As Integer, ByVal UserID As Guid) As SupplierList 
     If Not UserID.Equals(Guid.Empty) Then 
      Dim res As New SupplierList 
      Using sqlConn As New SqlConnection(My.Settings.ConnectionString) 
       sqlConn.Open() 

       Using dr As IDataReader = SupplierDataLayer.GetSupplierListByLastUpdatedQuery(sqlConn, LastUpdated, FromRow, ToRow, UserID) 
        Return CType(BaseDataLayer.FillCollection(res, dr), SupplierList) 
       End Using 
      End Using 
     Else 
      Return Nothing 
     End If 
    End Function 

Private Shared Function GetSupplierListByLastUpdatedQuery(ByVal Connection As SqlConnection, ByVal LastUpdated As Date, ByVal FromRow As Integer, ByVal ToRow As Integer, ByVal UserID As Guid) As IDataReader 
     Using sqlCmd As SqlCommand = Connection.CreateCommand 
      With sqlCmd 
       .CommandTimeout = 30 
       .CommandType = CommandType.StoredProcedure 
       .CommandText = "GetSupplierListByLastUpdated" 
       .Parameters.Add("@LastUpdated", SqlDbType.DateTime).Value = LastUpdated 
       .Parameters.Add("@FromRow", SqlDbType.Int).Value = FromRow 
       .Parameters.Add("@ToRow", SqlDbType.Int).Value = ToRow 
       .Parameters.Add("@UserID", SqlDbType.UniqueIdentifier).Value = UserID 

       Return .ExecuteReader 
      End With 
     End Using 
    End Function 
End Class 
+0

가 너무 밀접하게 그것을 통해보고하지 않은,하지만 밖으로 점프 한 가지는 당신이 당신의 DataReader를 폐쇄하지 않을 것입니다. –

+0

sh ** didnt notice ... 사용하여 포장 된 ... 추신 : 감사합니다 –

+0

"코드 검토"로이 태그를 다시 붙였습니다. 동의하지 않으면 다시 알려줄 수 있습니다. –

답변

1

이전에이 패턴을 사용 했으므로 꽤 괜찮습니다. 유일하게,이 패턴은 데이터 액세스 코드를 도메인 개체 레이어에 유출하고 있습니다. 아마도 도메인을 클리너 디자인과 같은 중간 계층 (도메인과 데이터 액세스 사이)으로 추상화하면 매핑 계층과 같은 방식으로 도메인 객체가 어떻게 채워지는지 신경 쓸 필요가 없습니다.

도메인 개체 < -> 매퍼 < -> DAL