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

这也是我的经验,你的经验也有体现