Я обходил это с тех пор, как начал программировать классический ASP 12 (или около того) несколько лет назад, и я никогда не находил отличного решения, потому что архитектура ASP и ASP.NET всегда была кучей плохих практик.магия общих синглетонов и т. д. Моя самая большая проблема связана с объектом HttpApplication
с его событиями, не относящимися к событию (Application_Start
, Application_End
и т. д.).
Если выЕсли вы хотите сделать что-то один раз за весь срок службы HTTP-приложения, Application_Start
является очевидным местом для этого.Правильно?Не совсем.Во-первых, это не событие само по себе, это магическое соглашение об именах, которое, при его соблюдении, приводит к тому, что метод вызывается один раз для AppDomain, созданного IIS.
Помимо магических соглашений об именах, являющихся ужасной практикой, я 'Мы начали думать, что это может быть причиной того, что на объекте HttpApplication
не существует такого явления, как Start
.Поэтому я экспериментировал с событиями, которые существуют, такими как Init
.Ну, на самом деле это тоже не событие, это перезаписываемый метод, который является следующим лучшим решением.
Кажется, что метод Init()
вызывается для каждого экземпляра объекта HttpApplication
, которыйслучается гораздо чаще, чем один раз за домен приложения.Это означает, что я мог бы просто поместить свою логику запуска в конструктор объекта HttpApplication
.
Теперь мой вопрос: почему я не должен помещать свою логику запуска в конструктор?Почему даже Init()
существует, и мне нужно заботиться о Application_Start
?Если я это сделаю, может кто-нибудь объяснить, почему в объекте HttpApplication
нет подходящего события или переопределенного метода для этого псевдо-события?
И кто-нибудь может объяснить мне, почему в типичном приложении ASP.NET 8создаются экземпляры моего HttpApplication
(что приводит к тому, что конструктор и Init
запускаются столько же раз, разумеется; это можно уменьшить с помощью блокировки и общего статического логического значения, называемого initialized
), когда мое приложение имеет только одинAppDomain?