用于 VB.NET 的 Web 应用程序中模块构造函数的执行顺序



我正在尝试理解 Web 应用程序环境中的执行序列 - 基本上我正在使用一个模块来实现各种实用程序函数,包括记录和初始化各种全局/共享变量。该网站有几个独立的页面和一些网络服务。

我们在网站上遇到了一些问题,其中一位开发人员建议必须首先执行一段代码来初始化关键属性(发生在模块构造函数中,属性本身不是在模块中定义的,而是在第三方 DLL 上,模块只是在构造函数中启动它)没有首先执行。该开发人员背后的原因是"只有在打开的页面上找到对它的引用时,才会调用模块的构造函数。

因此,让我们假设我们的 Web 应用程序上有 2 个页面。只有Page2引用了MyModule。因此,此开发人员的逻辑是,如果重新启动网站并且第一次调用是 Page1,它没有任何对模块的引用,因此不调用构造函数,因此它不会在第三方 DLL 上初始化此属性。因此,Page1 尝试使用具有未初始化属性的第三方 DLL,但失败。

我的反驳是:模块是一个共享类,它的构造函数(也是共享的)在加载 Web 应用程序的程序集时正在初始化。根据我的论点,首先加载哪个页面并不重要,构造函数在程序集加载时启动第 3 方工具,因此问题出在其他地方。

我是对的还是错的? 我找不到问题的答案,只是一些关于模块如何与 C# 静态类相似但又不同的信息。

谢谢

Public Module MyModule
Sub New()
Log("something")
myThirdPartyDLLReference.InitializeVars()
...
End Sub
Private Sub Log(ByVal logMessage as string)
' Do some logic. Log some information
End Sub 
End Module
Partial Class Page1
Inherits Page
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
' Do some logic, no references to MyModule
End Sub
End Class
Partial Class Page2
Inherits Page
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
' Do some logic, initialize MyModule
MyModule.Log("Page 2 initialized")
End Sub
End Class

你的开发人员是对的。 仅在需要时加载模块,因为程序启动时模块列表为空 https://learn.microsoft.com/en-us/dotnet/api/system.diagnostics.process.modules?view=netframework-4.7.2

这也是我的经验,也显示在你的经验中

相关内容

  • 没有找到相关文章

最新更新