VB.NET 的 Web 应用程序中模块构造函数的执行顺序
Execution sequence for a module constructor in a web application for VB.NET
我正在尝试了解 Web 应用程序环境中的执行顺序 - 基本上我正在使用一个模块来实现各种实用功能,包括记录和初始化各种 global/shared 变量。该网站有几个独立的页面和一些网络服务。
我们在网站上遇到了一些问题,其中一位开发人员建议必须首先执行一段代码来初始化关键的 属性(发生在模块构造函数中,属性 本身不是在模块中定义的,而是在第 3 方 DLL 上定义的,模块只是在构造函数中启动它)没有首先执行。该开发人员背后的原因是“只有在打开的页面上找到对它的引用时,才会调用模块的构造函数。
让我们假设我们的 Web 应用程序中有 2 个页面。只有 Page2 有对 MyModule 的引用。所以这个开发人员的逻辑是,如果网站重新启动并且第一次调用是 Page1,它没有对该模块的任何引用,因此不会调用构造函数,因此它不会初始化这个 属性在第 3 方 DLL 上。因此,Page1 尝试使用未初始化 属性 的第 3 方 DLL,但失败了。
我的反驳是:模块是共享的 class 并且它的构造函数也是共享的,在加载 Web 应用程序的程序集时正在初始化。根据我的论点,首先加载哪个页面并不重要,构造函数会在程序集加载时启动第 3 方工具,因此问题出在其他地方。
我是对还是错?
我找不到我的问题的答案,只是一些关于 Module 与 C# static classes 相似但又不同的信息。
谢谢
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://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.modules?view=netframework-4.7.2
这也是我的经验,你的经验也有体现
我正在尝试了解 Web 应用程序环境中的执行顺序 - 基本上我正在使用一个模块来实现各种实用功能,包括记录和初始化各种 global/shared 变量。该网站有几个独立的页面和一些网络服务。
我们在网站上遇到了一些问题,其中一位开发人员建议必须首先执行一段代码来初始化关键的 属性(发生在模块构造函数中,属性 本身不是在模块中定义的,而是在第 3 方 DLL 上定义的,模块只是在构造函数中启动它)没有首先执行。该开发人员背后的原因是“只有在打开的页面上找到对它的引用时,才会调用模块的构造函数。
让我们假设我们的 Web 应用程序中有 2 个页面。只有 Page2 有对 MyModule 的引用。所以这个开发人员的逻辑是,如果网站重新启动并且第一次调用是 Page1,它没有对该模块的任何引用,因此不会调用构造函数,因此它不会初始化这个 属性在第 3 方 DLL 上。因此,Page1 尝试使用未初始化 属性 的第 3 方 DLL,但失败了。
我的反驳是:模块是共享的 class 并且它的构造函数也是共享的,在加载 Web 应用程序的程序集时正在初始化。根据我的论点,首先加载哪个页面并不重要,构造函数会在程序集加载时启动第 3 方工具,因此问题出在其他地方。
我是对还是错? 我找不到我的问题的答案,只是一些关于 Module 与 C# static classes 相似但又不同的信息。
谢谢
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://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.modules?view=netframework-4.7.2
这也是我的经验,你的经验也有体现