Je suis allé à la ronde avec ça depuis que j'ai commencé à programmer ASP 12 (ou plus) il y a des années et je n'ai jamais trouvé une solution géniale car l'architecture de ASP et ASP.NET a toujours été un marécage de mauvaises pratiques, des singletons magiques partagés, etc. Mon plus gros problème est avec l'objet HttpApplication
avec ses événements sans événement (Application_Start
, Application_End
, etc.).Application_Start versus OnInit contre le constructeur
Si vous voulez faire des choses une fois pour toute la durée de vie d'une application HTTP, Application_Start
est l'endroit idéal pour le faire. Droite? Pas exactement. Tout d'abord, ce n'est pas un événement en soi, c'est une convention de nommage magique qui, lorsqu'elle est suivie, provoque l'appel de la méthode une fois par AppDomain créé par IIS. Outre les conventions de nommage magiques étant une pratique horrible, j'ai commencé à penser qu'il pourrait y avoir une raison pour laquelle il n'existe pas d'événement Start
sur l'objet HttpApplication
. J'ai donc expérimenté avec des événements qui existent, tels que Init
. Eh bien, ce n'est pas vraiment un événement non plus, c'est une méthode redoutable, qui est la meilleure chose suivante.
Il semble que la méthode Init()
est appelée pour chaque instanciation d'un objet HttpApplication
, ce qui se produit beaucoup plus d'une fois par AppDomain. Cela signifie que je pourrais tout aussi bien mettre ma logique de démarrage dans le constructeur de l'objet HttpApplication
. Maintenant, ma question est, pourquoi ne pas mettre ma logique de démarrage dans le constructeur? Pourquoi existe-t-il encore Init()
et dois-je m'occuper de Application_Start
? Si oui, quelqu'un peut-il expliquer pourquoi il n'y a pas d'événement approprié ou de méthode substituable pour ce pseudo-événement dans l'objet HttpApplication
? Et peut-on m'expliquer pourquoi dans une application ASP.NET typique, 8 instances de mes HttpApplication
sont créées (ce qui fait que le constructeur et Init
s'exécutent autant de fois, bien sûr, ce qui peut être atténué avec le verrouillage et un booléen statique partagé appelé initialized
) lorsque mon application n'a qu'un seul AppDomain?
doit probablement être fait en sorte que le cadre Application_Start pouvez configurer tous ces magiques des objets partagés. Peut-être que la classe est touchée avant cela et que le constructeur statique serait exécuté trop tôt. –
@JoeKoberg, c'est un bon point. Vous avez moins de contrôle sur le moment où un constructeur statique est appelé qu'un appel de méthode explicite, bien sûr. Je ne vois toujours pas le besoin de 'Init()', cependant. Et 'Application_Start' et' Application_End' devraient toujours être des événements appropriés. –