以下设计是否存在根本性的错误,或者任何人都可以看到为什么静态属性有时会失去它们的值?
我有一个包含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
静态属性在应用程序启动时从Global.asax的Application_Start事件中设置一次
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条目显然有值时。
上述设计是否存在根本性的问题,或者期望静态属性在应用程序会话的生命周期中保持其值是否合理?
答案 0 :(得分:0)
我会添加一些调试/跟踪输出,以便查看正在发生的事情。确保也要追踪任何例外情况。
我还会更改属性返回以使用现代语法(我不确定它的支持程度如何)。
return defaultValue
而不是:
ReadSetting = defaultValue
答案 1 :(得分:0)
静态属性在应用程序启动时从Global.asax的Application_Start事件中设置一次
实际上那就是问题所在。仔细检查代码显示它正在设置
Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
AppConfig.OnApplicationStart()
End Sub
结论:如果你在Session_Start上设置静态道具,请随时准备松开它们(它们也可能会再次出现!)。
我已将其移至Application_Start,问题已消失。
现在任何人都可以对IIS的内部工作方式提供合理的解释,这可以解释我遇到这种情况的原因吗?