<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_john23.net</title><subtitle type="text">乐观生活,勇往直前,专注ASP.NET,CSS,JavaScript,PHP,AS,MVC,WCF,SL,ORM</subtitle><id>http://feed.cnblogs.com/blog/u/64129/rss</id><updated>2012-05-07T15:09:35Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/64129/rss"/><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/04/30/2477338.html</id><title type="text">继续WPF学习与研究</title><summary type="text">最近一个月都把时间花在WPF的项目上，感觉有收获也认识到了自己的不足，还是在设计模式或者说是对代码的组织上有所欠缺，接下来还是想提高自己对代码逻辑的领悟还有WPF方面的深入。</summary><published>2012-04-30T14:43:00Z</published><updated>2012-04-30T14:43:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/04/30/2477338.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/04/30/2477338.html"/><content type="html">最近一个月都把时间花在WPF的项目上，感觉有收获也认识到了自己的不足，还是在设计模式或者说是对代码的组织上有所欠缺，接下来还是想提高自己对代码逻辑的领悟还有WPF方面的深入。&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2477338.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/04/30/2477338.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/03/31/2427779.html</id><title type="text">WPF和PHP</title><summary type="text">这个月把主要精力放在了WPF和PHP上，WPF主要是工作中用的比较多，PHP则是业余自己抽空学习敲代码，接下来还需在WPF上多花时间，还有wojilu开源项目的研究上得继续。</summary><published>2012-03-31T15:04:00Z</published><updated>2012-03-31T15:04:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/03/31/2427779.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/03/31/2427779.html"/><content type="html">这个月把主要精力放在了WPF和PHP上，WPF主要是工作中用的比较多，PHP则是业余自己抽空学习敲代码，接下来还需在WPF上多花时间，还有wojilu开源项目的研究上得继续。&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2427779.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/03/31/2427779.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/02/04/2338648.html</id><title type="text">.net软件工程师面试题(一)</title><summary type="text">1.C#可以动态改变大小的数组:ArrayList 数组的容量是固定的，但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的容量时，则可以自动进行内存 重新分配和元素复制，比如往1号索引位插入N个元素，插入后，元素的索引依次向后n个位置排列，它是动态版本的数组类 型。 ArrayList提供添加，插入或移除某一范围元素的方法。但是在数组中，只能一次获取或者设置一...</summary><published>2012-02-04T14:49:00Z</published><updated>2012-02-04T14:49:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/02/04/2338648.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/02/04/2338648.html"/><content type="html">&lt;p&gt;1.C#可以动态改变大小的数组:ArrayList&lt;/p&gt;  &lt;p&gt;数组的容量是固定的，但ArrayList的容量可以根据需要自动扩充。当我们修改了ArrayList的容量时，则可以自动进行内存&lt;/p&gt;  &lt;p&gt;重新分配和元素复制，比如往1号索引位插入N个元素，插入后，元素的索引依次向后n个位置排列，它是动态版本的数组类&lt;/p&gt;  &lt;p&gt;型。&lt;/p&gt;  &lt;p&gt;ArrayList提供添加，插入或移除某一范围元素的方法。但是在数组中，只能一次获取或者设置一个元素的值，如利用索引&lt;/p&gt;  &lt;p&gt;赋值。&lt;/p&gt;  &lt;p&gt;ArrayList只有一维，而数组可以是多维。&lt;/p&gt;  &lt;p&gt;2.接口和抽象类的区别&lt;/p&gt;  &lt;p&gt;3.ASP.NET页面传值有哪几种方式。&lt;/p&gt;  &lt;p&gt;4.array复制到arrayList.&lt;/p&gt;  &lt;p&gt;5.学生，课程，分数。求15到21位课程名为数学的学生并并按照分数降序排列。&lt;/p&gt;  &lt;p&gt;6.学生，课程，分数。求学号为。。的平均分。&lt;/p&gt;  &lt;p&gt;7.求所有课程分数大于85分的学生姓名。&lt;/p&gt;  &lt;p&gt;8.把2008102115:21:21转换成2008-10-21&amp;#160; 15:21:21&lt;/p&gt;  &lt;p&gt;9.求4x+3.5y=15中y的最大值，写出实现过程。&lt;/p&gt;  &lt;p&gt;10.xpath.&lt;/p&gt;  &lt;p&gt;11.转换二进制方面。&lt;a href="http://dotnet.chinaitlab.com/CSharp/831826.html" target="_blank"&gt;C#实现十进制数转二进制数的算法&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;12.线程方面。甲，乙，丙三个人。工作&lt;/p&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2338648.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/02/04/2338648.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/17/2324862.html</id><title type="text">Android APK反编译</title><summary type="text">android apk包可以反编译，但是多数应用程序包都混淆过代码。 一. 下载dex2jar,将apk中的classes.dex转换成jar文件。详细步骤如下: 1. 将apk文件后缀改为zip文件，解压后得到其中的classes.dex(java文件编译再通过dx工具打包而成的)。 2. 解压下载的dex2jar,将classes.dex文件复制到dex2jar.bat所在目录，打开命令...</summary><published>2012-01-17T09:00:00Z</published><updated>2012-01-17T09:00:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/17/2324862.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/17/2324862.html"/><content type="html">&lt;p&gt;android apk包可以反编译，但是多数应用程序包都混淆过代码。&lt;/p&gt;  &lt;p&gt;一. 下载dex2jar,将apk中的classes.dex转换成jar文件。详细步骤如下:&lt;/p&gt;  &lt;p&gt;1. 将apk文件后缀改为zip文件，解压后得到其中的classes.dex(java文件编译再通过dx工具打包而成的)。&lt;/p&gt;  &lt;p&gt;2. 解压下载的dex2jar,将classes.dex文件复制到dex2jar.bat所在目录，打开命令行窗口定位到dex2jar.bat目录。&lt;/p&gt;  &lt;p&gt;运行dex2jar.bat classes.dex,生成classes.dex.dex2jar.jar文件。&lt;/p&gt;  &lt;p&gt;二. 下载JD-GUI工具，反编译Jar包的源代码，可以直接查看&lt;/p&gt;  &lt;p&gt;运行JD-GUI(jd-gui.exe),打开上面生成的jar包，即可看到源代码。&lt;/p&gt;  &lt;p&gt;三.反编译apk中的图片，xml配置，语言资源等文件。&lt;/p&gt;  &lt;p&gt;这次用到的是apktool,下载&lt;a href="http://android-apktool.googlecode.com/files/apktool1.4.1.tar.bz2"&gt;apktool1.4.1.tar.bz2&lt;/a&gt; 和 &lt;a href="http://android-apktool.googlecode.com/files/apktool-install-windows-r04-brut1.tar.bz2"&gt;apktool-install-windows-r04-brut1.tar.bz2&lt;/a&gt;（两个包都下载)&lt;/p&gt;  &lt;p&gt;将下载的两个包解压到同一个文件夹下，应该会有三个文件:aapt.exe，apktool.bat，apktool.jar&lt;/p&gt;  &lt;p&gt;在命令行窗口中定位到apktool.bat文件，运行如下命令:apktool d C:\*.apk C:\*文件夹,命令行解释：apktool d &lt;/p&gt;  &lt;p&gt;[apk文件 ] [输出文件夹]，反编译的文件一定要放到C盘的根目录下。&lt;/p&gt;  &lt;p&gt;四. 将反编译完的文件重新打包成apk，很简单，输入apktool b c:\***文件夹（你编译出来文件夹）即可.&lt;/p&gt;  &lt;p&gt;打包apk后的文件在目录C:\HelloAndroid下，生成了两个文件夹：&lt;/p&gt;  &lt;p&gt;build&lt;/p&gt;  &lt;p&gt;dist&lt;/p&gt;  &lt;p&gt;其中，打包生成的HelloAndroid.apk，在上面的dist文件夹下。&lt;/p&gt;  &lt;p&gt;参考：&lt;a href="http://blog.csdn.net/sunboy_2050/article/details/6727581" target="_blank"&gt;csdn博客&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2324862.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/17/2324862.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/16/2324120.html</id><title type="text">我记录开源系统1.6源码解析(二)之IOC容器浅析</title><summary type="text">这篇为了进一步加深对我记录IOC管理容器的运行流程，我们继续分析ObjectContext这个类。主要是对InitInJect这个方 法继续分析。 private static void InitInject( ObjectContext ctx ) { loadAssemblyAndTypes( ctx ); resolveAndInject( ctx...</summary><published>2012-01-16T13:56:00Z</published><updated>2012-01-16T13:56:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/16/2324120.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/16/2324120.html"/><content type="html">&lt;p&gt;这篇为了进一步加深对我记录IOC管理容器的运行流程，我们继续分析&lt;font color="#ff0000"&gt;ObjectContext&lt;/font&gt;这个类。主要是对InitInJect这个方&lt;/p&gt;  &lt;p&gt;法继续分析。&lt;/p&gt;  &lt;span style="color: blue"&gt;private static void &lt;/span&gt;InitInject( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;           loadAssemblyAndTypes( ctx );&lt;br/&gt;           resolveAndInject( ctx );&lt;br/&gt;           addNamedObjects( ctx );&lt;br/&gt;       }&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;ObjectContext类位于wojilu项目的DI文件夹中，如图：&lt;/p&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:8a957c2a-93bb-415d-9f2c-ab8d77fc3762" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155468733.PNG" title="" rel="thumbnail"&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155475603.png" width="335" height="225" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;可以看到DI文件夹里包含MapItem和ObjectContext两个类。说明这两个类跟DI紧密关联。&lt;/p&gt;&lt;p&gt;第一行调用&lt;font color="#ff0000"&gt;loadAssemblyAndTypes方法:&lt;/font&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;loadAssemblyAndTypes( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;appSettings = &lt;span style="color: #2b91af"&gt;cfgHelper&lt;/span&gt;.GetAppSettings( &lt;span style="color: #a31515"&gt;&amp;quot;InjectAssembly&amp;quot; &lt;/span&gt;);&lt;span style="color: green"&gt;//读取web.config里的key为InjectAssembly的配置项&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( appSettings )) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;[] strArray = appSettings.Split( &lt;span style="color: blue"&gt;new char&lt;/span&gt;[] { &lt;span style="color: #a31515"&gt;',' &lt;/span&gt;} );&lt;br/&gt;            &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmStr &lt;span style="color: blue"&gt;in &lt;/span&gt;strArray) {&lt;span style="color: green"&gt;//遍历所有以&amp;quot;,&amp;quot;分割的程序集&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( asmStr )) &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName = asmStr.Trim();&lt;br/&gt;                &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly = loadAssemblyPrivate(asmName, ctx);&lt;span style="color: green"&gt;//加载web.config中的InjectAssembly，并加入ObjectContext&lt;br/&gt;                &lt;/span&gt;findTypesPrivate( assembly, asmName, ctx );&lt;br/&gt;            }&lt;br/&gt;        }&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;我们看看loadAssemblyPrivate这个方法: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;      /// &lt;/span&gt;&lt;span style="color: green"&gt;根据程序集名称加载web.config中的InjectAssembly，并加入ObjectContext&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;      /// &amp;lt;param name=&amp;quot;asmName&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;程序集名称&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;      /// &amp;lt;param name=&amp;quot;ctx&amp;quot;&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;容器实例&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/param&amp;gt;&lt;br/&gt;      /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;返回程序集&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;loadAssemblyPrivate( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName, &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly = &lt;span style="color: #2b91af"&gt;Assembly&lt;/span&gt;.Load( asmName );&lt;span style="color: green"&gt;//根据程序集名称加载程序集&lt;br/&gt;          &lt;/span&gt;ctx.AssemblyList.Add( asmName, assembly );&lt;span style="color: green"&gt;//加入ObjectContext的AssemblyList(所有纳入容器管理的程序集)&lt;br/&gt;          &lt;/span&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;assembly;&lt;span style="color: green"&gt;//返回程序集&lt;br/&gt;      &lt;/span&gt;}接下来findTypesPrivate方法: &lt;span style="color: blue"&gt;private static void &lt;/span&gt;findTypesPrivate( &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly, &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName, &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;[] types = assembly.GetTypes();&lt;span style="color: green"&gt;//返回程序集里定义的类型&lt;br/&gt;           &lt;/span&gt;ctx.AssemblyTypes.Add(asmName, types);&lt;span style="color: green"&gt;//这里加入ObjectContext的AssemblyTypes属性,所有程序集名称，所有类型&lt;br/&gt;           &lt;br/&gt;           &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;type &lt;span style="color: blue"&gt;in &lt;/span&gt;types) {&lt;span style="color: green"&gt;//遍历程序集下的所有类型&lt;br/&gt;               &lt;/span&gt;ctx.TypeList.Add(type.FullName, type);&lt;span style="color: green"&gt;//这里加入InjectAssembly下的TypeList所有类型，所有纳入容器管理的类型&lt;br/&gt;           &lt;/span&gt;}&lt;br/&gt;       }loadAssemblyAndTypes方法还是没什么很多的内容的,我们看看&lt;font color="#800000"&gt;第二行的&lt;/font&gt;&lt;font color="#ff0000"&gt;resolveAndInject( ctx ):&lt;/font&gt; &lt;span style="color: blue"&gt;private static void &lt;/span&gt;resolveAndInject( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; maps = &lt;span style="color: #2b91af"&gt;cdb&lt;/span&gt;.findAll&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;span style="color: green"&gt;//查询所有依赖注入里的配置项&lt;br/&gt;          &lt;/span&gt;&lt;span style="color: blue"&gt;if &lt;/span&gt;(maps.Count &amp;lt;= 0) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; resolvedMap = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;br/&gt;&lt;br/&gt;          logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;resolve item begin...&amp;quot; &lt;/span&gt;);&lt;span style="color: green"&gt;//记录日志&lt;br/&gt;          &lt;/span&gt;resolveMapItem( maps, resolvedMap, ctx );&lt;span style="color: green"&gt;//处理所有MapItem&lt;br/&gt;&lt;br/&gt;          &lt;/span&gt;logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;inject Object begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;          injectObjects( maps, resolvedMap );&lt;span style="color: green"&gt;//resolvedMap，处理过的MapItem:wojilu.Web.Context.ContextInit&lt;br/&gt;&lt;br/&gt;          &lt;/span&gt;ctx.ResolvedMap = resolvedMap;&lt;br/&gt;      }&lt;p&gt;&lt;font color="#ff0000"&gt;List&amp;lt;MapItem&amp;gt; maps = cdb.findAll&amp;lt;MapItem&amp;gt;();&lt;/font&gt;展开后涉及到比较多的代码,我们来把部分代码展开:&lt;/p&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;       /// &lt;/span&gt;&lt;span style="color: green"&gt;查询类型 T 的所有数据&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;       /// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br/&gt;       /// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;返回所有数据的列表&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; findAll&amp;lt;T&amp;gt;() &lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: #2b91af"&gt;CacheObject &lt;/span&gt;{&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;list = &lt;span style="color: #2b91af"&gt;MemoryDB&lt;/span&gt;.FindAll( &lt;span style="color: blue"&gt;typeof&lt;/span&gt;( T ) );&lt;span style="color: green"&gt;//如wojilu.DI.MapItem&lt;br/&gt;           &lt;/span&gt;&lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;db&lt;/span&gt;.getResults&amp;lt;T&amp;gt;( list );&lt;br/&gt;       }&lt;p&gt;这个方法在cdb类里：&lt;/p&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt; /// &lt;/span&gt;&lt;span style="color: green"&gt;从内存数据库中查询数据&lt;br/&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt; /// &amp;lt;remarks&amp;gt;&lt;br/&gt; /// &lt;/span&gt;&lt;span style="color: green"&gt;数据持久化在 /framework/data/ 目录下，以json格式存储。加载之后常驻内存。&lt;br/&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;特点：直接从内存中检索，速度相当于 Hashtable。插入和更新较慢(相对而言)，因为插入和更新会在内存中重建索引。&lt;br/&gt; &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/remarks&amp;gt;&lt;br/&gt; &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;cdb&lt;/span&gt;cdb.findAll&amp;lt;T&amp;gt;()方法又会调用MemoryDB.FindAll(typeof(T)): &lt;span style="color: blue"&gt;internal static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;FindAll( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;           &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;( GetObjectsByName( t ) );&lt;br/&gt;       }GetObjectsByName(Type t)如下: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;       /// &lt;/span&gt;&lt;span style="color: green"&gt;根据类型t得到以该类型t命名的配置文件中的所有类型&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;       /// &amp;lt;param name=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;       /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;GetObjectsByName( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(isCheckFileDB( t )) {&lt;span style="color: green"&gt;//是否应该检查配置文件&lt;br/&gt;&lt;br/&gt;               &lt;/span&gt;&lt;span style="color: blue"&gt;lock &lt;/span&gt;(chkLock) {&lt;br/&gt;&lt;br/&gt;                   &lt;span style="color: blue"&gt;if &lt;/span&gt;(isCheckFileDB( t )) {&lt;br/&gt;&lt;br/&gt;                       loadDataFromFile( t );&lt;span style="color: green"&gt;//从配置文件加载类型t&lt;br/&gt;                       &lt;/span&gt;_hasCheckedFileDB[t] = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;                   }&lt;br/&gt;&lt;br/&gt;               }&lt;br/&gt;&lt;br/&gt;           }&lt;br/&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;(objectList[t.FullName] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;);&lt;br/&gt;       }&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;loadDataFromFile(Type t )方法如下: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// &lt;/span&gt;&lt;span style="color: green"&gt;从配置文件中加载所有类型&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;loadDataFromFile( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(wojilu.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Exists( getCachePath( t ) )) {&lt;span style="color: green"&gt;//检查以类型t命名的配置文件是否存在&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;list = getListWithIndex( wojilu.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Read( getCachePath( t ) ), t );&lt;br/&gt;                objectList[t.FullName] = list;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: blue"&gt;else &lt;/span&gt;{&lt;br/&gt;                objectList[t.FullName] = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;();&lt;br/&gt;            }&lt;br/&gt;        }&lt;p&gt;最主要是getListWithIndex( String jsonString, Type t )方法:&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;getListWithIndex( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;jsonString, &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;list = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;();&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( jsonString )) &lt;span style="color: blue"&gt;return &lt;/span&gt;list;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; lists = &lt;span style="color: #2b91af"&gt;JsonParser&lt;/span&gt;.Parse( jsonString ) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt;;&lt;span style="color: green"&gt;//解析json格式的数组,返回Dictionary类型的数组，包含Name,Type&lt;br/&gt;&lt;br/&gt;           &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: blue"&gt;object&lt;/span&gt;&amp;gt; map &lt;span style="color: blue"&gt;in &lt;/span&gt;lists) {&lt;span style="color: green"&gt;//遍历&lt;br/&gt;&lt;br/&gt;               &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CacheObject &lt;/span&gt;obj = &lt;span style="color: #2b91af"&gt;JSON&lt;/span&gt;.setValueToObject( t, map ) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CacheObject&lt;/span&gt;;&lt;span style="color: green"&gt;//把json数组里的Type转换为t对象里的属性&lt;br/&gt;               &lt;/span&gt;&lt;span style="color: blue"&gt;int &lt;/span&gt;index = list.Add( obj );&lt;br/&gt;               addIdIndex( t.FullName, obj.Id, index );&lt;br/&gt;               makeIndexByInsert( obj );&lt;br/&gt;           }&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;list;&lt;br/&gt;       }&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:ec478550-46b4-4674-ad10-e342b084fa7e" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155489931.PNG" title="" rel="thumbnail"&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155491750.png" width="335" height="148" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;至于resolveMapItem和injectObjects&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;resolveMapItem( &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; maps, &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; resolvedMap, &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx )&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;span style="color: blue"&gt;private static void     &lt;/span&gt;injectObjects( &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; mapItems, &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; resolvedMap ) &lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:8747F07C-CDE8-481f-B0DF-C6CFD074BF67:b793a7c4-d63f-43b4-9bb4-dce7f9368ecf" class="wlWriterEditableSmartContent"&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155511618.PNG" title="" rel="thumbnail"&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/johnwonder/201201/201201162155523994.png" width="335" height="120" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;两个方法也是跟注入对象相关。我们最后来看下addNamedObjects方法:&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;addNamedObjects( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; resolvedMap = ctx.ResolvedMap;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Hashtable &lt;/span&gt;namedObjects = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;();&lt;br/&gt;           &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;KeyValuePair&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; entry &lt;span style="color: blue"&gt;in &lt;/span&gt;resolvedMap) {&lt;br/&gt;               &lt;span style="color: #2b91af"&gt;MapItem &lt;/span&gt;item = entry.Value;&lt;br/&gt;               namedObjects.Add( item.Name, item.TargetObject );&lt;br/&gt;           }&lt;br/&gt;           ctx.ObjectsByName = namedObjects;&lt;br/&gt;       }&lt;p&gt;这个很简单，把处理过的MapItem附给根据名称罗列的对象表(HashTable)。&lt;/p&gt;&lt;p&gt;总结：今后还得继续对wojilu的DI容器代码分析深入研究。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2324120.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/16/2324120.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322115.html</id><title type="text">我记录开源系统1.6源码解析(二)</title><summary type="text">上一篇我们主要把 wojilu.Web.Mvc.MvcFilterLoader.Init();这行代码深入分析了下，遗留的问题如下:1.在遍历mvc过滤器的每一项时，里面涉及到的初始化DI注入没有详细的解析，感觉比较模糊，因为InitInject函数中涉及到的内容比较多。2.过滤器的Process方法还不知道是干嘛的。3.MvcEventPublisher:Mvc处理流程中的事件发布者，也不知道...</summary><published>2012-01-13T15:20:00Z</published><updated>2012-01-13T15:20:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322115.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322115.html"/><content type="html">&lt;p&gt;上一篇我们主要把&lt;/p&gt;  wojilu.Web.Mvc.&lt;span style="color: #2b91af"&gt;MvcFilterLoader&lt;/span&gt;.Init();&lt;p&gt;这行代码深入分析了下，遗留的问题如下:&lt;/p&gt;&lt;p&gt;1.在遍历mvc过滤器的每一项时，里面涉及到的初始化DI注入没有详细的解析，感觉比较模糊，因为InitInject函数中涉及到的内容比较多。&lt;/p&gt;&lt;p&gt;2.过滤器的Process方法还不知道是干嘛的。&lt;/p&gt;&lt;p&gt;3.MvcEventPublisher:Mvc处理流程中的事件发布者，也不知道是干嘛的。&lt;/p&gt;&lt;p&gt;这篇我们就先把第一个问题给解决。那我们就回到ObjectContext这个IOC管理容器来，不明白IOC的可以到&lt;/p&gt;&lt;p&gt;&lt;a href="http://baike.baidu.com/view/146665.htm"&gt;http://baike.baidu.com/view/146665.htm&lt;/a&gt; 查看它的基本概念:&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;IOC的基本概念是：不创建对象，但是描述创建它们的方式。在代码中不直接与对象和服务连接，但在配置文件中描述哪一&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;个组件需要哪一项服务。容器负责将这些联系在一起。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;ObjectContext类里一眼望去静态函数和静态成员比较多，还包含一些私有成员,这里我们主要研究它的GetByType函数。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font color="#000000"&gt;它有二个重载：&lt;/font&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;GetByType( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;typeFullName )&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;GetByType( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t )&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;系统注明了都是 从缓存中取对象(有注入的就注入，没有注入的直接生成)，结果是单例。&lt;/p&gt;&lt;p&gt;这里我们看第一个函数，包含三行代码，最后一行调用第二个函数，都返回Object类型。&lt;/p&gt;&lt;p&gt;我们着重看第一个函数中的Instance变量，它是ObjectContext的实例(单例),里面就是最主要的InitInject方法&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;InitInject( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;            loadAssemblyAndTypes( ctx );&lt;br/&gt;            resolveAndInject( ctx );&lt;br/&gt;            addNamedObjects( ctx );&lt;br/&gt;        }&lt;p&gt;它干了三件事情:第一件比较简单，加载在web.config内的key为InjectAssembly的程序集，然后把它加ObjectContext&lt;/p&gt;&lt;p&gt;的TypeList中。&lt;/p&gt;&lt;p&gt;第二件事比较复杂，简单的说是把已经解析过的类型放到ObjectContext的ResolvedMap属性中。里面涉及到的一个类&lt;/p&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: green"&gt;依赖注入中的配置项&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MapItem &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;CacheObject&lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;关键就是&lt;/p&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; maps = &lt;span style="color: #2b91af"&gt;cdb&lt;/span&gt;.findAll&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;p&gt;这句代码做的什么工作呢? 查询在 /framework/data/ 目录下MapItem类型全称的配置文件中的以Json格式存储的数据&lt;/p&gt;&lt;p&gt;我们看看到底是什么&lt;/p&gt;[    &lt;br/&gt;    { Name:&amp;quot;contextInit&amp;quot;, Type:&amp;quot;wojilu.Web.Context.ContextInit&amp;quot; }    &lt;br/&gt;]&lt;p&gt;这里只包含以contextInit为Name的一项。&lt;/p&gt;&lt;p&gt;resolveAndInject随后就对它&lt;/p&gt;logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;resolve item begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;resolveMapItem( maps, resolvedMap, ctx );&lt;br/&gt;&lt;br/&gt;logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;inject Object begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;injectObjects( maps, resolvedMap );&lt;p&gt;其实里面还涉及到很多的操作，包括MemoryDB类里的函数调用,Json的数据操作等等。。以后再一一解析。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;我们来看看wojilu.Web.Context.ContextInit类&lt;/p&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ContextInit &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;ContextInitBase&lt;/span&gt;&lt;p&gt;位于wojilu.core项目中，我们将在后续为您解析该类，从名字上可以看出些，就是对运行上下文的初始化。&lt;/p&gt;&lt;p&gt;好，我们回到addNameObjects这个函数上来，这个就比较简单，就是把resolveAndInject的ResolvedMap附给&lt;/p&gt;&lt;p&gt;ObjectContext的ObjectsByName。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2322115.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322115.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322059.html</id><title type="text">我记录开源系统1.6源码解析（一）</title><summary type="text">我记录给我的感觉还可以，毕竟大部分是出自一人之手，能做到这样已经很不错，下面我来一步步尝试分析它是如何实现如 此强大的功能的。 首先从Global.asax开始，这是应用程序开始的地方，可以看到Application_Start这个方法。我们可以先从这个方法入手。 wojilu.Web.SystemInfo.Init();//系统的固定数据,比如网站根路径，app路径，主机(...</summary><published>2012-01-13T13:30:00Z</published><updated>2012-01-13T13:30:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322059.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322059.html"/><content type="html">&lt;p&gt;我记录给我的感觉还可以，毕竟大部分是出自一人之手，能做到这样已经很不错，下面我来一步步尝试分析它是如何实现如&lt;/p&gt;  &lt;p&gt;此强大的功能的。&lt;/p&gt;  &lt;p&gt;首先从Global.asax开始，这是应用程序开始的地方，可以看到Application_Start这个方法。我们可以先从这个方法入手。&lt;/p&gt;          wojilu.Web.&lt;span style="color: #2b91af"&gt;SystemInfo&lt;/span&gt;.Init();&lt;span style="color: green"&gt;//系统的固定数据,比如网站根路径，app路径，主机(ip+端口号)名称等。这里的信息是以后路由的参考信息,在以后Url和实际地址映射的时候将用到这里的数据&lt;br/&gt;&lt;/span&gt;&lt;p&gt;  &lt;br /&gt;首先分析&lt;span style="color: #ff0000"&gt;wojilu.Web.SystemInfo.Init()&lt;/span&gt;方法,该方法在SystemInfo这个类下，属于静态方法可以直接由类调用。   &lt;br /&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;public static void &lt;/span&gt;Init() {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(_hasInitialized) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;lock &lt;/span&gt;(_objLock) {&lt;br/&gt;               &lt;span style="color: blue"&gt;if &lt;/span&gt;(_hasInitialized) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;               &lt;span style="color: #2b91af"&gt;SystemInfo &lt;/span&gt;obj = &lt;span style="color: #2b91af"&gt;SystemInfo&lt;/span&gt;.Instance;&lt;br/&gt;               _hasInitialized = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br/&gt;           }&lt;br/&gt;       }&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;简单的几行却做了很多工作,if(_hasInitialized)判断是否已经初始化，如果已经初始化就返回不执行下面的代码，lock代码片段应该是控制并发操作的，通过锁住某个对象(_objLock),_objLock对象定义如下:&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;_objLock = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object&lt;/span&gt;();&lt;p&gt;  &lt;br /&gt;关键在于   &lt;br /&gt;&lt;/p&gt;&lt;span style="color: #2b91af"&gt;SystemInfo &lt;/span&gt;obj = &lt;span style="color: #2b91af"&gt;SystemInfo&lt;/span&gt;.Instance;&lt;p&gt;  &lt;br /&gt;此代码调用了SystemInfo的静态成员Instance   &lt;br /&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SystemInfo &lt;/span&gt;Instance = loadSystemInfo();&lt;p&gt;  &lt;br /&gt;这里又调用了loadSystemInfo方法。主要就是loadSystemInfo这个方法了。我们把目光转移到此方法上就好。   &lt;br /&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SystemInfo &lt;/span&gt;loadSystemInfo() {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;SystemInfo &lt;/span&gt;obj = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;SystemInfo&lt;/span&gt;();&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(IsWeb) {&lt;br/&gt;               obj.applicationPath = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.ApplicationPath;&lt;span style="color: green"&gt;//用在映射文件绝对路径&lt;br/&gt;               &lt;/span&gt;obj.rootPath = addEndSlash( obj.applicationPath );&lt;br/&gt;               obj.host = &lt;span style="color: #2b91af"&gt;HttpContext&lt;/span&gt;.Current.Request.Url.Host;&lt;br/&gt;           }&lt;br/&gt;           &lt;span style="color: blue"&gt;else &lt;/span&gt;{&lt;br/&gt;               obj.applicationPath = &lt;span style="color: #a31515"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;;&lt;br/&gt;               obj.rootPath = &lt;span style="color: #a31515"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;;&lt;br/&gt;               obj.host = &lt;span style="color: #a31515"&gt;&amp;quot;localhost&amp;quot;&lt;/span&gt;;&lt;br/&gt;           }&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;obj;&lt;br/&gt;&lt;br/&gt;       }&lt;p&gt;首先初始化SystemInfo实例，结果返回该实例，代码很简单，就给实例的属性赋值，包括:&lt;span style="color: #ff0000"&gt;applicationPath,rootPath,hostPath&lt;/span&gt;,用于系统初始化。addEndSlash方&lt;/p&gt;&lt;p&gt;法定义如下:&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;addEndSlash( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;appPath ) {&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(!appPath.EndsWith( &lt;span style="color: #a31515"&gt;&amp;quot;/&amp;quot; &lt;/span&gt;)) &lt;span style="color: blue"&gt;return &lt;/span&gt;appPath + &lt;span style="color: #a31515"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;;&lt;br/&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;appPath;&lt;br/&gt;       }&lt;p&gt;很简单，就是返回以“/”结束的字符串。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #ff0000"&gt;wojilu.Web.SystemInfo.Init()&lt;/span&gt;方法就解析到这，接下来我们会解析&lt;/p&gt;wojilu.Web.Mvc.&lt;span style="color: #2b91af"&gt;MvcFilterLoader&lt;/span&gt;.Init();&lt;p&gt;  &lt;br /&gt;这个重要的方法,该方法会把我们导向Web.Config中和本系统相关的很多重要的功能。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2322059.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/13/2322059.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/12/2321102.html</id><title type="text">我记录开源系统1.6源码解析(二)上</title><summary type="text">今天我们来解析 wojilu.Web.Mvc.MvcFilterLoader.Init();这行很重要的代码，我记录已经提示说是mvc过滤器的加载器, 顾名思义，肯定和我记录的mvc模式相关。首先我们按VS F12快捷键转入MvcFilterLoader类，我们可以发现该类只有一个静态方法Init():public static void Init() { List&lt;Str...</summary><published>2012-01-12T15:09:00Z</published><updated>2012-01-12T15:09:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/12/2321102.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/12/2321102.html"/><content type="html">&lt;p&gt;今天我们来解析&lt;/p&gt;  wojilu.Web.Mvc.&lt;span style="color: #2b91af"&gt;MvcFilterLoader&lt;/span&gt;.Init();&lt;p&gt;这行很重要的代码，我记录已经提示说是&lt;font color="#ff0000"&gt;mvc过滤器的加载器, 顾名思义，肯定和我记录的mvc模式相关。&lt;/font&gt;&lt;/p&gt;&lt;p&gt;首先我们按VS F12快捷键转入MvcFilterLoader类，我们可以发现该类只有一个静态方法Init():&lt;/p&gt;&lt;span style="color: blue"&gt;public static void &lt;/span&gt;Init() {&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; filter = &lt;span style="color: #2b91af"&gt;MvcConfig&lt;/span&gt;.Instance.Filter;&lt;span style="color: green"&gt;//获取filter : wojilu.Web.Controller.RenderHelper&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;t &lt;span style="color: blue"&gt;in &lt;/span&gt;filter) {&lt;br/&gt;&lt;br/&gt;                &lt;span style="color: #2b91af"&gt;IMvcFilter &lt;/span&gt;f = &lt;span style="color: #2b91af"&gt;ObjectContext&lt;/span&gt;.GetByType( t ) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IMvcFilter&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: blue"&gt;if &lt;/span&gt;(f == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;br/&gt;                f.Process( &lt;span style="color: #2b91af"&gt;MvcEventPublisher&lt;/span&gt;.Instance );&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;&lt;br/&gt;        }首先定义List类型的filter变量，该变量通过MvcConfig类实例的Filter成员获得。MvcConfig是关于Mvc配置的类： &lt;span style="color: blue"&gt;public static readonly &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MvcConfig &lt;/span&gt;Instance = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MvcConfig&lt;/span&gt;();&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;      /// &lt;/span&gt;&lt;span style="color: green"&gt;自定义的过滤器类型，比如 wojilu.Web.Controller.RenderHelper&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: blue"&gt;public &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; Filter { &lt;span style="color: blue"&gt;get &lt;/span&gt;{ &lt;span style="color: blue"&gt;return &lt;/span&gt;_filterList; } }&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;MvcConfig包含一个List&amp;lt;String&amp;gt;类型的Filter属性,返回_filterList这个私有成员,我们再来看看MvcConfig的构造函数: &lt;span style="color: blue"&gt;private &lt;/span&gt;MvcConfig() {&lt;br/&gt;&lt;br/&gt;          &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; dic = &lt;span style="color: #2b91af"&gt;cfgHelper&lt;/span&gt;.Read( &lt;span style="color: #2b91af"&gt;PathHelper&lt;/span&gt;.Map( &lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.Join( &lt;span style="color: #2b91af"&gt;cfgHelper&lt;/span&gt;.ConfigRoot, &lt;span style="color: #a31515"&gt;&amp;quot;mvc.config&amp;quot; &lt;/span&gt;) ) );&lt;br/&gt;&lt;br/&gt;          _routeConfigPath = &lt;span style="color: #2b91af"&gt;PathHelper&lt;/span&gt;.Map( &lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.Join( &lt;span style="color: #2b91af"&gt;cfgHelper&lt;/span&gt;.ConfigRoot, &lt;span style="color: #a31515"&gt;&amp;quot;route.config&amp;quot; &lt;/span&gt;) );&lt;br/&gt;&lt;br/&gt;          _rootNamespace = getRootNamespace(dic);&lt;span style="color: green"&gt;//// 多个 namespace 之间用英文逗号隔开rootNamespace: wojilu.Web.Controller&lt;br/&gt;          &lt;/span&gt;_isParseAppId = getIsParseAppId( dic );&lt;br/&gt;          _isCacheView = getIsCacheView( dic );&lt;br/&gt;&lt;br/&gt;          _urlExt = getUrlExt( dic );&lt;br/&gt;          _viewExt = getViewExt( dic );&lt;br/&gt;          _viewDir = getViewDir( dic );&lt;br/&gt;          _filterList = getFilterList( dic );&lt;br/&gt;&lt;br/&gt;          dic.TryGetValue( &lt;span style="color: #a31515"&gt;&amp;quot;jsVersion&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;out &lt;/span&gt;_jsVersion );&lt;br/&gt;          dic.TryGetValue( &lt;span style="color: #a31515"&gt;&amp;quot;cssVersion&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;out &lt;/span&gt;_cssVersion );&lt;br/&gt;          dic.TryGetValue( &lt;span style="color: #a31515"&gt;&amp;quot;staticDomain&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;out &lt;/span&gt;_staticDomain );&lt;br/&gt;          dic.TryGetValue( &lt;span style="color: #a31515"&gt;&amp;quot;noLogError&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;out &lt;/span&gt;_noLogError );&lt;br/&gt;      }首先定义一个读取mvc.config配置文件的字典集合，我们可以先忽略其他代码直接看_filterList，它通过getFilterList这个方法来赋值: &lt;span style="color: blue"&gt;private &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; getFilterList( &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; dic ) {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt; result = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;&amp;gt;();&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;filter;&lt;br/&gt;           dic.TryGetValue( &lt;span style="color: #a31515"&gt;&amp;quot;filter&amp;quot;&lt;/span&gt;, &lt;span style="color: blue"&gt;out &lt;/span&gt;filter );&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( filter )) &lt;span style="color: blue"&gt;return &lt;/span&gt;result;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;[] arrF = filter.Split( &lt;span style="color: #a31515"&gt;',' &lt;/span&gt;);&lt;br/&gt;           &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;f &lt;span style="color: blue"&gt;in &lt;/span&gt;arrF) {&lt;br/&gt;               &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( f )) &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;br/&gt;               result.Add( f.Trim() );&lt;br/&gt;           }&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;return &lt;/span&gt;result;&lt;br/&gt;       }&lt;p&gt;可以看到关键dic.TryGetValue(“filter”,out filter)这行代码,从集合里取出关键字为filter的值,返回result.也就是说我们&lt;/p&gt;&lt;p&gt;mvc.config配置文件里需包含以filter开头的键值对。&lt;/p&gt;&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 我们再回到MvcFilterLoader的Init方法中来，获取到filter集合后,就遍历该集合&lt;/p&gt;&lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;t &lt;span style="color: blue"&gt;in &lt;/span&gt;filter) {&lt;br/&gt;&lt;br/&gt;                &lt;span style="color: #2b91af"&gt;IMvcFilter &lt;/span&gt;f = &lt;span style="color: #2b91af"&gt;ObjectContext&lt;/span&gt;.GetByType( t ) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IMvcFilter&lt;/span&gt;;&lt;br/&gt;                &lt;span style="color: blue"&gt;if &lt;/span&gt;(f == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;br/&gt;                f.Process( &lt;span style="color: #2b91af"&gt;MvcEventPublisher&lt;/span&gt;.Instance );&lt;br/&gt;&lt;br/&gt;            }这里对集合中的每一项做了处理,这里引入了IOC管理容器ObjectContext,我们直接看它的GetByType方法 &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// &lt;/span&gt;&lt;span style="color: green"&gt;从缓存中取对象(有注入的就注入，没有注入的直接生成)，结果是单例&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;        /// &amp;lt;param name=&amp;quot;typeFullName&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;GetByType( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;typeFullName ) {&lt;br/&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(Instance.TypeList.ContainsKey( typeFullName ) == &lt;span style="color: blue"&gt;false&lt;/span&gt;) &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&lt;br/&gt;            &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t = Instance.TypeList[typeFullName];&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;GetByType( t );&lt;br/&gt;        }首先判断ObjectContext单例Instance中是否包含该filter,&lt;font color="#ff0000"&gt;(注:以下代码过于深入，可以忽略)&lt;/font&gt;单例定义如下: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;        /// &lt;/span&gt;&lt;span style="color: green"&gt;容器的实例(单例)&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;Instance {&lt;br/&gt;            &lt;span style="color: blue"&gt;get &lt;/span&gt;{&lt;br/&gt;                &lt;span style="color: blue"&gt;if &lt;/span&gt;(_instance == &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&lt;br/&gt;                    &lt;span style="color: blue"&gt;lock &lt;/span&gt;(syncRoot) {&lt;br/&gt;                        &lt;span style="color: blue"&gt;if &lt;/span&gt;(_instance == &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&lt;br/&gt;                            &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ObjectContext&lt;/span&gt;();&lt;br/&gt;                            InitInject( ctx );&lt;br/&gt;                            _instance = ctx;&lt;br/&gt;                        }&lt;br/&gt;                    }&lt;br/&gt;                }&lt;br/&gt;                &lt;span style="color: blue"&gt;return &lt;/span&gt;_instance;&lt;br/&gt;            }&lt;br/&gt;        }&lt;p&gt;首先判断是否已存在_Instance,不存在就给他赋值,_instance定义如下:&lt;/p&gt;&lt;span style="color: blue"&gt;private static volatile &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;_instance;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;volatile这个关键字可以参考&lt;a title="http://msdn.microsoft.com/zh-cn/x13ttww7.aspx" href="http://msdn.microsoft.com/zh-cn/x13ttww7.aspx"&gt;http://msdn.microsoft.com/zh-cn/x13ttww7.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这里最重要的就是InitInject方法了&lt;/p&gt;&lt;p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;InitInject( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;         loadAssemblyAndTypes( ctx );&lt;br/&gt;         resolveAndInject( ctx );&lt;br/&gt;         addNamedObjects( ctx );&lt;br/&gt;     }&lt;/p&gt;&lt;p&gt;连续调用了三个函数：&lt;font color="#ff0000"&gt;loadAssemblyAndTypes,resolveAndInject,addNameObjects&lt;/font&gt;:&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;loadAssemblyAndTypes( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;appSettings = &lt;span style="color: #2b91af"&gt;cfgHelper&lt;/span&gt;.GetAppSettings( &lt;span style="color: #a31515"&gt;&amp;quot;InjectAssembly&amp;quot; &lt;/span&gt;);&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( appSettings )) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;String&lt;/span&gt;[] strArray = appSettings.Split( &lt;span style="color: blue"&gt;new char&lt;/span&gt;[] { &lt;span style="color: #a31515"&gt;',' &lt;/span&gt;} );&lt;br/&gt;           &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmStr &lt;span style="color: blue"&gt;in &lt;/span&gt;strArray) {&lt;br/&gt;&lt;br/&gt;               &lt;span style="color: blue"&gt;if &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;strUtil&lt;/span&gt;.IsNullOrEmpty( asmStr )) &lt;span style="color: blue"&gt;continue&lt;/span&gt;;&lt;br/&gt;               &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName = asmStr.Trim();&lt;br/&gt;               &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly = loadAssemblyPrivate( asmName, ctx );&lt;br/&gt;               findTypesPrivate( assembly, asmName, ctx );&lt;br/&gt;           }&lt;br/&gt;       }首先从web.config中获取InjectAssemblys，然后遍历该集合，loadAssemblyPrivate函数如下 &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;loadAssemblyPrivate( &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName, &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;         &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly = &lt;span style="color: #2b91af"&gt;Assembly&lt;/span&gt;.Load( asmName );&lt;br/&gt;         ctx.AssemblyList.Add( asmName, assembly );&lt;br/&gt;         &lt;span style="color: blue"&gt;return &lt;/span&gt;assembly;&lt;br/&gt;     }&lt;p&gt;&lt;font color="#ff0000"&gt;其实绕了这么多最终是在ObjectContext中添加AssemblyList。&lt;/font&gt;&lt;font color="#000000"&gt;findTypesPrivate函数如下:&lt;/font&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;findTypesPrivate( &lt;span style="color: #2b91af"&gt;Assembly &lt;/span&gt;assembly, &lt;span style="color: #2b91af"&gt;String &lt;/span&gt;asmName, &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Type&lt;/span&gt;[] types = assembly.GetTypes();&lt;br/&gt;           ctx.AssemblyTypes.Add( asmName, types );&lt;br/&gt;           &lt;br/&gt;           &lt;span style="color: blue"&gt;foreach &lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;type &lt;span style="color: blue"&gt;in &lt;/span&gt;types) {&lt;br/&gt;               ctx.TypeList.Add(type.FullName, type);&lt;span style="color: green"&gt;//这里加入InjectAssembly下的所有程序集&lt;br/&gt;           &lt;/span&gt;}&lt;br/&gt;       }&lt;p&gt;也是对ObjectContext中的AssemblyTypes，TypeList集合添加项。&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;loadAssemblyAndTypes&lt;/font&gt;&lt;font color="#000000"&gt;就做这么多工作.接下来我们看&lt;font color="#ff0000"&gt;resolveAndInject函数&lt;/font&gt;:&lt;/font&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;private static void &lt;/span&gt;resolveAndInject( &lt;span style="color: #2b91af"&gt;ObjectContext &lt;/span&gt;ctx ) {&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; maps = &lt;span style="color: #2b91af"&gt;cdb&lt;/span&gt;.findAll&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(maps.Count &amp;lt;= 0) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; resolvedMap = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Dictionary&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;String&lt;/span&gt;, &lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;br/&gt;&lt;br/&gt;           logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;resolve item begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;           resolveMapItem( maps, resolvedMap, ctx );&lt;br/&gt;&lt;br/&gt;           logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;inject Object begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;           injectObjects( maps, resolvedMap );&lt;br/&gt;&lt;br/&gt;           ctx.ResolvedMap = resolvedMap;&lt;br/&gt;       }这里首先查找List&amp;lt;MapItem&amp;gt;类型的maps,用到了cdb这个类: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;  /// &lt;/span&gt;&lt;span style="color: green"&gt;从内存数据库中查询数据&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;  /// &amp;lt;remarks&amp;gt;&lt;br/&gt;  /// &lt;/span&gt;&lt;span style="color: green"&gt;数据持久化在 /framework/data/ 目录下，以json格式存储。加载之后常驻内存。&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: gray"&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;特点：直接从内存中检索，速度相当于 Hashtable。插入和更新较慢(相对而言)，因为插入和更新会在内存中重建索引。&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/remarks&amp;gt;&lt;br/&gt;  &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;cdb &lt;/span&gt;很清楚的可以看到此类的作用，MapItem也是比较重要的一个类 &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;    /// &lt;/span&gt;&lt;span style="color: green"&gt;依赖注入中的配置项&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;MapItem &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;CacheObject&lt;/span&gt;此类继承自CacheObject &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;   /// &lt;/span&gt;&lt;span style="color: green"&gt;缓存对象，常驻内存，同时以json格式存储在磁盘中&lt;br/&gt;   &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;   &lt;/span&gt;[&lt;span style="color: #2b91af"&gt;Serializable&lt;/span&gt;]&lt;br/&gt;   &lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;CacheObject &lt;/span&gt;这两个类留待今后的详细解析。。我们再回到&lt;font color="#ff0000"&gt;cdb.findAll&amp;lt;MapItem&amp;gt;()&lt;/font&gt;这个方法上,看看cdb的fingAll泛型方法: &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;/// &lt;/span&gt;&lt;span style="color: green"&gt;查询类型 T 的所有数据&lt;br/&gt;&lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;/// &amp;lt;typeparam name=&amp;quot;T&amp;quot;&amp;gt;&amp;lt;/typeparam&amp;gt;&lt;br/&gt;/// &amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green"&gt;返回所有数据的列表&lt;/span&gt;&lt;span style="color: gray"&gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;T&amp;gt; findAll&amp;lt;T&amp;gt;() &lt;span style="color: blue"&gt;where &lt;/span&gt;T : &lt;span style="color: #2b91af"&gt;CacheObject &lt;/span&gt;{&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;list = &lt;span style="color: #2b91af"&gt;MemoryDB&lt;/span&gt;.FindAll( &lt;span style="color: blue"&gt;typeof&lt;/span&gt;( T ) );&lt;br/&gt;    &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;db&lt;/span&gt;.getResults&amp;lt;T&amp;gt;( list );&lt;br/&gt;}泛型方法再加上T类型的约束CacheObject,我们又看到了两个新类MemoryDB和db类，&lt;font color="#ff0000"&gt;MemoryDB的FindAll&lt;/font&gt;方法如下: &lt;span style="color: blue"&gt;internal static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;FindAll( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;            &lt;span style="color: blue"&gt;return new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;( GetObjectsByName( t ) );&lt;br/&gt;        }这里采用internal关键字了。。返回一个ArrayList,GetOejectsByName方法如下: &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;GetObjectsByName( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;&lt;br/&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(isCheckFileDB( t )) {&lt;br/&gt;&lt;br/&gt;                &lt;span style="color: blue"&gt;lock &lt;/span&gt;(chkLock) {&lt;br/&gt;&lt;br/&gt;                    &lt;span style="color: blue"&gt;if &lt;/span&gt;(isCheckFileDB( t )) {&lt;br/&gt;&lt;br/&gt;                        loadDataFromFile( t );&lt;br/&gt;                        _hasCheckedFileDB[t] = &lt;span style="color: blue"&gt;true&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;                    }&lt;br/&gt;&lt;br/&gt;                }&lt;br/&gt;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: blue"&gt;return &lt;/span&gt;(objectList[t.FullName] &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IList&lt;/span&gt;);&lt;br/&gt;        }这里调用isCheckFileDB,loadDataFromFile，不管怎样都是要返回objectList[t.FullName],看看objectList集合 &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IDictionary &lt;/span&gt;objectList = &lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;.Synchronized( &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;() );&lt;p&gt;&lt;font color="#ff0000"&gt;还是个IDictionary类型..&lt;/font&gt;&lt;font color="#000000"&gt;回过来再看isCheckFileDB函数:&lt;/font&gt;&lt;/p&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Boolean &lt;/span&gt;isCheckFileDB( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(_hasCheckedFileDB[t] == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;return true&lt;/span&gt;;&lt;br/&gt;            &lt;span style="color: blue"&gt;return false&lt;/span&gt;;&lt;br/&gt;        }如果_hasCheckedFileDB中不包含t，就返回true. &lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable &lt;/span&gt;_hasCheckedFileDB = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Hashtable&lt;/span&gt;();再看看loadDataFromFile函数: &lt;span style="color: blue"&gt;private static void &lt;/span&gt;loadDataFromFile( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;            &lt;span style="color: blue"&gt;if &lt;/span&gt;(wojilu.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Exists( getCachePath( t ) )) {&lt;br/&gt;                &lt;span style="color: #2b91af"&gt;IList &lt;/span&gt;list = getListWithIndex( wojilu.IO.&lt;span style="color: #2b91af"&gt;File&lt;/span&gt;.Read( getCachePath( t ) ), t );&lt;br/&gt;                objectList[t.FullName] = list;&lt;br/&gt;            }&lt;br/&gt;            &lt;span style="color: blue"&gt;else &lt;/span&gt;{&lt;br/&gt;                objectList[t.FullName] = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ArrayList&lt;/span&gt;();&lt;br/&gt;            }&lt;br/&gt;        }&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000" size="3"&gt;其实isCheckFileDB函数和loadDataFromFile函数都是为了返回objectList[t.FullName]..&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;可以看见，我记录中的代码是一层套一层，很容易被搞晕，也可以看出作者付出了很多劳动。其实分析了这么多也就是在&lt;/p&gt;&lt;p&gt;&lt;font color="#ff0000"&gt;resolveAndInject函数&lt;/font&gt;中。。&lt;/p&gt;&lt;p&gt;调用&lt;/p&gt;&lt;span style="color: #2b91af"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt; maps = &lt;span style="color: #2b91af"&gt;cdb&lt;/span&gt;.findAll&amp;lt;&lt;span style="color: #2b91af"&gt;MapItem&lt;/span&gt;&amp;gt;();&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(maps.Count &amp;lt;= 0) &lt;span style="color: blue"&gt;return&lt;/span&gt;;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;&lt;p&gt;最终目的是在&lt;/p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;resolve item begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;resolveMapItem( maps, resolvedMap, ctx );&lt;br/&gt;&lt;br/&gt;logger.Info( &lt;span style="color: #a31515"&gt;&amp;quot;inject Object begin...&amp;quot; &lt;/span&gt;);&lt;br/&gt;injectObjects( maps, resolvedMap );&lt;br/&gt;&lt;br/&gt;ctx.ResolvedMap = resolvedMap;&lt;p&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;这几句代码上，详细代码就不一一展开。。其实就是把系统操作记录日志，DI操作等。&lt;/p&gt;&lt;p&gt;我们可以简单的归纳为&lt;font color="#ff0000"&gt;ObjectContext.GetByType(String typeFullName) --&amp;gt;判断ObjectContext单例Instance中是否包含该filter&lt;/font&gt;,有就从Instance.TypeList里去取,最后就通过GetByType函数返回单例：&lt;/p&gt;&lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;       /// &lt;/span&gt;&lt;span style="color: green"&gt;从缓存中取对象(有注入的就注入，没有注入的直接生成)，结果是单例&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;       /// &amp;lt;param name=&amp;quot;t&amp;quot;&amp;gt;&amp;lt;/param&amp;gt;&lt;br/&gt;       /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;br/&gt;       &lt;/span&gt;&lt;span style="color: blue"&gt;public static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;GetByType( &lt;span style="color: #2b91af"&gt;Type &lt;/span&gt;t ) {&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(t == &lt;span style="color: blue"&gt;null&lt;/span&gt;) &lt;span style="color: blue"&gt;return null&lt;/span&gt;;&lt;br/&gt;           &lt;span style="color: #2b91af"&gt;Object &lt;/span&gt;result = Instance.ObjectsByType[t.FullName];&lt;br/&gt;&lt;br/&gt;           &lt;span style="color: blue"&gt;if &lt;/span&gt;(result == &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&lt;br/&gt;&lt;br/&gt;               &lt;span style="color: #2b91af"&gt;MapItem &lt;/span&gt;mapItem = getMapItemByType( t );&lt;br/&gt;               &lt;span style="color: blue"&gt;if &lt;/span&gt;(mapItem != &lt;span style="color: blue"&gt;null&lt;/span&gt;) {&lt;br/&gt;                   &lt;span style="color: blue"&gt;return &lt;/span&gt;createInstanceAndInject( mapItem );&lt;br/&gt;               }&lt;br/&gt;               &lt;span style="color: blue"&gt;else &lt;/span&gt;{&lt;br/&gt;                   &lt;span style="color: blue"&gt;return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;rft&lt;/span&gt;.GetInstance( t );&lt;br/&gt;               }&lt;br/&gt;&lt;br/&gt;           }&lt;br/&gt;           &lt;span style="color: blue"&gt;else&lt;br/&gt;               return &lt;/span&gt;result;&lt;br/&gt;       }&lt;p&gt;我记录的DI和Data这块今后需要深入解析下。。&lt;/p&gt;&lt;p&gt;再说的简单点,MvcFilterLoader.Init()函数中的&lt;/p&gt;&lt;span style="color: #2b91af"&gt;IMvcFilter &lt;/span&gt;f = &lt;span style="color: #2b91af"&gt;ObjectContext&lt;/span&gt;.GetByType( t ) &lt;span style="color: blue"&gt;as &lt;/span&gt;&lt;span style="color: #2b91af"&gt;IMvcFilter&lt;/span&gt;;这行就是获取 &lt;span style="color: gray"&gt;/// &amp;lt;summary&amp;gt;&lt;br/&gt;   /// &lt;/span&gt;&lt;span style="color: green"&gt;MvcFilterLoader中初始化调用的&lt;br/&gt;   &lt;/span&gt;&lt;span style="color: gray"&gt;/// &amp;lt;/summary&amp;gt;&lt;br/&gt;   &lt;/span&gt;&lt;span style="color: blue"&gt;public class &lt;/span&gt;&lt;span style="color: #2b91af"&gt;RenderHelper &lt;/span&gt;: &lt;span style="color: #2b91af"&gt;IMvcFilter &lt;/span&gt;&lt;a href="http://11011.net/software/vspaste"&gt;&lt;/a&gt;该类在wojilu.Web.Controller命名空间下。关于它的Process函数 &lt;span style="color: blue"&gt;public void &lt;/span&gt;Process( &lt;span style="color: #2b91af"&gt;MvcEventPublisher &lt;/span&gt;publisher ) {&lt;br/&gt;&lt;br/&gt;            publisher.Begin_ProcessMvc += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MvcEventArgs&lt;/span&gt;&amp;gt;( publisher_Begin_ProcessMvc );&lt;br/&gt;            publisher.Begin_Render += &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;EventHandler&lt;/span&gt;&amp;lt;&lt;span style="color: #2b91af"&gt;MvcEventArgs&lt;/span&gt;&amp;gt;( publisher_Begin_Render );&lt;br/&gt;&lt;br/&gt;        }我们将在下篇文章中详细解析。。&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2321102.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/12/2321102.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318091.html</id><title type="text">2011年度总结</title><summary type="text">2011年在技术上稳步前进，主要是silverlight配合WCF,Entity FrameWork这一块，公司产品也是选择了这个平台， 虽然没有做很深入的研究，但是可以算是入门级别了。 silverlight虽然前景不被看好，但还是需要学习，如它的智能表单(昕友：http://crmwin.com/Drupal.html) 2012首先要把博客这块好好整理...</summary><published>2012-01-10T06:19:00Z</published><updated>2012-01-10T06:19:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318091.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318091.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2011年在技术上稳步前进，主要是silverlight配合WCF,Entity FrameWork这一块，公司产品也是选择了这个平台，&lt;/p&gt;  &lt;p&gt;虽然没有做很深入的研究，但是可以算是入门级别了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; silverlight虽然前景不被看好，但还是需要学习，如它的智能表单(昕友：&lt;a title="http://crmwin.com/Drupal.html" href="http://crmwin.com/Drupal.html"&gt;http://crmwin.com/Drupal.html&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;font color="#ff0000"&gt;2012首先要把博客这块好好整理下，分门别类，归档，划分主次,现在感觉有点散乱，整理好了有助于学习。&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2012在JavaScript这块继续加强，争取可以研究框架源码,Prototype,Jquery,mootools,Dojo,ExtJs等等。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2012年在.net这块主要想在WCF和MVC上多花点功夫,其次想在移动应用开发上花点时间，主要想先在Android和WP&lt;/p&gt;  &lt;p&gt;上。还有就想学习PHP,在研究.net的CMS基础上把PHP顺带加强,接下来为建立自己的CMS系统打好基础。&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012年要坚持研究开源项目的源代码，像.net开源CMS（如我记录&lt;a href="http://www.wojilu.com"&gt;http://www.wojilu.com&lt;/a&gt;, telerik的Sitefinity&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;,&lt;a href="http://www.dotnetnuke.com"&gt;http://www.dotnetnuke.com&lt;/a&gt;)，先从我&lt;/font&gt;&lt;font style="background-color: #ffffff"&gt;记录开始，其次DotNetNuke,坚持学习并记录。&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012年在编程基础上也有待加强，买过的书需要逐一阅读并做随笔，坚持每天写篇技术随笔。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012还需把值得阅读的博客资料整理下，以便自己学习和提高。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2318091.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318091.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318032.html</id><title type="text">2011年度总结</title><summary type="text">2011年在技术上稳步前进，主要是silverlight配合WCF,Entity FrameWork这一块，公司产品也是选择了这个平台， 虽然没有做很深入的研究，但是可以算是入门级别了。 silverlight虽然前景不被看好，但还是需要学习，如它的智能表单(昕友：http://crmwin.com/Drupal.html) 2012年在.net这块主要想在...</summary><published>2012-01-10T05:34:00Z</published><updated>2012-01-10T05:34:00Z</updated><author><name>john23.net</name><uri>http://www.cnblogs.com/johnwonder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318032.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318032.html"/><content type="html">&lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2011年在技术上稳步前进，主要是silverlight配合WCF,Entity FrameWork这一块，公司产品也是选择了这个平台，&lt;/p&gt;  &lt;p&gt;虽然没有做很深入的研究，但是可以算是入门级别了。&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; silverlight虽然前景不被看好，但还是需要学习，如它的智能表单(昕友：&lt;a title="http://crmwin.com/Drupal.html" href="http://crmwin.com/Drupal.html"&gt;http://crmwin.com/Drupal.html&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; 2012年在.net这块主要想在WCF和MVC上多花点功夫,其次想在移动应用开发上花点时间，主要想先在Android和WP&lt;/p&gt;  &lt;p&gt;上。还有就想学习PHP,在研究.net的CMS基础上把PHP顺带加强,接下来为建立自己的CMS系统打好基础。&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012年要坚持研究开源项目的源代码，像.net开源CMS（如我记录&lt;a href="http://www.wojilu.com"&gt;http://www.wojilu.com&lt;/a&gt;, telerik的Sitefinity&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;,&lt;a href="http://www.dotnetnuke.com"&gt;http://www.dotnetnuke.com&lt;/a&gt;)，先从我&lt;/font&gt;&lt;font style="background-color: #ffffff"&gt;记录开始，其次DotNetNuke,坚持学习并记录。&lt;/font&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012年在编程基础上也有待加强，买过的书需要逐一阅读并做随笔，坚持每天写篇技术随笔。&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;font style="background-color: #ffffff"&gt;&amp;#160;&amp;#160; 2012还需把值得阅读的博客资料整理下，以便自己学习和提高。&lt;/font&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;img src="http://www.cnblogs.com/johnwonder/aggbug/2318032.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/johnwonder/archive/2012/01/10/2318032.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
