2009-10-14 5 views
0

J'ai la classe suivante qui est une implémentation singleton:correctement Définition d'un Singleton dans asp.net

Imports Microsoft.VisualBasic 
Imports System.Xml 


Public Class GlobalController 

    Private Shared instance As GlobalController 
    Private ControlsXmlDoc As XmlDocument 
    Private xmldocpath As String 

    Sub New() 
     ControlsXmlDoc = New XmlDocument 
     xmldocpath = HttpContext.Current.Server.MapPath("~/cp/GlobalControl.xml") 
     ControlsXmlDoc.Load(xmldocpath) 
    End Sub 

    Shared Function GetInstance() As GlobalController 
     If instance Is Nothing Then 
      Return New GlobalController 
     Else 
      Return instance 
     End If 
    End Function 

    Shared Property IsExtracting() As Boolean 
     Get 
      Return Boolean.Parse(GetInstance.ControlsXmlDoc.SelectNodes("global/extraction/proceed").Item(0).InnerText) 
     End Get 
     Set(ByVal value As Boolean) 
      HttpContext.Current.Application.Lock() 
      Dim node As XmlNode = GetInstance.ControlsXmlDoc.SelectNodes("global/extraction/proceed").Item(0) 
      If Not Boolean.Parse(node.InnerText) = value Then 
       node.InnerText = value.ToString 
       node.Normalize() 
       SaveDocument() 
       GetInstance.ControlsXmlDoc.Load(GetInstance.xmldocpath) 
      End If 
      HttpContext.Current.Application.UnLock() 
     End Set 
    End Property 

    Shared Sub SaveDocument() 
     GetInstance.ControlsXmlDoc.Save(GetInstance.xmldocpath) 
    End Sub 

End Class 

Dans ma page que je fais quelque chose comme ceci:

GlobalController.IsExtracting = False 
Response.Write(GlobalController.IsExtracting) 

Je suis toujours obtenir la sortie comme "vrai". Quel est le problème avec le code?

+0

Avez-vous essayé d'afficher votre contenu xml après avoir appelé SaveDocument()? –

Répondre

1

Selon ce lien Operator precedence and associativity, ! (ou vb.net Not) ont une plus grande priorité que == (= en VB.NET); donc, votre expression est toujours évaluée comme

Not(True) And False 

et ne pénètre dans cette déclaration If. Essayez d'utiliser Boolean.Parse(node.InnerText) != value ou Not (Boolean.Parse(node.InnerText) = value) pour obtenir le résultat correspondant.

0

Tous, merci pour vos réponses. Je m'excuse pour ce que je vais dire. J'ai trouvé le bug: c'était avec la façon dont j'ai implémenté le singleton. Vous avez oublié d'affecter l'instance d'objet nouvellement créée à la variable partagée.

Shared Function GetInstance() As GlobalController 
    If instance Is Nothing Then 
     instance = New GlobalController 
    End If 
    Return instance 
End Function 
Questions connexes