12 年ほど前に古典的な ASP のプログラミングを始めて以来、私はこれを繰り返してきましたが、ASP と ASP.NET のアーキテクチャは常に悪い慣行の沼地であり、魔法が共有されていたため、優れた解決策を見つけたことはありませんでした。シングルトンなど。私の最大の問題は、HttpApplication
イベント以外のイベント( 、など)を持つオブジェクトにApplication_Start
ありApplication_End
ます。
HTTP アプリケーションの存続期間全体で 1 回だけ何かを実行したい場合は、それを実行するのに最適Application_Start
な場所です。右?ではない正確に。まず、これはイベント自体ではなく、IIS によって作成された AppDomain ごとに 1 回メソッドが呼び出される魔法の命名規則です。
魔法の命名規則が恐ろしい慣習であることに加えて、オブジェクトにStart
イベントのようなものが存在しない理由かもしれないと私は考え始めました。HttpApplication
そのため、 などの存在するイベントを試してみましたInit
。これも実際にはイベントではなく、オーバーライド可能なメソッドであり、次善の策です。
このメソッドは、AppDomain ごとに複数回発生するInit()
、オブジェクトのインスタンス化ごとに呼び出されるようです。これは、起動ロジックをオブジェクトのコンストラクターHttpApplication
内に配置するだけでよいことを意味します。HttpApplication
ここで私の質問は、起動ロジックをコンストラクターに入れるべきではないのはなぜですか? なぜさえInit()
存在し、私は気にする必要がありApplication_Start
ますか? HttpApplication
もしそうなら、オブジェクトのこの疑似イベントに適切なイベントまたはオーバーライド可能なメソッドがない理由を誰か説明できますか?
そして、典型的なASP.NETアプリケーションで、myの8つのインスタンスが作成される理由を誰でも説明できますかHttpApplication
(これにより、コンストラクターとInit
が同じ回数実行されます。これは、ロックと共有静的ブール値で軽減できますinitialized
)アプリケーションに AppDomain が 1 つしかない場合