使用语句或GC处理连接

时间:2015-06-29 09:39:40

标签: .net vb.net design-patterns

我正在使用一种模式,其中构造函数将IDbConnection实例注入到我的类中,然后在与Dapper一起使用以使用数据库中的对象填充List之前将其分配给局部变量。

我知道最佳做法是将连接对象包装在using语句中,但是当我尝试重用连接来重新加载对象时,我不能因为连接已被处理掉了。我可以在LoadValues方法中打开和关闭连接,并信任类析构函数来处理我的对象而不是使用using语句吗?也许有一种更好的方式我没有考虑过?

这是我的班级:

Public Class AmountLookup : Implements INAmountLookup
    Private _listOfRecords As New List(Of NAmount)
    Private ReadOnly _mfConnection As IDbConnection
    Private ReadOnly _fRepository As IFRepository

    Sub New(mfConnection As IDbConnection,
            fRepository As IFRepository)
        _mfConnection = mfConnection
        _fRepository = fRepository
        LoadValues()
    End Sub

    Public Sub LoadValues() Implements INAmountLookup.LoadValues
        LoadValues(DateGateway.GetLastWorkingDayOfPreviousMonth)
    End Sub

    Public Sub LoadValues(currentNDate As Date) Implements INAmountLookup.LoadValues
        _listOfRecords.Clear()

        Dim sql = String.Format(SqlFactory.GetSql(DBC.SQLs.ValidatedNAmounts),
                                _fRepository.GetFormattedListOfFsForSqlSearch,
                                Format(currentNDate, DBC.DateFormats.MfDate))

        Using _mfConnection
            _mfConnection.Open()
            _listOfRecords = _mfConnection.Query(Of NAmount)(sql).ToList
            _mfConnection.Close()
        End Using
    End Sub

    Public Function Find(fCodeValue As String) As NAmount Implements INAmountLookup.Find
        Dim myList = _listOfRecords.Where(Function(x) x.FCode = fCodeValue)
        Return myList.SingleOrDefault()
    End Function
End Class

1 个答案:

答案 0 :(得分:1)

如果您正在通过连接,那么您不应该处置它,除非您还要承担连接的生命周期的责任,即通过连接的事情知道他们正在将连接的所有权转移给您的班级,如果您的课程成为所有者后,不会尝试将其交给其他人或尝试使用。

听起来这不是那种情况(因为其他东西也试图使用它)所以你应该做两件事之一:

  • 假设给你连接的对象仍然是所有者,所以留给他们处理它(并可能打开和关闭它)
  • 将所有权转让给您的班级,因此不要向其他任何人提供相同的连接。