我有一个表,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
答案 0 :(得分:3)
Singleton现在通常被认为是一种反模式。这并不是说在某些情况下你不想保证只有一个特定类型的实例...但更好的解决方案是使用一个控制反转(IoC)容器(如StructureMap)来包装你的输入单身人士。我相信企业库的Policy Injection块也会这样做。
根据我的经验,就处理关系而言,LINQ to SQL的功能有限......您最终可能会对每个相关表产生额外的查询。我们正在考虑转向NHibernate,因为其他查询正在成为一个性能问题。