Products

Solutions

Resources

Partners

Community

About

New Community Website

Ordinarily, you'd be at the right spot, but we've recently launched a brand new community website... For the community, by the community.

Yay... Take Me to the Community!

The Community Blog is a personal opinion of community members and by no means the official standpoint of DNN Corp or DNN Platform. This is a place to express personal thoughts about DNNPlatform, the community and its ecosystem. Do you have useful information that you would like to share with the DNN Community in a featured article or blog? If so, please contact .

The use of the Community Blog is covered by our Community Blog Guidelines - please read before commenting or posting.


Simulating Application_Start Event

Overview

jmb_appstart_light-switch.jpgWhile working on a recent conversion effort to migrate an ASP.Net application to DotNetNuke, I ran into a very tricky problem.  I needed to be able to run some code during the Application_Start event.  The code to be run is basic initialization code and should only be called one time when first starting the application.  This seemed like a simple enough task.  Like every module, I am limited in how I can tie into the DotNetNuke framework and the underlying ASP.Net pipeline.  My module must be able to run in a stock DotNetNuke installation without any modification to the core code.  Unfortunately for me, Application_Start is not a normal event.  In fact, it is not an event at all.  It is just a method in Global.asax that follows a standard naming convention, and that is called by the ASP.Net framework at a specified point in the application lifecycle.

DotNetNuke, as far as I know, does not allow me to tap into this "event" and therefore I needed to find some other method for initializing my module.  During this conversion, I am trying to minimize the architectural changes, since both the standalone application and the DotNetNuke version will continue to be actively developed.  The goal is to keep the two codebases as close as possible.  My challenge was to come up with a method for executing a method one time as close to application startup as possible.

Solution

After doing some research on the web, I did not come up with any straight forward solutions.  Most of the recommendations would have required extensive changes to the way the application being converted performed its initialization.  One suggestion however, if given a little extra effort, looked like it just might do the trick.  The suggested solution was to use a class constructor (also known as a static initializer) to execute the desired code.

Every class has two sets of constructors available:  1) an instance constructor (that may or may not have parameters) and which is called to instantiate a new class instance.  2) a class constructor (it has no parameters) and which is used to initialize static members of the class.  The class constructor is guaranteed to only be called one time for the life of the application.  It will be called the first time the class is instantiated, or the first time any static Field or Method is accessed.  Because it can only be called one time during the life of the application, it exhibits some of the same characteristics as the Application_Start method in Global.asax.

To make this work, I created a simple class that includes a class constructor and a stub static method.

class AppStart
{
    static AppStart()
    {
        System.Diagnostics.Debug.WriteLine("AppStart.Initialized");
        AppLogic.ApplicationStart();
    }

    public static void Execute()
    {
        System.Diagnostics.Debug.WriteLine("AppStart.Execute");
    }
}

This solved one part of my problem:  I now had a method to guarantee that code would only be executed once.  Now I needed an event that I could use that would occur before any other code would run for my module.  A quick review of the "Asp.Net Application Life Cycle Overview" showed me that the Init event of an HttpModule was the first code accessible event in the lifecycle.  This event is guaranteed to fire before any page access occurs.  So now I just needed to create an HttpModule and add a call to AppStart.Execute() in the Init event.  This will cause the class constructor for the AppStart class to execute one time, and to run before any other code in my module.

I still have some more testing to do to ensure everything is running smoothly, but so far everything looks good.  I would be interested to hear what other module developers are doing to solve this problem.

NOTE:  On further inspection, it appears that I might be able to use the DotNetNuke event framework to tap into the Application_Start event.  I will need to investigate this avenue some more.  In the meantime, I have a method that appears to work.

Comments

There are currently no comments, be the first to post one.

Comment Form

Only registered users may post comments.

NewsArchives


Aderson Oliveira (22)
Alec Whittington (11)
Alessandra Daniels (3)
Alex Shirley (10)
Andrew Hoefling (3)
Andrew Nurse (30)
Andy Tryba (1)
Anthony Glenwright (5)
Antonio Chagoury (28)
Ash Prasad (37)
Ben Schmidt (1)
Benjamin Hermann (25)
Benoit Sarton (9)
Beth Firebaugh (12)
Bill Walker (36)
Bob Kruger (5)
Bogdan Litescu (1)
Brian Dukes (2)
Brice Snow (1)
Bruce Chapman (20)
Bryan Andrews (1)
cathal connolly (55)
Charles Nurse (163)
Chris Hammond (213)
Chris Paterra (55)
Clint Patterson (108)
Cuong Dang (21)
Daniel Bartholomew (2)
Daniel Mettler (181)
Daniel Valadas (48)
Dave Buckner (2)
David Poindexter (12)
David Rodriguez (3)
Dennis Shiao (1)
Doug Howell (11)
Erik van Ballegoij (30)
Ernst Peter Tamminga (80)
Francisco Perez Andres (17)
Geoff Barlow (12)
George Alatrash (12)
Gifford Watkins (3)
Gilles Le Pigocher (3)
Ian Robinson (7)
Israel Martinez (17)
Jan Blomquist (2)
Jan Jonas (3)
Jaspreet Bhatia (1)
Jenni Merrifield (6)
Joe Brinkman (274)
John Mitchell (1)
Jon Henning (14)
Jonathan Sheely (4)
Jordan Coopersmith (1)
Joseph Craig (2)
Kan Ma (1)
Keivan Beigi (3)
Kelly Ford (4)
Ken Grierson (10)
Kevin Schreiner (6)
Leigh Pointer (31)
Lorraine Young (60)
Malik Khan (1)
Matt Rutledge (2)
Matthias Schlomann (16)
Mauricio Márquez (5)
Michael Doxsey (7)
Michael Tobisch (3)
Michael Washington (202)
Miguel Gatmaytan (3)
Mike Horton (19)
Mitchel Sellers (40)
Nathan Rover (3)
Navin V Nagiah (14)
Néstor Sánchez (31)
Nik Kalyani (14)
Oliver Hine (1)
Patricio F. Salinas (1)
Patrick Ryan (1)
Peter Donker (54)
Philip Beadle (135)
Philipp Becker (4)
Richard Dumas (22)
Robert J Collins (5)
Roger Selwyn (8)
Ruben Lopez (1)
Ryan Martinez (1)
Sacha Trauwaen (1)
Salar Golestanian (4)
Sanjay Mehrotra (9)
Scott McCulloch (1)
Scott Schlesier (11)
Scott Wilkinson (3)
Scott Willhite (97)
Sebastian Leupold (80)
Shaun Walker (237)
Shawn Mehaffie (17)
Stefan Cullmann (12)
Stefan Kamphuis (12)
Steve Fabian (31)
Steven Fisher (1)
Tony Henrich (3)
Torsten Weggen (3)
Tycho de Waard (4)
Vicenç Masanas (27)
Vincent Nguyen (3)
Vitaly Kozadayev (6)
Will Morgenweck (40)
Will Strohl (180)
William Severance (5)
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out
What is Liquid Content?
Find Out