Последовательность выполнения для конструктора модуля в веб-приложении для VB.NET - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь понять последовательность выполнения в среде веб-приложения - в основном я использую модуль для различных служебных функций, включая ведение журнала и инициализацию различных глобальных / общих переменных. На сайте есть несколько отдельных страниц и несколько веб-сервисов.

У нас были некоторые проблемы с веб-сайтом, когда один из разработчиков предложил, чтобы фрагмент кода, который должен быть выполнен первым, чтобы инициализировать критическое свойство (что происходит в конструкторе модуля, само свойство НЕ определяется в модуль, а скорее на сторонних DLL, и модуль просто инициирует его в конструкторе) не выполняется в первую очередь. Причиной этого разработчика является то, что «конструктор модуля вызывается только тогда, когда ссылка на него найдена на открывшейся странице.

Итак, давайте представим, что в нашем веб-приложении есть 2 страницы. Только Страница2 имеет ссылку на MyModule. Таким образом, логика этого разработчика заключается в том, что если веб-сайт перезапускается и самый первый вызов - это Page1, которая не имеет каких-либо ссылок на модуль, и, следовательно, конструктор не вызывается, и, следовательно, он не инициализирует это свойство в третьей стороне. DLL. Из-за этого Page1 пытается использовать стороннюю DLL с неинициализированным свойством, и это не удается.

Мой счетчик: модуль является общим классом, и его конструктор, который также является общим, инициализируется при загрузке сборки веб-приложения. Согласно моему аргументу, не имеет значения, какая страница загружается первой, конструктор запускает сторонний инструмент при загрузке сборки и, следовательно, проблема в другом месте.

Я прав или я не прав? Я не смог найти ответ на свой вопрос, просто некоторая информация о том, как Module похож на статические классы 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

1 Ответ

2 голосов
/ 13 апреля 2019

Ваш разработчик прав.Модули загружаются только при необходимости, потому что список модулей пуст при запуске программы https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.modules?view=netframework-4.7.2

, это тоже мой опыт и показано на вашем опыте также

...