我们还是来看一下ASP.NET的源代码吧:

    internal class BuildResultMainCodeAssembly : BuildResultCompiledAssembly 
    { 
        private MethodInfo FindAppInitializeMethod(Type t) 
        { 
            return t.GetMethod("AppInitialize",  
                BindingFlags.Public | BindingFlags.Static | BindingFlags.IgnoreCase,  
                null, new Type[0], null); 
        }

  根据代码我们可以发现AppInitialize方法的特点有:

  1、必须是一个公开的静态方法:BindingFlags.Public | BindingFlags.Static

  2、方法名不区分大小写:BindingFlags.IgnoreCase

  3、方法不允许有传入参数:new Type[0]

  HttpModule也能执行初始化的任务

  由于HttpModule总是会在ASP.NET管线中被调用,所以,我们还可以用它来完成初始化的操作。

    public class InitAppModule : IHttpModule 
    { 
        public void Init(HttpApplication context) 
        { 
             //注意:Init事件可能被多次调用,所以这个方法会被多次调用。 
            AppInitializer.Init(); 
        }

  正如代码注释所说的那样,这种调用代码是不对的,除非你能接受初始化代码被多次调用!

  所以,我们应该按单例模式的思路来改写代码:

    private static readonly object s_lock = new object(); 
    private static bool s_initOK; 
    public void Init(HttpApplication context) 
    { 
        lock( s_lock ) { 
            if( s_initOK == false ) { 
                //保证初始化代码只执行一次。 
                AppInitializer.Init(); 
                s_initOK = true; 
            } 
        } 
    }

  如果你希望代码简单一点,还可以这样实现:

    public class InitAppModule : IHttpModule 
    { 
        static InitAppModule() 
        { 
            AppInitializer.Init(); 
        } 
        public void Init(HttpApplication context) 
        { 
            // 留个空方法, 
            // ASP.NET会调用这个方法,后能触发静态方法的调用。 
        }