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

时间:2014-07-02 20:45:25

标签: asp.net asp.net-mvc vb.net

我试图在我的ASP.NET网络应用中创建一个单例对象。定义是这样的:

Public Module Providers
    Public AppConnectionStringProvider As IConnectionStringProvider
End Module

我在Global.asax这样设置:

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

在最后一种方法中,在那行代码中,它尝试使用在{{1}}中初始化的对象,但它似乎是null,当它应该有一个值时。 / p>

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

问题证明是一个非常微妙的排序问题。我有一个引用AppConnectionStringProvider对象的类,但是设置提供者对象的代码有一个构造函数,它隐式地创建了一个对象,该对象创建了另一个对象,该对象创建了依赖于提供者的另一个对象。所以即使它看起来像对象不能为null,设置它的代码依赖于它不是null。我不得不重构一下来解开这些依赖关系,但现在它工作正常。感谢大家的评论。