2

vb.net Web アプリで上記のライブラリを使用しています。Snowmaker の開発者は、ID が必要になるたびに新しいインスタンスを作成するのではなく、基本的なシングルトンを使用する必要があると述べています。

シングルトンとは何かは知っていますが、使用したことはありません。スタックオーバーフローでこれに遭遇しました

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

IDの生成に使用しているコードは次のとおりです

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)

これは機能しますが、それをシングルトン クラスに組み込んで、Web アプリから 1 回だけ呼び出すにはどうすればよいでしょうか?

4

1 に答える 1

1

シングルトンは、何度でも呼び出すことができる静的オブジェクトであり、一度に 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
于 2013-08-14T15:17:03.157 に答える