Библиотека 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