2011-04-01 5 views
0

응용 프로그램에서 여러 언어를 사용할 수 있도록 VB NET에서 언어 사전을 작성하려고합니다.VB NET에서 전역 개체를 만드는 방법

이 사전에는 데이터베이스에서 전체 사전을로드하고이를 메모리에 저장하는 init 메소드가 있습니다.

나머지 클래스에서는 참조를 추가했으며 메서드를 공유하기 때문에 새 인스턴스를 만들지 않고 개체를 직접 사용할 수 있습니다.

내 질문은 내가 Language.GetWord 메서드에만 액세스하는 클래스의 나머지 클래스가 My.Settings 클래스와 같은 방식으로 컬렉션의 적절한 레코드를 가져 오도록 사전 콘텐츠를로드해야합니다.

MySettings를 모든 클래스에서 사용하면 값이로드됩니다. 나는 같은 효과를 찾고있다.

클래스의 코드입니다 : 응용 프로그램이로드가 순서대로 데이터베이스에 한 번에 액세스 할 때

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가 단어가있는 모음에 액세스하고 그 결과를 반환해야합니다. 문제는 인스턴스가 같지 않고 클래스가이를 사용할 때 사전이로드되지 않는다는 것입니다.

감사합니다. 물론

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 

의 라인을 따라

+0

어쨌든 모든 예외를 포착하는 것에 대해 경고하겠습니다. 숨기고 싶지 않은 오류를 숨길 수 있습니다. 'Collection (컬렉션) '이 아닌 사전을 저장하려면'Dictionary (String, String)'을 사용해야합니다. 그런 식으로 레이블이 'ContainsKey' 메쏘드로 존재하는지 검사하고 예외 기반 제어 흐름을 피할 수 있습니다. 또한 실패한 경우에도 SQL 물건을 닫을 수 있도록'Using' 문 (또는 오래된 VB.NET 버전에서'Try-Finally')을 사용해야합니다. –

+0

Anton와 Martinho는 이전 질문 중 일부를 다시 방문하도록 설득하려고 노력하고 있으며, 질문에 대한 답변이 좋으면 대답 옆의 체크 표시를 클릭하여 ** 수락합니다. – MarkJ

답변

0

무엇인가, 당신은 theDefaultCultureIdYouWant에 대한 값을 제공해야합니다, 당신은 사용자가 단지 명시 적으로 특정 문화를 언급하지 않고 GetWord를 호출하는 경우 발생하려는 작업에 따라 달라집니다.

+0

안녕하세요, 답변 주셔서 감사합니다, 문제는 LoadLanguage가 데이터베이스에 액세스하는 방법이며 성능이 많이 저하됩니다. LoadLanguage 메서드는 한 번 호출해야합니다. – Nemesys

+1

@Nemesys : CurrentLanguage를 Nothing으로 다시 설정하지 않는 한 LoadLanguage 메서드가 한 번 호출됩니다. –

+0

@Nemesys : 귀하의 이해를 돕기 위해 의견을 추가했습니다. 그리고 내 대답이 도움이된다고 생각한다면 그것을 upvote 받아 받아들이십시오. –

관련 문제