2011-04-01 68 views
0

爲了能夠在應用程序中使用多種語言,我正在試圖在VB .NET中構建一個語言字典。如何在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必須訪問具有單詞的集合並返回結果。問題在於實例不一樣,當類使用它時字典不會被加載。

謝謝。

+0

無論如何,讓我警告要捕捉所有的例外。它可以隱藏你不想隱藏的錯誤。你應該使用'Dictionary(Of String,String)'來存儲你的字典,而不是'Collection'。這樣你就可以檢查標籤是否與'ContainsKey'方法一起存在,並避免基於異常的控制流。而且你還應該使用'Using'語句(或者在早期的VB.NET版本中使用'Try-Finally')來確保你關閉SQL的東西,即使它失敗了。 – 2011-04-01 11:14:18

+0

Anton和Martinho試圖說服你重新回顧一些你的老問題,如果有人對這個問題提供了很好的答案,**點擊答案旁邊的勾號接受**。 – MarkJ 2011-04-01 12:45:59

回答

0

東西沿着

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沒有明確提及具體的文化發生什麼。

+0

嗨,謝謝你的回答,問題是LoadLanguage訪問數據庫的方法,它會導致性能的高損失。 LoadLanguage方法必須被調用一次。 – Nemesys 2011-04-01 11:09:47

+1

@Nemesys:只要您不將CurrentLanguage再次設置爲Nothing,LoadLanguage方法將被調用一次。 – 2011-04-01 11:11:18

+0

@Nemesys:我爲您更好的理解添加了評論。如果您認爲我的回答有幫助,請提出並接受它。 – 2011-04-01 12:09:17