Использовать шаблон Singleton для устойчивости LINQ to SQL - хорошая идея? - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть таблица Users с связанной дочерней таблицей UserSecurityGroups. В моем графическом интерфейсе оператор выберет пользователя из списка. Программа получит пользовательскую запись и позволит оператору редактировать пользовательские данные в одной форме. Оператор также может редактировать группы UserSecurity этого пользователя в другой форме.

Я рассматриваю возможность использования одноэлементного класса для извлечения пользовательского экземпляра и его сохранения в базе данных. Если это хорошая практика, я хочу использовать это со многими другими таблицами в моей БД. Мой вопрос: это хорошая практика? Какие подводные камни мне не хватает? Что бы вы посоветовали в качестве альтернативы? Изменится ли ваша рекомендация, поскольку у меня также есть таблицы с тремя или четырьмя уровнями отношений (в отличие от двух в приведенном выше примере)?

Вот мой предложенный код:

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 Ответ

3 голосов
/ 16 апреля 2011

Синглтон обычно считается анти-паттерном в наши дни.Это не означает, что не существует ситуаций, когда вы хотите гарантировать, что существует только один экземпляр определенного типа ... но лучшим решением является использование контейнера с инверсией управления (IoC), такого как StructureMap, чтобы обернуть вашвведите синглтон.Я полагаю, что блок «Внедрение политики» в Enterprise Library также сделает это.

По моему опыту, LINQ to SQL ограничен в том, что вы можете сделать, что касается обработки отношений ... вы можете легко получить дополнительный запросдля каждой связанной таблицы.Мы ожидаем перехода на NHibernate, поскольку дополнительные запросы становятся проблемой производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...