Библиотека SnowMaker .Net для Azure

Я использую вышеуказанную библиотеку в своем веб-приложении vb.net. Человек, который разработал Snowmaker, сказал, что вы не должны создавать новый экземпляр каждый раз, когда вам нужен идентификатор, вы должны использовать базовый синглтон.

Я знаю, что такое синглтоны, но никогда не использовал их. Я сталкивался с этим по переполнению стека

Public NotInheritable Class MySingleton
    Private Shared ReadOnly _instance As New Lazy(Of MySingleton)(Function() New
        MySingleton(), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication)

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As MySingleton
        Get
            Return _instance.Value
        End Get
    End Property
End Class

Вот код, который я использую для генерации идентификаторов

Dim storageAccount As CloudStorageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings("blobStorage").ConnectionString)
Dim ds As New BlobOptimisticDataStore(storageAccount, "container-name")

Dim generator = New UniqueIdGenerator(ds)
Dim ret = generator.NextId(table)

что работает, но как мне включить это в класс singleton, чтобы я вызывал его только один раз из своего веб-приложения?

1 ответ

Решение

Синглтон - это статический объект, который вы можете вызывать столько раз, сколько захотите, и будьте уверены, что он будет выполнять только один вызов за раз.

Вы не создаете экземпляр синглтона, это как уровень класса или глобальный объект, который вы просто вызываете. Вы не включили код для UniqueIdGenerator, но ваш код может выглядеть примерно так:

Imports SnowMaker
Imports Microsoft.WindowsAzure.Storage

Module Module1

    Sub Main()
        Dim storageAccount = CloudStorageAccount.Parse("xxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
        Dim ds As New BlobOptimisticDataStore(storageAccount, "vhds")

        MySingleton.Instance.DataSource = ds
        MySingleton.Instance.Table = "table"
        Dim myid = MySingleton.Instance.NextId
        Dim myid2 = MySingleton.Instance.NextId
        Dim myid3 = MySingleton.Instance.NextId
        Dim myid4 = MySingleton.Instance.NextId

    End Sub

End Module

Тогда ваш синглтон-код будет вызывать ваш генератор

Imports SnowMaker

Public NotInheritable Class MySingleton
    Private Shared ReadOnly _instance = New Lazy(Of MySingleton)(Function() New MySingleton(), System.Threading.LazyThreadSafetyMode.ExecutionAndPublication)
    Private _generator As UniqueIdGenerator

    Private Sub New()
    End Sub

    Public Shared ReadOnly Property Instance() As MySingleton
        Get
            Return _instance.Value
        End Get
    End Property

    Private _ds As BlobOptimisticDataStore
    Public Property DataSource() As BlobOptimisticDataStore
        Get
            Return _ds
        End Get
        Set(ByVal value As BlobOptimisticDataStore)
            _ds = value
        End Set
    End Property

    Private _tableName As String
    Public Property Table() As String
        Get
            Return _tableName
        End Get
        Set(ByVal value As String)
            _tableName = value
        End Set
    End Property

    Private _Id As Integer
    Public ReadOnly Property NextId() As Integer
        Get
            If _generator Is Nothing Then
                _generator = New UniqueIdGenerator(_ds)
            End If
            Return _generator.NextId(_tableName)
        End Get
    End Property

End Class
Другие вопросы по тегам