自从我几年前开始编写经典的 ASP 12 (左右)以来,我一直在考虑这个问题,但我从来没有找到一个很好的解决方案,因为 ASP 和 ASP.NET 的体系结构一直是一个糟糕的实践,魔法共享单身人士等。我最大的问题是HttpApplication
对象及其非事件事件(Application_Start
,Application_End
等)。
如果您想在 HTTP 应用程序的整个生命周期内只做一次事情,Application_Start
那么显然是这样做的地方。对?不完全是。首先,这本身不是一个事件,它是一个神奇的命名约定,当遵循它时,会导致每个由 IIS 创建的 AppDomain 调用一次该方法。
除了魔术命名约定是一种可怕的做法之外,我开始认为这可能是对象上不存在Start
事件这样的事情的原因HttpApplication
。因此,我尝试了确实存在的事件,例如Init
. 好吧,这也不是一个真正的事件,它是一个可覆盖的方法,这是次优的。
似乎Init()
每次实例化对象都会调用该方法,HttpApplication
每个 AppDomain 不止一次发生这种情况。这意味着我不妨把我的启动逻辑放在HttpApplication
对象的构造函数中。
现在我的问题是,为什么我不应该将我的启动逻辑放在构造函数中?为什么甚至Init()
存在,我需要关心Application_Start
吗?如果我这样做了,谁能解释为什么HttpApplication
对象中的这个伪事件没有适当的事件或可覆盖的方法?
任何人都可以向我解释为什么在一个典型的 ASP.NET 应用程序中,创建了 8 个 my 实例HttpApplication
(当然,这会导致构造函数和Init
运行多次;这可以通过锁定和一个名为 的共享静态布尔值来缓解initialized
)当我的应用程序只有一个 AppDomain 时?