使用Singleton模式进行LINQ to SQL持久化 - 好主意?

时间:2011-04-16 01:38:41

标签: .net vb.net linq-to-sql

我有一个表,Users,带有相关的子表UserSecurityGroups。在我的GUI中,操作员将从列表中选择用户。该程序将检索用户记录并允许操作员以一种形式编辑用户数据。操作员还可以在另一个表单上编辑该用户的UserSecurityGroup。

我正在考虑使用单例类进行用户实例检索并持久化回数据库。如果这是一个很好的做法,我想在我的数据库中使用它与许多其他表。我的问题是:这是一个好习惯吗?我错过了什么陷阱?作为替代方案,您会推荐什么?你的建议是否会改变,因为我也有三个或四个关系级别的表格(而不是上面例子中的两个)?

这是我建议的代码:

Imports System.Data.Linq

Public Class UserConduit
    Implements IDisposable

    Private Shared _thisUserConduit As UserConduit
    Private Shared _thisContext As VulcanDataContext

    Protected Sub New()
        _thisContext = New VulcanDataContext
    End Sub

    Public Shared Function GetInstance()

        If _thisUserConduit Is Nothing Then
            _thisUserConduit = New UserConduit
        End If

        Return _thisUserConduit

    End Function

    Public Function GetUserByID(ByVal thisUserName As String) As User

        Return _thisContext.Users.SingleOrDefault(Function(u) u.Username = thisUserName)

    End Function

    Public Function Save() As ChangeSet

        Dim thisSet = _thisContext.GetChangeSet

        Try
            _thisContext.SubmitChanges()

        Catch ex As Exception
            Throw

        End Try

        Return thisSet

    End Function

    Public Function Save(ByVal thisUser As User) As ChangeSet

        If thisUser.Modified Is Nothing Then
            _thisContext.Users.InsertOnSubmit(thisUser)
        End If

        Return Save()

    End Function


#Region " IDisposable Support "
    Private disposedValue As Boolean = False        ' To detect redundant calls

    ' IDisposable
    Protected Overridable Sub Dispose(ByVal disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' free other state (managed objects).
                _thisContext.Dispose()
            End If

            ' free your own state (unmanaged objects).
            ' set large fields to null.
        End If
        Me.disposedValue = True
    End Sub


    ' This code added by Visual Basic to correctly implement the disposable pattern.
    Public Sub Dispose() Implements IDisposable.Dispose
        ' Do not change this code.  Put cleanup code in Dispose(ByVal disposing As Boolean) above.
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class

1 个答案:

答案 0 :(得分:3)

Singleton现在通常被认为是一种反模式。这并不是说在某些情况下你不想保证只有一个特定类型的实例...但更好的解决方案是使用一个控制反转(IoC)容器(如StructureMap)来包装你的输入单身人士。我相信企业库的Policy Injection块也会这样做。

根据我的经验,就处理关系而言,LINQ to SQL的功能有限......您最终可能会对每个相关表产生额外的查询。我们正在考虑转向NHibernate,因为其他查询正在成为一个性能问题。