Как создать глобальный объект в VB NET - PullRequest
0 голосов
/ 01 апреля 2011

Я пытаюсь создать языковой словарь в VB NET, чтобы иметь возможность иметь несколько языков в приложении.

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

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

Мой вопрос заключается в том, как мне загрузить контент словаря, чтобы остальные классы, имеющие доступ только к методу Language.GetWord, получили правильную запись коллекции, так же как и класс My.Settings.

Когда My.Settings используется из любого класса, значения загружаются. Я ищу тот же эффект.

Это код класса:

Public Class LanguageProvider
    Private Shared CurrentLanguage As Collection

    Public Shared ReadOnly Property GetWord(ByVal Label As String)
        Get
            Try
                Return CurrentLanguage.Item(Label)
            Catch ex As Exception
                Return Label
            End Try
        End Get
    End Property
    Public Shared Sub LoadLanguage(ByVal CultureId As Integer)
        Dim SQLController As New SqlDataAccessController
        SQLController.SQLSentence = "SELECT DNF_CULTURE_LANGUAGE_LABELS.LABEL, DNF_CULTURE_LANGUAGE_LABELS.VALUE FROM DNF_CULTURE_LANGUAGE_LABELS WHERE DNF_CULTURE_LANGUAGE_LABELS.CULTUREID = " & CultureId & " ORDER BY LABEL;"

        SQLController.OpenConnection()
        Dim dr As SqlClient.SqlDataReader
        dr = SQLController.GetData()

        CurrentLanguage = New Collection

        While dr.Read()
            CurrentLanguage.Add(dr.Item("Value"), dr.Item("Label"))
        End While

        dr.Close()
        SQLController.CloseConnection()
    End Sub
End Class

Функция LoadLanguage должна вызываться при загрузке приложения, чтобы один раз получить доступ к базе данных.

После этого свойства GetWord должен получить доступ к коллекции со словами и вернуть результат. Проблема в том, что экземпляры не совпадают, и словарь не загружается, когда его использует класс.

Спасибо.

1 Ответ

0 голосов
/ 01 апреля 2011

Что-то вроде

Public Shared ReadOnly Property GetWord(ByVal Label As String)
    Get
        Try
            If CurrentLanguage Is Nothing then
                  LoadLanguage(theDefaultCultureIdYouWant)
                  ' Now CurrentLanguage is not Nothing any more,
                  ' so LoadLanguage won't be called again
            end if
            Return CurrentLanguage.Item(Label)
        Catch ex As Exception
            Return Label
        End Try
    End Get
End Property

Конечно, вы должны указать значение theDefaultCultureIdYouWant, в зависимости от того, что вы хотите, если пользователь просто вызывает GetWord, не упоминаяспецифическая культура.

...