Статическое свойство теряет свою стоимость периодически? - PullRequest
3 голосов
/ 18 мая 2010

Что-то в корне неверно со следующим дизайном, или кто-нибудь может понять, почему статические свойства иногда теряют свои значения?

У меня есть проект библиотеки классов, содержащий класс AppConfig; этот класс используется проектом Webforms.

Скелет класса AppConfig выглядит следующим образом:

Public Class AppConfig
    Implements IConfigurationSectionHandler

    Private Const C_KEY1        As String = "WebConfig.Key.1"
    Private Const C_KEY2        As String = "WebConfig.Key.2"
    Private Const C_KEY1_DEFAULT_VALUE  as string = "Key1defaultVal"
    Private Const C_KEY2_DEFAULT_VALUE  as string = "Key2defaultVal"

    Private Shared m_field1 As String
    Private Shared m_field2 As String

    Public Shared ReadOnly Property ConfigValue1() As String
        Get
            ConfigValue1= m_field1
        End Get
    End Property

    Public Shared ReadOnly Property ConfigValue2() As String
        Get
            ConfigValue2 = m_field2
        End Get
    End Property


    Public Shared Sub OnApplicationStart()
        m_field1    = ReadSetting(C_KEY1, C_KEY1_DEFAULT_VALUE)
        m_field2    = ReadSetting(C_KEY2, C_KEY1_DEFAULT_VALUE)
    End Sub

    Public Overloads Shared Function ReadSetting(ByVal key As String, ByVal defaultValue As String) As String
        Try
            Dim setting As String = System.Configuration.ConfigurationManager.AppSettings(key)
            If setting Is Nothing Then
                ReadSetting = defaultValue
            Else
                ReadSetting = setting
            End If
        Catch
            ReadSetting = defaultValue
        End Try
    End Function

    Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
        Dim objSettings As NameValueCollection
        Dim objHandler As NameValueSectionHandler

        objHandler = New NameValueSectionHandler
        objSettings = CType(objHandler.Create(parent, configContext, section), NameValueCollection)

        Return 1
    End Function

End Class

Статические свойства устанавливаются один раз при запуске приложения из события Application_Start в Global.asax

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)

    //Fires when the application is started
    AppConfig.OnApplicationStart()

End Sub

После этого всякий раз, когда мы хотим получить доступ к значению в Web.Config из любого места, например, Кодовый файл страницы aspx или другой класс или ссылочный класс, мы просто вызываем статическое свойство.

Например,

AppConfig.ConfigValue1()
AppConfig.ConfigValue2() 

Этот ход возвращает значение, сохраненное в статических полях поддержки m_field1, m_field2

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

Что-то в корне не так с вышеуказанным дизайном, или разумно ожидать, что статические свойства сохранят свое значение в течение всего жизненного цикла приложения?

Ответы [ 2 ]

0 голосов
/ 21 мая 2010

Статические свойства устанавливаются один раз при запуске приложения из события Application_Start в Global.asax

На самом деле это была проблема. Тщательная проверка кода показывает, что он был установлен на

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        AppConfig.OnApplicationStart() 
End Sub

Вывод: если вы установили статический реквизит на Session_Start, будьте готовы потерять его в любое время (и он может снова появиться снова!)

Я переместил его в Application_Start, и проблема исчезла.

Теперь кто-нибудь может дать правдоподобное объяснение внутренней работы IIS, которая может объяснить, почему я столкнулся с этим сценарием?

0 голосов
/ 18 мая 2010

Я бы добавил несколько выводов отладки / трассировки, чтобы посмотреть, что происходит. Не забудьте также отследить любые исключения.

Я бы также изменил возвращаемые свойства, чтобы использовать современный синтаксис (я не уверен, насколько хорошо это поддерживается)

return defaultValue

вместо:

* +1007 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...