我记录给我的感觉还可以,毕竟大部分是出自一人之手,能做到这样已经很不错,下面我来一步步尝试分析它是如何实现如
此强大的功能的。
首先从Global.asax开始,这是应用程序开始的地方,可以看到Application_Start这个方法。我们可以先从这个方法入手。
wojilu.Web.SystemInfo.Init();//系统的固定数据,比如网站根路径,app路径,主机(ip+端口号)名称等。这里的信息是以后路由的参考信息,在以后Url和实际地址映射的时候将用到这里的数据
首先分析wojilu.Web.SystemInfo.Init()方法,该方法在SystemInfo这个类下,属于静态方法可以直接由类调用。
public static void Init() { if (_hasInitialized) return; lock (_objLock) { if (_hasInitialized) return; SystemInfo obj = SystemInfo.Instance; _hasInitialized = true; } }
简单的几行却做了很多工作,if(_hasInitialized)判断是否已经初始化,如果已经初始化就返回不执行下面的代码,lock代码片段应该是控制并发操作的,通过锁住某个对象(_objLock),_objLock对象定义如下:
private static Object _objLock = new Object();
关键在于
SystemInfo obj = SystemInfo.Instance;
此代码调用了SystemInfo的静态成员Instance
public static SystemInfo Instance = loadSystemInfo();
这里又调用了loadSystemInfo方法。主要就是loadSystemInfo这个方法了。我们把目光转移到此方法上就好。
private static SystemInfo loadSystemInfo() { SystemInfo obj = new SystemInfo(); if (IsWeb) { obj.applicationPath = HttpContext.Current.Request.ApplicationPath;//用在映射文件绝对路径 obj.rootPath = addEndSlash( obj.applicationPath ); obj.host = HttpContext.Current.Request.Url.Host; } else { obj.applicationPath = "/"; obj.rootPath = "/"; obj.host = "localhost"; } return obj; }
首先初始化SystemInfo实例,结果返回该实例,代码很简单,就给实例的属性赋值,包括:applicationPath,rootPath,hostPath,用于系统初始化。addEndSlash方
法定义如下:
private static String addEndSlash( String appPath ) { if (!appPath.EndsWith( "/" )) return appPath + "/"; return appPath; }
很简单,就是返回以“/”结束的字符串。
wojilu.Web.SystemInfo.Init()方法就解析到这,接下来我们会解析
wojilu.Web.Mvc.MvcFilterLoader.Init();
这个重要的方法,该方法会把我们导向Web.Config中和本系统相关的很多重要的功能。