Asp.net 为什么我的全局变量没有被初始化?

Asp.net 为什么我的全局变量没有被初始化?,asp.net,asp.net-mvc,vb.net,Asp.net,Asp.net Mvc,Vb.net,我正在尝试在我的ASP.NET web应用程序中创建一个单例对象。定义如下: Public Module Providers Public AppConnectionStringProvider As IConnectionStringProvider End Module Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs) ... 'create a default connectio

我正在尝试在我的ASP.NET web应用程序中创建一个单例对象。定义如下:

Public Module Providers
    Public AppConnectionStringProvider As IConnectionStringProvider
End Module
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ...
    'create a default connection string provider
    AppConnectionStringProvider = New MyConnectionStringProvider
    ....
End Sub
我在Global.asax中设置如下:

Public Module Providers
    Public AppConnectionStringProvider As IConnectionStringProvider
End Module
Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
    ...
    'create a default connection string provider
    AppConnectionStringProvider = New MyConnectionStringProvider
    ....
End Sub
这很好,但有时我会在日志文件中看到错误,这些错误最终是由使用AppConnectionStringProvider(当它为Nothing/null时)引起的。我认为,通过在Application_Start中初始化它,我可以保证这个变量总是非空的,但在某些情况下似乎并非如此。这是什么原因造成的?我正在考虑线程问题,但我看不出它们会是什么

编辑:下面是堆栈跟踪。大致上,这是对站点主页的一个简单请求:

Exception of type 'System.Web.HttpUnhandledException' was thrown.
System.Web.HttpApplication.ExecuteStep
System.Web.HttpApplication.CallHandlerExecutionStep
System.Web.HttpApplication.IExecutionStep.Execute
ASP.default_aspx.ProcessRequest
System.Web.UI.Page.ProcessRequest
System.Web.UI.Page.ProcessRequest
System.Web.UI.Page.ProcessRequest
System.Web.UI.Page.ProcessRequestMain
System.Web.UI.Page.HandleError

Object reference not set to an instance of an object.
System.Web.UI.Page.ProcessRequestMain
System.Web.UI.Control.LoadRecursive
MyApp.Default.Page_Load.21[Default.aspx.vb]
...
MyApp.SomeModule..ctor.6[Utilities.vb]
MyApp.get_ConnectionString.70[Connections.vb]

在最后一个方法中,在那行代码中,它试图使用在Application_Start中初始化的对象,但它似乎为空,当它应该有一个值时。

如果您的单例对象应该在会话结束时处理,则将您的对象添加到会话变量中。会话[MyConnectionStringProvider]=新的MyConnectionStringProvider。或者,如果希望应用程序的singleton对象处于活动状态并与所有用户共享,则将其添加到应用程序变量中。应用程序[MyConnectionStringProvider]=新的MyConnectionStringProvider。这样,您的对象将不会为null,并且可用于所有请求。我希望这能有所帮助。

这个问题原来是一个非常微妙的排序问题。我有一个引用AppConnectionStringProvider对象的类,但设置provider对象的代码有一个构造函数,该构造函数隐式创建了一个对象,该对象创建了另一个对象,该对象创建了另一个依赖于该提供程序的对象。因此,即使看起来对象不能为null,设置它的代码也依赖于它不能为null。我不得不进行一些重构,以理清这些依赖关系,但现在一切正常。谢谢大家的评论。

只要更改您的声明就行了?Public AppConnectionStringProvider As IConnectionStringProvider=新建MyConnectionStringProvider值得指出的是,您尚未在此处创建singleton。singleton是一个保证一次只存在一个实例的类。模块可以实例化,因此它们不能有单个实例。您调试过吗?这些异常是在执行应用程序_Start中的那一行之前还是之后抛出的?抛出的异常在哪里?@jmcilhinney,等等……VB.Net模块可以实例化?@JoshuaFrank,我不是想说该模块不符合您的目的,我也不是想为您的问题提供解决方案,因此是评论而不是答案。我只是想指出,您拥有的并不是一个单例,我不想将其应用到应用程序中,因为我的最终目标是能够注入不同的提供者,这样我就可以在非web上下文中使用我的web代码。