﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-代震军BLOG</title><link>http://www.cnblogs.com/daizhj/</link><description>　　　stay hungry, stay foolish!个人推荐：李大成装修公司(江苏装修)     在北京15年装修经验，江苏人。价钱公道，技术精湛。以质量求生存，以品质求发展是我们的工作信条。主打家装，酒店装饰等。联系电话：13522174127 </description><language>zh-cn</language><lastBuildDate>Wed, 10 Feb 2010 06:21:47 GMT</lastBuildDate><pubDate>Wed, 10 Feb 2010 06:21:47 GMT</pubDate><ttl>60</ttl><item><title>写在google中国离去前夕</title><link>http://www.cnblogs.com/daizhj/articles/1648257.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Fri, 15 Jan 2010 01:02:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/articles/1648257.html</guid><description><![CDATA[<p>阅读: 286 评论: 2 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2010-01-15 09:02 <a href="http://www.cnblogs.com/daizhj/articles/1648257.html" target="_blank">原文链接</a></p>只有注册用户登录后才能阅读该文。<a href='http://www.cnblogs.com/daizhj/articles/1648257.html'>阅读全文</a>。<img src="http://www.cnblogs.com/daizhj/aggbug/1648257.html?type=2" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/daizhj/articles/1648257.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/articles/1648257.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>目前为止功能最全的基于silverlight4(beta)的摄像头应用</title><link>http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Wed, 13 Jan 2010 01:06:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html</guid><description><![CDATA[<p>阅读: 2034 评论: 12 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2010-01-13 09:06 <a href="http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基于Silverlight4(beta)的WebCam(摄像头)应用，支持区域缩放，剪裁，自成生成缩略图，Ink涂鸦,以及特效等，同时也可将本地图片拖拽到编辑区域进行相应操作，支持保存到本地，打印图片信息, 鼠标右键菜单等等。</p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 开发环境:vs 2010 beta2 , silverlight 4 beta</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;运行配置：由于使用了上传功能，所以需要配置上传文件的读写权限，目录包括：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <strong>avatars/<br /></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>&nbsp;upload/<br /></strong></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<strong><u>开源协议</u></strong>：<span id="currentLicense"><u>GNU General Public License version 2 (GPLv2)</u></span> &nbsp;&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 下面是运行截图：</p>
<p>&nbsp;&nbsp;&nbsp; 1.选择操作，因为截图时本机上没有摄像头所以&#8220;拍摄照片&#8221;区域为黑色。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img height="294" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_1_start.gif" width="397" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 2.使用focuzRectangle来选取截图区域，还有使用Zoom IN/OUT来自由缩放底图。</p>
<p><img height="369" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_2_start.gif" width="460" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.显示上传之后的效果。</p>
<p>&nbsp;</p>
<p><img height="451" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_3_start.gif" width="755" border="0" /></p>
<p>&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp; 4.在生成的三张（尺寸从大到小）图上任意点击鼠标右键显示 &#8220;下载或打印&#8221;菜单</p>
<p><img height="305" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_4_start.gif" width="404" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5.XPS文件的显示效果</p>
<p><img height="331" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_5_start.gif" width="808" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 6.高级模式下可以使用特效和Ink功能来让上传的头像或图片更具特色</p>
<p><img height="398" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_6_start.gif" width="498" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7.更多特效</p>
<p>&nbsp;</p>
<p><img height="391" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_7_start.gif" width="494" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 8.指定特效的上传效果。</p>
<p><img height="437" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_8_start.gif" width="829" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 9.使用摄像头</p>
<p><img height="372" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_9_start.gif" width="480" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 10.加特效之后的上传结果。&nbsp;</p>
<p><img height="401" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_10_start.gif" width="809" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 11.拖拽本地图片到编辑区域</p>
<p><img height="610" alt="" src="http://images.cnblogs.com/cnblogs_com/daizhj/webcam_11_start.gif" width="522" border="0" /></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 源码下载:<a href="http://webcam.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38599" target="_blank">http://webcam.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=38599</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：目前该版本为Beta，开放的源码主要是服务端代码，silverlight代码还在开发优化中。所有源码和文档说明会在正式版中进行发布，敬请关注。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 更多信息详见：<a href="http://webcam.codeplex.com/" target="_blank">http://webcam.codeplex.com/</a></p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原文链接:<a href="http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html" target="_blank">http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;作者: daizhj, 代震军<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; Tags: silverlight,webcam<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网址: http://daizhj.cnblogs.com/&nbsp;&nbsp; <br /></p><img src="http://www.cnblogs.com/daizhj/aggbug/1645414.html?type=1" width="1" height="1" alt=""/><p>评论: 12　<a href="http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2010/01/13/silverlight4_webcam_app.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IT餐馆—第二十六回 加薪</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/19/1605913.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Thu, 19 Nov 2009 03:08:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/19/1605913.html</guid><description><![CDATA[<p>阅读: 1016 评论: 2 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-19 11:08 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/19/1605913.html" target="_blank">原文链接</a></p><p><span style="font-family: 宋体">&nbsp;&nbsp; &nbsp;&nbsp;今天上班一开</span>MSN<span style="font-family: 宋体">，发现郑伟的签名变成了&#8216;爽&#8217;很是好奇。一问之后才知道最近郑伟升职并加薪了，并且加了</span>20%<span style="font-family: 宋体">，相当于平时跳槽一次的加薪幅度了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰开玩笑似的回复说：&#8220;希望你以后就用这个名字吧，将来百年之后不在了，到时就叫&#8216;爽死了&#8217;&#8221;。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8220;大爷的，你又用郭德纲的段子来挖苦我，呵呵。&#8221;郑伟回复：&#8220;今天下班我请客，就在王老板餐馆那儿，目前老杜会来，老刘家里有家可能不会来了。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8220;我一定去，呵呵，不吃白不吃！&#8221;雨辰回复说。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>&#8220;那就下班后见吧：）&#8221;郑伟回复</span>......</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>因为下班有点事，一直等忙完了才从公司里出来。等到了的时候，郑伟已点了几个凉菜，看着雨辰走过来，忙起身招呼。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰也不客气，找个空座座了下来。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>郑伟倒了杯啤酒，送到雨辰面前，说：&#8220;老杜还没来，呵呵，咱们先干一个。&#8221;</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰笑着说：&#8220;祝老兄日后不断升官发财，呵呵。&#8221;</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>正在此时门咣当一声，一个熟悉的人影走进来：&#8220;你们二位先焖上了。也不等等我，呵呵。&#8221;</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰一看老杜来了，忙把座位往靠窗户位置挪了挪，给老杜腾腾地。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>这下子三个人凑齐了。接着大家又点了几个下饭的热菜，必定上了半天班，年轻人胃口都不小。就这样你一杯我一口的，开始东拉西扯的侃了起来。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰自己倒了一怀，也给其余二人各满了一杯开玩笑着说：&#8220;伟哥，这次你可是领导了，对于我等之类的开发平民，可要多多照顾呀！&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>郑伟自嘲地说：&#8220;别扯淡了，说真格儿的，这次要不是原来的组长跳槽，而自已又在团队里资格最老，还真没有什么机会被提上来。前阵子管理层找我谈话，事先没透露组长要离职的情况，让我聊聊如果自己愿不愿意转向管理方向，同时又进一步旁敲侧击地透露如果自己是当前所在团队的领导会如何管理。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>郑伟从身上摸出来一盒没抽完的烟，给大家分了之后，自己点了一支，抽了一口，说：&#8220;其时上面不知道，组长要离职的事之前就已有风声，他也与我私下聊过，只不过没说的那么开，不过到透露出希望我来接替这个职位，并提示我如果上面来谈话试探要注意一下。&#8221;</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>郑伟叹口气说：&#8220;其实大家在公司是上下级，私下关系都不错，自然用不着说的那么透了。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>雨辰会意的说：&#8220;其实有时候照葫芦画飘与临时发挥都差不多，必定这时只要在惯性思维的模式下正常发挥就差不多了。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>老杜对雨辰说：&#8220;你这家伙倒像老江湖似的，不过伟哥也不傻呀。&#8221;说着自己也把手中的烟给点上了，吐了个烟圈儿。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>郑伟笑说：&#8220;自然自然，大局已定，不过套话还是要说的，只不过&#8216;这里&#8217;冷静点就可以了&#8221;，说着用夹着烟的手指了指自己的脑袋。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>三个人互视一笑，就这样有说有笑，临走时，郑伟让王老板的店员开了张发票，说要回去报销。雨辰不怀好意的坏笑说：&#8220;真是不一样了，看来这回是吃公款了，难怪伟哥会这么痛快大方。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 郑伟会意的说：&#8220;也不全是，呵呵&#8221;，因为不想多做解释也就没了下文了</span>......</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>吃完饭回家路上，雨辰不禁回想起来这些年的职场经历，可以说在跳槽方面目前已不那么感冒了，从以前的半年</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">一年一次，到现在的三年还在同一家公司。基本上每次跳槽，薪水都会涨个</span>20-30%<span style="font-family: 宋体">，虽不太多也不过少，适可而止罢了。而让人感叹的是郑伟老杜这几个不错的哥们变得越来越有城府了。不过从局外人看来，雨辰何尝不是把自己的真实想法越藏越深了，回想起来以前在大学什么有啥聊啥无所不谈，而现在却又有所顾及，还真是不自在而且很无奈。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>而就目前自己所想到的&#8216;产生加薪的动机&#8217;也可以分为内因和外因，内因比如是缺钱或因为工作努力并有成绩而希望获得加薪。外因比如赌气（自己干的不错而老板却没有表示）或自尊心</span>(<span style="font-family: 宋体">同事加薪自己却没加，所以没面子</span>)<span style="font-family: 宋体">或领导主动要求给下级加薪（可能性较小，必定<span style="color: red">伯乐</span>就很少）等等，另外也有些人提出加薪主要是要获得领导的注意，不希望自己的努力工作被忽略，而加多加少甚至不加倒没太大必要性，这时领导就要多加安抚了。之前雨辰所在公司就有这么位公子哥，家里很有钱，出来工作基本就是为了在外人看来摆出一副有事做的样子，当其工作一段时间后发现领导没注意到他的重要性，就到领导那去嚷嚷加薪，后来领导看出其目的，便说了不少安慰和鼓励的话，最后他就像个孩子似的高兴地走出了领导的办公室，看来这世上真是什么人都有呀。</span> </p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>不过，增加&#8216;加薪可能性&#8217;的前提是要与上级搞好关系，必定要有人为自己美言才能成就美事。而这就需要有机会时与上级多做交流沟通，为把自己的声音传递到上面打通道路。平时也要会在领导面前表现，让其对自己的工作办事能力有信心，尽管做法有欠光明磊落但很有效，不少职场的书中对这部分内容都有丰富的描述，看得多了，总结出来的方法自然也就多了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>想来想去，雨辰自嘲性质的笑了笑，心理不禁对自己说：&#8220;真是够无聊的，自己的事就不少了，还要想这些&#8216;身外事&#8217;。&#8221;</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span></span>很快，公交车就到了小区门口，雨辰下了车就回家了。</span></p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/daizhj/aggbug/1605913.html?type=1" width="1" height="1" alt=""/><p>评论: 2　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/19/1605913.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/19/1605913.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>window server 2003 下安装squid</title><link>http://www.cnblogs.com/daizhj/articles/1605363.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Wed, 18 Nov 2009 06:41:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/articles/1605363.html</guid><description><![CDATA[<p>阅读: 457 评论: 0 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-18 14:41 <a href="http://www.cnblogs.com/daizhj/articles/1605363.html" target="_blank">原文链接</a></p><p>安装系统要求：<br /><strong><u>windows server2003 service pack2</u></strong>&nbsp;&nbsp; 注:不能是r2版，否则squid服务启动会出错 </p><p>&nbsp; </p><p>1．把squid-2.6.STABLE13-bin.zip解压缩，把里面的squid文件夹拷到c:\下(squid默认的是c:\squid)  </p><p>&nbsp; </p><p>2．squid\etc目录下把&nbsp; </p><div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">&nbsp;&nbsp;&nbsp;squid.conf.default拷贝一份重新命名为squid.conf<br />&nbsp;&nbsp;&nbsp;cachemgr.conf.default拷贝一份重新命名为cachemgr.conf<br />&nbsp;&nbsp;&nbsp;mime.conf.default拷贝一份重新命名为mime.conf</span></div><p>&nbsp;</p><p>&nbsp; </p><p>3．用文本编辑器打开squid.conf，需要修改的地方：  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 找到#http_port 3128在后面增加一行  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">http_port 81 transparent&nbsp;&nbsp; #某些机器上80端口已被占用，所以这里用81&nbsp;&nbsp;&nbsp; 完成配置后可使用netstat -a来查看该端口是否启用</font> </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 找到#cache_peer 在后面增加一行  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">cache_peer 10.0.2.137 parent 7001 0 no-query originserver </font> </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 找到# TAG: visible_hostname在后面增加一行  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">visible_hostname volcano(任意命名) </font> </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 找到#tag http_access ，然后在#Default：增加一行&nbsp;&nbsp;&nbsp; </p><p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">http_access allow all&nbsp;&nbsp; # 允许所有用户访问</font> </p><p><font color="#ff0000"></font>&nbsp; </p><p>4．从命令行到c:\squid\sbin目录下执行  </p><p>&nbsp;&nbsp; &nbsp; <font color="#ff0000">squid -i</font>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 注：squid -i -n dnt_squid (命名squid服务的新名称)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; squid -r -n dnt_squid (删除指定名称的服务) </p><p>&nbsp;&nbsp; &nbsp; <font color="#ff0000">squid -z</font>  </p><p>&nbsp; &nbsp; &nbsp; 安装完成  </p><p>&nbsp; </p><p>5．从服务里启动squid&nbsp;&nbsp; 或在cmd下： net start dnt_squid （启动）, net stop dnt_squid （关闭） </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 访问squid服务器:<a target="_blank" href="http://10.0.2.137:81/"></a><a target="_blank" href="http://10.0.2.137:7001/"></a></p><p>&nbsp;&nbsp;&nbsp;&nbsp; http://10.0.2.137:81/ (你的squid服务器IP地址)，这时squid会指向 http://10.0.2.137:7001&nbsp; (web服务器地址:即产品dnt的站点地址)  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 如果把#http_access deny all打开把http_access allow all注释掉，你的访问就会被拒绝  </p><p>&nbsp;&nbsp;&nbsp;&nbsp; 相关链接：<a target="_blank" href="http://blog.csdn.net/changesway/archive/2008/10/22/3124919.aspx">http://blog.csdn.net/changesway/archive/2008/10/22/3124919.aspx</a> </p><p><strong></strong>&nbsp; </p><p><strong>其它squid.conf配置</strong>： </p><p># 主机文件路径 <br /><font color="#ff0000">hosts_file c:/windows/system32/drivers/etc/hosts</font>&nbsp; </p><p>&nbsp;</p><p># 设置日志目录和日志格式 <br /><font color="#ff0000">access_log d:/squid/var/logs/access.log squid <br />cache_log d:/squid/var/logs/cache.log <br />cache_store_log d:/squid/var/logs/store.log emulate_httpd_log on</font>&nbsp; </p><p>&nbsp;</p><p># 缓存管理员 <br /><font color="#ff0000">cache_mgr webmaster@example.com</font></p><p>&nbsp;</p><p># cache目录和大小的设置，1GB硬盘空间和256M内存 <br /><font color="#ff0000">cache_dir ufs d:/squid/var/cache 1024 16 256 cache_mem 256 MB</font></p><p>&nbsp;</p><p># 设置上级根服务器的地址，当然cache_peer还可以设置兄弟节点、上级cache服务器等等，这里这设置了源服务器地址 <br /><font color="#ff0000">cache_peer 电信服务器IP parent 80 0 no-query originserver</font></p><img src="http://www.cnblogs.com/daizhj/aggbug/1605363.html?type=2" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/daizhj/articles/1605363.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/articles/1605363.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>使用Sqlserver事务发布实现数据同步</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Wed, 18 Nov 2009 04:58:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html</guid><description><![CDATA[<p>阅读: 719 评论: 5 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-18 12:58 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 事务的功能在sqlserver中由来已久，因为最近在做一个数据同步方案，所以有机会再次研究一下它以及快照等，发现还是有很多不错的功能和改进的。这里以sqlserver2008的事务发布功能为例，对发布订阅的方式简要介绍一下操作流程，一方面做个总结备份，一方面与大家进行一下分享和交流。费话就不多说了，进入一下今天的正题：）</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这里要说明一下环境：首先我在本地局域网内有两台安装有sqlserver2008的机器（注意：已发布的快照版本无法向老版本数据库兼容，意味着2008下创建的事务或快照发布，无法被sqlserver2005订阅）。当然这两台机器要放在同一个网段，一方面出现性能和安全性考虑，另一方面是我目前还没有找到跨不同网段的快照应用方案（可行性的那种）。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 好了，这里我以我们产品数据库为准来介绍一下如何通过发布订阅的方式来进行数据同步。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 首先，在要发布的数据库上创建一个我们的产品数据库（这里叫做dnt_new）,然后在该数据库实例的左侧导航的&#8220;复制&#8221;--&#8220;本地发布&#8221;上击右键，然后选择&#8220;新建发布&#8221;，如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_1_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_1" border="0" alt="sqlserver_snap_1" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_1_thumb.gif" width="346" height="498" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，系统就会启动&#8216;发布向导&#8217;来引导大家，这里我们在欢迎界面下点击"下一步&#8221;，然后在当前窗口中选择要发布的数据库，如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_2_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_2" border="0" alt="sqlserver_snap_2" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_2_thumb.gif" width="637" height="480" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击下一步，然后在接下来的窗口中选择&#8220;事务发布&#8221;，如下图：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_3_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_3" border="0" alt="sqlserver_snap_3" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_3_thumb.gif" width="636" height="490" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后点击下一步，选择要同步的数据对象（数据表，存储过程，自定义函数等），如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_4_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_4" border="0" alt="sqlserver_snap_4" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_4_thumb.gif" width="636" height="491" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后就是&#8220;项目问题窗口&#8221;，因为之前已用dbo身份登陆，所以这里只要点击下一步即可，如下图：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_5_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_5" border="0" alt="sqlserver_snap_5" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_5_thumb.gif" width="628" height="468" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这里可以通过&#8220;添加&#8221;方式来过滤要同步的数据信息，因为要做全表数据同步，所以这里就不做设置了，感兴趣的朋友可以自己研究一下，这里接着点击下一步，如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_6_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_6" border="0" alt="sqlserver_snap_6" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_6_thumb.gif" width="630" height="454" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后在&#8216;代理安全性&#8217;窗口中，点击&#8220;安全设置&#8221;按钮：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_7_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_7" border="0" alt="sqlserver_snap_7" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_7_thumb.gif" width="636" height="479" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在弹出的&#8216;安全设置&#8217;子窗口中设置如下信息，并点击&#8216;确定&#8217;按钮：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_8_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_8" border="0" alt="sqlserver_snap_8" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_8_thumb.gif" width="708" height="524" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然后点击下一步按钮： </p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_9_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_9" border="0" alt="sqlserver_snap_9" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_9_thumb.gif" width="631" height="459" /></a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择&#8220;创建发布&#8221;复选框，然后点击下一步，这时向导会让您输入&#8220;发布名称&#8221;，这里命名为&#8220;dnt_new_snap&#8221;：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_10_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_10" border="0" alt="sqlserver_snap_10" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_10_thumb.gif" width="640" height="493" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击&#8220;完成按钮&#8221;，这里系统就开始根据之前收集的信息来创建该发布对象信息了，如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_11_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_11" border="0" alt="sqlserver_snap_11" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_11_thumb.gif" width="641" height="506" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 到这里，&#8216;创建发布&#8217;的工作就完成了。下面介绍一下创建订阅的流程。在另一个机器的sqlserver实例上，打开该实例并使用&#8220;复制&#8221;&#8212;&#8220;新建订阅&#8221;，如下图：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_12_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_12" border="0" alt="sqlserver_snap_12" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_12_thumb.gif" width="359" height="442" /></a>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这时系统就会启动&#8220;新建订阅&#8221;向导，点击下一步，并在&#8220;发布&#8221;窗口中的&#8220;发布服务器&#8221;下拉框中选择&#8220;查打发布sqlserver服务器&#8221;项，如下：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_13_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_13" border="0" alt="sqlserver_snap_13" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_13_thumb.gif" width="644" height="463" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 然后在弹出窗口中选择之前&#8216;创建发布时所使用的数据库实例&#8217;并进行验进登陆，这时，发布服务器的信息就会出现在下方的列表框中：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_14_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_14" border="0" alt="sqlserver_snap_14" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_14_thumb.gif" width="634" height="460" /></a>&nbsp; </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 选择之前我们创建的那个发布对象&#8220;dnt_new_snap&#8221;,接着点击下一步:</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_15_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_15" border="0" alt="sqlserver_snap_15" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_15_thumb.gif" width="632" height="455" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在分发代理位置窗口中，选择&#8220;在分布服务器上运行所有代理&#8221;，然后点击下一步，然后在&#8220;订阅服务器&#8221;窗口中的订阅数据库列表框中选择一下要同步的订阅数据库名称（可新建）：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_16_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_16" border="0" alt="sqlserver_snap_16" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_16_thumb.gif" width="630" height="463" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击下一步，然后在&#8216;分发代理安全性&#8217;窗口中，点击列表框中的&#8216;&#8230;&#8217;来设置安装性，并做如下设置（注意红框部分）：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_18_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_18" border="0" alt="sqlserver_snap_18" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_18_thumb.gif" width="668" height="743" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 然后点击&#8220;确定&#8221;按钮，之后在向导上点击&#8220;下一步&#8221;按钮，这时系统就会显示&#8220;代理计划执行方式&#8221;窗口，选择&#8220;连续运行&#8221;：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_19_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_19" border="0" alt="sqlserver_snap_19" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_19_thumb.gif" width="625" height="486" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 点击下一步，在窗口中选择&#8220;立即执行&#8221;：</p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_20_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="sqlserver_snap_20" border="0" alt="sqlserver_snap_20" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/Sqlserver_A1FC/sqlserver_snap_20_thumb.gif" width="631" height="477" /></a> </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 完成了这一步，点击下一步按钮，然后就可以创建该订阅对象了，如果一切运行正常，sqlserver就会从&#8216;发布服务器&#8217;那边，将之前指定的数据表和存储过程等同步到当前的&#8216;订阅数据库&#8217;中了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这时我们可以在源数据库（发布服务器）上的表中添加或修改指定表数据信息，在等待1-3秒之后，所做的添加和修改就会同步到&#8216;订阅数据库&#8217;上的相应表中。看来目的是达到了，呵呵。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 好了，今天的内容就到这里了。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<span style="color: red"><strong> 注：</strong></span><span style="color: red">本文中的两台机器必定是可以使用sqlserver客户端互联</span>（在sqlserver studio中设置'允许远程链接'，同时要设置相应的ip地址，以及在配置管理器中开启tcp/ip协议即可）</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原文链接:&nbsp;<a href="http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html" target="_blank">http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者: daizhj, 代震军 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tags:&nbsp;sqlserver,发布订阅,事务,快照&nbsp; 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网址: <a href="http://daizhj.cnblogs.com/" target="_blank"><font color="#78afd3">http://daizhj.cnblogs.com/</font></a> </p>
<p>&nbsp;</p><img src="http://www.cnblogs.com/daizhj/aggbug/1605293.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/18/1605293.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>在Discuz!NT中进行缓存分层(本地缓存+memcached)</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Tue, 17 Nov 2009 03:41:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html</guid><description><![CDATA[<p>阅读: 2902 评论: 26 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-17 11:41 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html" target="_blank">原文链接</a></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在以前的两篇文章(<a href="http://www.cnblogs.com/daizhj/archive/2007/08/15/855163.html" target="_blank">Discuz!NT 缓存设计简析</a>, <a href="http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html" target="_blank">Discuz!NT中集成Memcached分布式缓存</a>)中，介绍了Discuz!NT中的缓存设计思路以及如何引入Memcached，当然前者是IIS进程的缓存（本地缓存），后者是分布式内存对象缓存系统。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 两者通过Discuz!NT中的memcached.config文件中的<font color="#ff0000"><strong>ApplyMemCached</strong></font>结点的值来决定使用哪一种缓存方式。不过在之后，有朋友反映当使用Memcached时，特别是在大并发来时，效率会打折扣，甚至有很多时间会消耗在socket套接字（创建和传输方面）上。而事实上也的确如此，尽管Memcached在使用池化的方式初始化一定数量的套接字资源（之前测试时实始化为128个链接），在小并发（100左右）时，可能问题不大，但并发上了1000-2000时，其效率要比本地化缓存机制低1/3（loadrunner测试场景），比如loadrunner测试1000并发时，如果showtopic(显示主题)，本地缓存处理时间为15秒，而使用memcached可能会达到25-35秒。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 显然这是用户所不能忍受的，所以要想解决方案。也就有了今天的文章。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 其实要解决这个问题的原理很简单，就是将之前的两种缓存方案（本地缓存和memcached）进行整合，原理如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先在iis进程中会将要缓存的数据缓存一份，同时也将该数据放入memcached一份，当然本地缓存的数据生命周期要比memcached少。这就造成本地缓存数据到期后，当再次访问其则将memcached中的数据加载到本地缓存中并返回给应用程序。当缓存的数据更新时，则要更新memcached中的数据和本地缓存的数据（当然如果你要将应用程序布署的到多个站点时，因为不同的站点运行在不同的web园或主机上，这时你就不可以用最简单的方式来更新其它进程和主机上的应用程序了，因为当前缓存的数据只保存在当前web园进程中），这也就是为什么要给本地缓存数据设置到期时间这个值，让其在到期后来自动从memcached获取数据。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 原理解释完了之后，我们来看看如何实现这个方案.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 首先，我们要看一下默认的本地缓存策略文件，其功能也就是两年前所说的那个本地缓存策略功能，如下：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;默认缓存管理类<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;&nbsp;DefaultCacheStrategy&nbsp;:&nbsp;ICacheStrategy<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">readonly</span><span style="color: #000000">&nbsp;DefaultCacheStrategy&nbsp;instance&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DefaultCacheStrategy();&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">volatile</span><span style="color: #000000">&nbsp;System.Web.Caching.Cache&nbsp;webCache&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;System.Web.HttpRuntime.Cache;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;默认缓存存活期为3600秒(1小时)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">protected</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;_timeOut&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;syncObj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">();&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;构造函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;DefaultCacheStrategy()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;设置到期相对时间[单位:&nbsp;秒]&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TimeOut<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">set</span><span style="color: #000000">&nbsp;{&nbsp;_timeOut&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;value&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;value&nbsp;:&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;_timeOut&nbsp;</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">?</span><span style="color: #000000">&nbsp;_timeOut&nbsp;:&nbsp;</span><span style="color: #800080">3600</span><span style="color: #000000">;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;System.Web.Caching.Cache&nbsp;GetWebCacheObj<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;{&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;webCache;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;加入当前对象到缓存中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的键值</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;</span><span style="color: #008000">缓存的对象</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;o&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemRemovedCallback&nbsp;callBack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheItemRemovedCallback(onRemove);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(TimeOut&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">7200</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Insert(objId,&nbsp;o,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;DateTime.MaxValue,&nbsp;TimeSpan.Zero,&nbsp;System.Web.Caching.CacheItemPriority.High,&nbsp;callBack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">else</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Insert(objId,&nbsp;o,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;DateTime.Now.AddSeconds(TimeOut),&nbsp;System.Web.Caching.Cache.NoSlidingExpiration,&nbsp;System.Web.Caching.CacheItemPriority.High,&nbsp;callBack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;加入当前对象到缓存中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的键值</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;</span><span style="color: #008000">缓存的对象</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObjectWith(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;o&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemRemovedCallback&nbsp;callBack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheItemRemovedCallback(onRemove);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Insert(objId,&nbsp;o,&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;System.DateTime.Now.AddSeconds(TimeOut),&nbsp;System.Web.Caching.Cache.NoSlidingExpiration,&nbsp;System.Web.Caching.CacheItemPriority.High,&nbsp;callBack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;加入当前对象到缓存中,并对相关文件建立依赖<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的键值</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;</span><span style="color: #008000">缓存的对象</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="files"&gt;</span><span style="color: #008000">监视的路径文件</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObjectWithFileChange(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;files)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;o&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemRemovedCallback&nbsp;callBack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheItemRemovedCallback(onRemove);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheDependency&nbsp;dep&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheDependency(files,&nbsp;DateTime.Now);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Insert(objId,&nbsp;o,&nbsp;dep,&nbsp;System.DateTime.Now.AddSeconds(TimeOut),&nbsp;System.Web.Caching.Cache.NoSlidingExpiration,&nbsp;System.Web.Caching.CacheItemPriority.High,&nbsp;callBack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;加入当前对象到缓存中,并使用依赖键<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的键值</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;</span><span style="color: #008000">缓存的对象</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="dependKey"&gt;</span><span style="color: #008000">依赖关联的键值</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObjectWithDepend(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;dependKey)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;o&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheItemRemovedCallback&nbsp;callBack&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheItemRemovedCallback(onRemove);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CacheDependency&nbsp;dep&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;CacheDependency(</span><span style="color: #0000ff">null</span><span style="color: #000000">,&nbsp;dependKey,&nbsp;DateTime.Now);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Insert(objId,&nbsp;o,&nbsp;dep,&nbsp;System.DateTime.Now.AddSeconds(TimeOut),&nbsp;System.Web.Caching.Cache.NoSlidingExpiration,&nbsp;System.Web.Caching.CacheItemPriority.High,&nbsp;callBack);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;建立回调委托的一个实例<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="key"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="val"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="reason"&gt;&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;onRemove(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;key,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;val,&nbsp;CacheItemRemovedReason&nbsp;reason)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(reason)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;CacheItemRemovedReason.DependencyChanged:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;CacheItemRemovedReason.Expired:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">CacheItemRemovedCallback&nbsp;callBack&nbsp;=&nbsp;new&nbsp;CacheItemRemovedCallback(this.onRemove);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">webCache.Insert(key,&nbsp;val,&nbsp;null,&nbsp;System.DateTime.Now.AddMinutes(TimeOut),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Caching.Cache.NoSlidingExpiration,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;System.Web.Caching.CacheItemPriority.High,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;&nbsp;&nbsp;&nbsp;callBack);</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;CacheItemRemovedReason.Removed:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;CacheItemRemovedReason.Underused:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">default</span><span style="color: #000000">:&nbsp;</span><span style="color: #0000ff">break</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;删除缓存对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的关键字</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RemoveObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;webCache.Remove(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;返回一个指定的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;</span><span style="color: #008000">对象的关键字</span><span style="color: #808080">&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;</span><span style="color: #008000">对象</span><span style="color: #808080">&lt;/returns&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">virtual</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;RetrieveObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(objId&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">||</span><span style="color: #000000">&nbsp;objId.Length&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;webCache.Get(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />}</span></div>
<p>&nbsp; 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 因为在一开始设计Discuz!NT缓存方案时，就使用了Strategy（策略）模式，所以这里我们只要将上面所说的改动方案以继承的方式继承自上面的 
<p>DefaultCacheStrategy 之后，就可以在DNTCache中使用它了。因为<a title="Discuz!NT中集成Memcached分布式缓存" href="http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html" target="_blank">之前</a>我已经将memcached引入到了discuznt产品中，所以这里只要改动一下已有的那个MemCachedStrategy，使其支持上面所说的缓存分布方案即可，请看下面的代码：</p>
<p>&nbsp;&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;企业级MemCache缓存策略类,只能使用一个web园程序<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MemCachedStrategy&nbsp;:&nbsp;DefaultCacheStrategy<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;添加指定ID的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">先向本地cached加入，然后再加到memcached</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RemoveObject(objId);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.AddObject(objId,&nbsp;o);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemCachedManager.CacheClient.Set(objId,&nbsp;o);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;添加指定ID的对象(关联指定文件组)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="files"&gt;&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObjectWithFileChange(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;files)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;添加指定ID的对象(关联指定键值组)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="o"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="dependKey"&gt;&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;AddObjectWithDepend(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId,&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;o,&nbsp;</span><span style="color: #0000ff">string</span><span style="color: #000000">[]&nbsp;dependKey)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;移除指定ID的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;&lt;/param&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;RemoveObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">先移除本地cached，然后再移除memcached中的相应数据</span><span style="color: #008000"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">base</span><span style="color: #000000">.RetrieveObject(objId)&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.RemoveObject(objId);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(MemCachedManager.CacheClient.KeyExists(objId))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemCachedManager.CacheClient.Delete(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;返回指定ID的对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;param&nbsp;name="objId"&gt;&lt;/param&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;returns&gt;&lt;/returns&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;RetrieveObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.RetrieveObject(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(obj&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MemCachedManager.CacheClient.Get(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(obj&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.AddObject(objId,&nbsp;obj);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;到期时间<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span><span style="color: #808080"><br /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;TimeOut&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">get</span><span style="color: #000000">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;MemCachedConfigs.GetConfig().LocalCacheTime;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;}</span></div>
<p>&nbsp;&nbsp;&nbsp; 
<p>&nbsp;&nbsp; &nbsp;&nbsp; 注：MemCachedStrategy 原来已实现了ICacheStrategy接口，参见<a href="http://www.cnblogs.com/daizhj/archive/2009/03/23/1386652.html" target="_blank">这篇文章</a>。 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样，我们还是可以通过memcached.config中的ApplyMemCached来判断是否使用本地缓存方案还是当前的缓存分层方案。当然原有的memcache.config中还有添加一下属性用于记录当使用缓存分层方案之后的本地缓存的缓存数据时间，以向上面的类属性TimeOut注入相应参数信息。 
<p>这样memcached.config的内容就会变成这个样子（本地测试配置）： 
<p>&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">&lt;?</span><span style="color: #ff00ff">xml&nbsp;version="1.0"</span><span style="color: #0000ff">?&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">MemCachedConfigInfo&nbsp;</span><span style="color: #ff0000">xmlns:xsi</span><span style="color: #0000ff">="http://www.w3.org/2001/XMLSchema-instance%22&nbsp;xmlns:xsd="</span><span style="color: #ff0000">http://www.w3.org/2001/XMLSchema%22</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ApplyMemCached</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ApplyMemCached</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">ServerList</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">10.0.2.137:11211</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">ServerList</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">PoolName</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">DiscuzNT_MemCache</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">PoolName</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">IntConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">128</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">IntConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">MinConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">128</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">MinConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">MaxConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">512</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">MaxConnections</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">SocketConnectTimeout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">1000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">SocketConnectTimeout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">SocketTimeout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">3000</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">SocketTimeout</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">MaintenanceSleep</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">30</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">MaintenanceSleep</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">FailOver</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">FailOver</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">Nagle</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">true</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">Nagle</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">LocalCacheTime</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">60</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">LocalCacheTime</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">MemCachedConfigInfo</span><span style="color: #0000ff">&gt;</span></div>
<p>&nbsp; 
<p>&nbsp;&nbsp;&nbsp; 这样，当使用Lr测试时，其在并发1000的情况下与使用本地缓存方案的响应时间基本稳定在15秒左右，想一下大家就会明白了，因为在数据首次加载并进行缓存时（本地和memcached都会缓存一份，参见上面的实现代码）。当再次访问时，如在60秒的数据有效期内，仅访问本地缓存，只有在数据过期时间，才会运行再次加载数据的工作，而这种加载也只是从memcached中获得数据，这里我们可以暂时将memcached中的数据想像是永不过期，这样就可以减少对database的访问压力，因为这时相对于本地缓存而言，memcached已经变成了一个&#8216;缓存数据库&#8217;了： 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;RetrieveObject(</span><span style="color: #0000ff">string</span><span style="color: #000000">&nbsp;objId)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.RetrieveObject(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(obj&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;obj&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;MemCachedManager.CacheClient.Get(objId);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(obj&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.AddObject(objId,&nbsp;obj);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></div>
<p>&nbsp; 
<p>&nbsp;&nbsp;&nbsp;&nbsp; 现在用两张图再对比说明之前的memcached与现在的缓存分层方案：</p>
<p>&nbsp; </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/DiscuzNT_11C13/memcached_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="memcached" border="0" alt="memcached" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/DiscuzNT_11C13/memcached_thumb.gif" width="452" height="373" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000"><strong>改进后：</strong></font></p>
<p><a href="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/DiscuzNT_11C13/twotie-memcached_2.gif" target="_blank"><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="twotie-memcached" border="0" alt="twotie-memcached" src="http://images.cnblogs.com/cnblogs_com/daizhj/WindowsLiveWriter/DiscuzNT_11C13/twotie-memcached_thumb.gif" width="481" height="387" /></a> </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 总结：其实在大网站的数据缓存方案中，往往会将大量的数据（不经常变化或对时效性要求不强，但却需频繁访问的数据）放入到缓存中，以此来降低数据库的负载。本地缓存数据的时效性和稳定性受制于IIS进程中线程的运行情况，资源的占用等因素影响，可以说数据的稳定性（不易丢失）远不如memcached，所以这种分层方案可以有效的解决这个问题，当然这种做法还有一些其它方面的好处，就不一一说明了。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原文链接: <a href="http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html" target="_blank">http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html</a></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 作者: daizhj, 代震军 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tags: discuz!nt,memcached,分层 
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 网址: <a href="http://daizhj.cnblogs.com/" target="_blank"><font color="#78afd3">http://daizhj.cnblogs.com/</font></a> </p>
<p>&nbsp;</p> <img src="http://www.cnblogs.com/daizhj/aggbug/1604436.html?type=1" width="1" height="1" alt=""/><p>评论: 26　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/17/1604436.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IT餐馆—第二十五回 结对</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/16/1602582.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Mon, 16 Nov 2009 01:03:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/16/1602582.html</guid><description><![CDATA[<p>阅读: 577 评论: 8 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-16 09:03 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/16/1602582.html" target="_blank">原文链接</a></p><p><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; 周五开会时，有人提出在团队中采用结对开发的</span><span style="color: black">Agile</span><span style="font-family: 宋体; color: black">实践。</span>&nbsp;</p>
<p><span style="font-family: 宋体; color: black"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>当然团队里有人说，如果让新手与</span><span style="font-family: 宋体">水平高的人结对，基本上就是知识的单向传递了，对于新手来说的确是个不错的学习机会，但对于水平高的开发者，就未必不乐意了。不过雨辰心里想，这样还有一方受益，就是公司，因为公司巴不得每个新人都能在最短的时间内变成&#8216;高手&#8217;，这样就可以用比高手低的多的工资来获取高质量的代码。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>会后，雨辰在</span>MSN<span style="font-family: 宋体">上遇到了老杜，说了这样开会的事，并把自己的想法告之了老杜。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜在</span>MSN<span style="font-family: 宋体">上发了个笑脸，回复：&#8220;结对无外乎如下几种情况&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰说：&#8220;洗耳恭听：）&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜回复：&#8220;情况</span>1<span style="font-family: 宋体">就是你之前说的那种老手带新手的情况，</span> <span style="font-family: 宋体">对于那些愿意将自己所学所知分享给别人的高手，是不太在乎自己的知识被学去的，必定干这一行，不管新人老人都要不断学习充电，老人虽然把知识传授了出去，但也在不断学习新的知识。所以就应该让知识像血液一样不断循环。同时老人还可以通过结对，梳理并巩固自己的知识基础，同时锻炼表达能力。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰回复：&#8220;这一点我倒是满赞同的，的确与水平低的结对，成为了一种灌输。虽然感觉没有了那种思想激荡的刺激，但可以借此来条理一下自己的思维，锻炼一下表达能力。稍待脚给公司培训一下人才。不过这个要建立在老手和新手沟通的情况，如果新手是个满不在乎或头脑犯晕的&#8216;绝缘体&#8217;，那就郁闷了。有时对于高手来说，与水平低的人结对，与其说是合作，还不如就是一种干扰，因为开发是一个脑力高度集中的工作，当开发者全力解决问题时，即使是一个电话或一些旁边同事的笑声都会打断自己的思维，等接完电话或周围同事安静下来时，灵光一闪的</span>IDEA<span style="font-family: 宋体">可能早已不知去向了，当然这种情况一般发生的概率不是很高，但一旦与水平低又总爱唠叨的人结对之后，其发生的概率会大大增加，特别是你正在思考解决方案时，他连珠炮似的问题或突发奇想，会让你正高速运转着的大脑&#8216;短路&#8217;，等你与他解释完之后，要找到刚被打断的思路很是费神。</span> <span style="font-family: 宋体">有时真想直接对他说&#8216;你先闭嘴，你的话对我的思路是一种干扰。一会我让你问时，你再问&#8217;。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜又发了个笑脸，接着回复：&#8220;看来你也被这样的人搞过了，不过除了上面的高手与新手结对，还有水平相当的开发者结对，可能是一个不错的选择，而且两个人的沟通可能进一步加深对业务和设计的理解。不过也有一些意外情况，就是如果两个或其中一个人刚愎自用，听不进去对方的话，那就热闹了，吵来吵去，吵个大西瓜呀。最后还要上面发话来拍板！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜接着回复：&#8220;另外还有就是太熟悉的人结对，这种情况有时是好事也是坏事。好事是沟通起来比较方便，必定大家都熟悉，有时几个字就可以把要表达的说明，必定大家知根知底，谁会什么都心知肚名。但问题可能也就出在了这里，结对开发可以避免让个体思想走私儿，或做与工作无关的事情时会有所顾及。但两个人过于熟悉时，这种结对的好处就要降低了。我之前就看过两个结对的开发者表面上结对，却在加班时结对上网去看好玩的新闻和大片，呵呵。到那时就成了&#8216;</span>av<span style="font-family: 宋体">集体研讨会&#8217;了。不过这就带出了另一种情况，就是加班时适不适合搞&#8216;结对&#8217;。我个人认为加班只有在需要的时候才加班，绝不能为了加班而加班，否则即便是通过结对，也只是让两个人一起看与工作无关的话题，除了浪费公司的电和机器就真没什么了。所以这时我一段是给他们的工作添加了工作进程中，限定他们加班时要解决的问题，基本上与正常上班时没什么区别！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰回复：&#8220;如果两个人不熟悉的话，结对是什么样子呢！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜接着回复：&#8220;那就根不熟悉的大龄男女谈恋爱一样，相敬如宾。其实这时公司就成了一个婚姻介绍所一样，让不熟悉的员工通过结对变的熟悉。结对的双方通过开发互相了解，双方的工作效率就会从低到高，成为好友（就像夫妻那样），呵呵。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰回复：&#8220;你都想到婚姻这回事了，也够俗的了，呵呵。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜接着回复：&#8220;也这也叫俗，呵呵。好吧，就算俗吧，不过郭德纲说的好&#8216;人不三俗枉少年&#8217;！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>一向不怎么听郭德纲的段子的人忽然冒出了这一句，让雨辰哈哈一笑，心领神会的回复了个笑脸，开玩笑回复说：&#8220;你这还少年吧，都快年纪一大把了吧，呵呵&#8221;。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜话风一转，回复：&#8220;其时有时候水平低的两人结对开发，比水平高的讨论还热闹。因为他们涉世未深，更容易自以为是。稍有积累就对自己的想法和经验深信不疑，不过这时倒不用经理出面，只要找个老手应该就能摆平。所以有时还要找一个水平更高的开发者在关键时候加入流程。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰看之后，倒是部分赞同老杜的观点，只不过雨辰倒是看过两个水平高的开发者讨论时不欢而散的，不过雨辰又回复：&#8220;两个结对，至少要有人懂业务。否则当业务复杂时，很容易走火入魔。所以结对多数应该是&#8216;新老配&#8217;，让熟悉技术和业务的老手指点新手一同工作。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜在那头发了个笑脸表情，回复：&#8220;最好的情况就是当两个人水平高又理解行业业务的话，其效率会最高，也越不易出错。不过基本上我这边还真没出现过这种情况，有时水平高的开发者更容易被现有的知识框架体系所左右。所以无论什么样的人结对，都要有</span>open<span style="font-family: 宋体">的观念，善于消化吸收别人的观点。我关注结对是看重结对时两人的讨论过程，其讨论甚至争论无非就是对业务深入理解的过程。同时对显示器里一行一行的代码加深理解</span><span style="font-family: 宋体">、调</span><span style="font-family: 宋体">优，提升可读性</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">可扩展性</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">健壮性的过程。另外就是这也是确保了</span>CodeReview<span style="font-family: 宋体">的质量。必定这是两个人共同审核的结果！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>雨辰笑着回复：&#8220;其实咱们说来说去，结对应该是个对大家都有好处的，开发者之前互相熟悉学习，对于公司来言，也避免了重要的知识只放在一个人的头脑子，如同鸡蛋放入一个蓝子中一样。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>老杜会意的回复：&#8220;必定这年月除了钱之外，信得过的东西越来越少了。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>因为是肺腑之言，雨辰倒也不便多说了，无奈地回复：&#8220;你看你说的这叫什么话，哎&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp; </span>由于工作比较忙，没多聊几句之后就此下线了</span>......</p>  <img src="http://www.cnblogs.com/daizhj/aggbug/1602582.html?type=1" width="1" height="1" alt=""/><p>评论: 8　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/16/1602582.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/16/1602582.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IT餐馆—第二十四回 明智</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/13/1602555.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Fri, 13 Nov 2009 07:47:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/13/1602555.html</guid><description><![CDATA[<p>阅读: 396 评论: 1 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-13 15:47 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/13/1602555.html" target="_blank">原文链接</a></p><p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; 自从上回老杜把</span>TDD,DDD<span style="font-family: 宋体">在中国的处境看成是&#8216;水土不服&#8217;之后，雨辰就一直想找个机会再跟老杜&#8216;<a title="驱动" href="http://www.cnblogs.com/daizhj/archive/2009/08/24/1541405.html" target="_blank">理论</a>&#8217;一下。后来在整理以前资料的时候找到了</span>Ivar Jackbson(UML<span style="font-family: 宋体">三友，用例的发明人</span>)<span style="font-family: 宋体">在</span>2008<span style="font-family: 宋体">中国之行时做的一次演讲时用的</span><a href="http://download.csdn.net/source/613191" target="_blank">PPT</a><span style="font-family: 宋体">，其中提出了一种称之为&#8216;明智软件开发&#8217;的软件开发思路。雨辰当时看这个大约</span>4M<span style="font-family: 宋体">的</span>ppt<span style="font-family: 宋体">时的第一印象就是</span>Ivar<span style="font-family: 宋体">破天荒的提出将</span>UP<span style="font-family: 宋体">与敏捷有机结合到一起，并最终用于软件开发的过程中。让这两个阵营中的优秀思想相互补充，各自发挥所长，听起来倒是一种不错的想法。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>当然</span>IVAR<span style="font-family: 宋体">也对</span>AGILE<span style="font-family: 宋体">阵营中对&#8220;架构&#8221;的偏激思想进行了反击，正如后来孟岩所总结的那样：</span></p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>&nbsp;<span style="font-family: 宋体"><a href="http://blog.csdn.net/myan/archive/2008/09/08/2898542.aspx" target="_blank"><span style="font-family: 宋体">明智软件开发&#8212;&#8212;</span>Ivar Jacobson<span style="font-family: 宋体">博士上海英雄会演讲的主要思想</span></a></span><span style="font-family: 宋体">。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>Agile<span style="font-family: 宋体">认为，应尽快产生可执行代码，架构可以随后重构出来，而他（</span>Ivar<span style="font-family: 宋体">）认为，</span>skinny system<span style="font-family: 宋体">就是架构</span>(<span style="font-family: 宋体">软件一开始的核心架构</span>)<span style="font-family: 宋体">，开发</span>skinny system<span style="font-family: 宋体">的过程也就是确定架构的过程。而架构是一个系统中最重要的部分，对质量要求不折不扣的部分，因此必须精心设计，丝毫马虎不得，<span style="color: red">也别指望事后能够通过重构产生好的架构</span>（这时雨辰所一直信奉的）。另外一方面，也不要执迷于那些通用的庞大的企业级架构。正如</span>skinny system<span style="font-family: 宋体">暗示的，好的架构都是小而简单的。</span>Ivar<span style="font-family: 宋体">认为，软件各部分对于质量的要求是不一样的，与架构无关的部分，适当降低质量要求以求得开发效率的提升可以的，事后也完全可以通过重构等手段改善之。然而架构却是必须从一开始就认真对待的，</span>Ivar<span style="font-family: 宋体">甚至说，</span><strong><span style="font-family: 'Calibri','sans-serif'; color: red">&#8220;</span></strong><strong><span style="font-family: 宋体; color: red">唯一重要的质量就是架构的质量</span></strong><strong><span style="font-family: 'Calibri','sans-serif'; color: red">&#8221;</span></strong><span style="font-family: 宋体">。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>看了上面孟岩</span>BLOG<span style="font-family: 宋体">中一段文字，雨辰又联想起</span>2006<span style="font-family: 宋体">年</span>9<span style="font-family: 宋体">月《程序员》杂志中，</span>IVAR<span style="font-family: 宋体">发表过一篇名为《让统一过程也敏捷》的文章。在该文中作者提出了一个叫</span>EssUP &#8221;<span style="font-family: 宋体">核心统一</span>&#8221;<span style="font-family: 宋体">过程的方法，其可以看成是</span>UP,XP,CMMI<span style="font-family: 宋体">的&#8216;三合一&#8217;，如下图：</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <img border="0" alt="" src="http://daizhj.cnblogs.com/images/cnblogs_com/daizhj/image001.gif" width="330" height="180" />&nbsp;&nbsp;&nbsp;&nbsp; </span></span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp; </span>而现在看来，该文章所阐述的内容其实就是在为</span>IVAR<span style="font-family: 宋体">后来提出的&#8220;</span>SMART<span style="font-family: 宋体">&#8221;开发做&#8216;铺垫&#8217;。当然&#8220;</span>SMART<span style="font-family: 宋体">&#8221;本身绝不是对</span>Agile<span style="font-family: 宋体">进行&#8216;招安&#8217;，而是对</span>RUP&amp;UP<span style="font-family: 宋体">的一种有益补充，必定</span>RUP<span style="font-family: 宋体">太重了。从这一点看，</span>IVAR<span style="font-family: 宋体">要比</span>AGILE<span style="font-family: 宋体">阵营的态度要温和，更有&#8216;大家&#8217;之气，也更老辣。</span>&nbsp;</p>
<p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>EssUP<span style="font-family: 宋体">方法认为传统的软件过程，<span style="color: red">比如统一过程（</span></span><span style="color: red">UP</span><span style="font-family: 宋体; color: red">），是通过对她所定义的不同角色所进行的活动和生产的制件进行描述的。这些活动和制件可能服务于不同目的，例如基于用例的需求，测试驱动的设计、架构的构建、基于组件的开发（这些都是过程）。换句话说，他们在处理不同的实践。这些实践不是外在的、也不是可见的，甚至没有一个名字。这样的过程中所包含的许多实践可以被形象地比喻为&#8220;一锅汤</span><span style="font-family: 宋体">&#8221;。即过程是您选择的一组实践的组合。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>上面的原文意思（按雨辰自己的理解）就是将要开发的软件根据功能分割成</span>N<span style="font-family: 宋体">个&#8216;过程&#8217;中，每个过程比如用例需求分析或基础架构等都是由一些实践组合而成，而那些实践包括敏捷实践，架构实践等，但必需是经过验证且简单有效的，并且这些实践可以被组合成为所&#8216;需要&#8217;的实践。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>除了将过程细化，</span>Ivar<span style="font-family: 宋体">同时该方法还引入了卡片机制来使用&#8216;过程&#8217;变得敏捷，而卡片与</span>agile<span style="font-family: 宋体">中的</span><span style="font-family: 'Arial','sans-serif'; color: black; font-size: 10pt">story card</span><span style="font-family: 宋体; color: black; font-size: 10pt">基本无异，当然引入卡片本身也没什么可奇怪的，必定&#8216;卡片&#8217;与&#8216;用例&#8217;差不多，而</span><span style="font-family: 'Arial','sans-serif'; color: black; font-size: 10pt">IVAR</span><span style="font-family: 宋体; color: black; font-size: 10pt">又是用例的发明人，所以理所当然了。</span>&nbsp;</p>
<p><span style="color: red"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>EssUP</span><span style="font-family: 宋体; color: red">将每一个实践通过一系列的过程卡片进行呈现，这些卡片包含了定义你自己的过</span><span style="font-family: 宋体; color: red">程所需要的各项元素，</span> <span style="font-family: 宋体; color: red">包括关键能力，</span> <span style="font-family: 宋体; color: red">活动和制件。这些卡片可以用来为您的项目建立一副牌，通过卡片组合来为项目成员规定项目任务，或者定义新的过程元素。</span> <span style="font-family: 宋体; color: red">在项目中，</span> <span style="font-family: 宋体; color: red">还可以通过卡片实例来表现实际交付物和任务。卡片使得过程本身变得敏捷，易于使用。无论是电子卡片还是打印的版本，都能有效地推动过程采用，</span> <span style="font-family: 宋体; color: red">项目计划，</span> <span style="font-family: 宋体; color: red">并为实践者提供方便的参考指导。这些卡片使过程&#8220;活&#8220;起来，比静态的网页和书更方便阅读、理解。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>一口气读下来，感觉该方法是将</span>UP<span style="font-family: 宋体">做为了开发流程的主干，而敏捷这类的实践变成了流程中的相应环节和一砖一瓦。再说的简单一些，就是当你要设计开发一个非常复杂的系统时，你可以在其中使用</span>UML,<span style="font-family: 宋体">，</span>XP<span style="font-family: 宋体">，</span>AGILE<span style="font-family: 宋体">，</span>RUP<span style="font-family: 宋体">，只要场景适合允许，那就可以将其做为一个组件加以使用，最后再将这些过程衔接起来，构成软件开发的整个流程。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>当然在</span>IVAR<span style="font-family: 宋体">之前，就有一些案例使用了类型</span>IVAR<span style="font-family: 宋体">所强调的这种&#8216;大杂烩&#8217;的开发方法。<a title="建立敏捷统一过程框架, 本文旧版曾发表于《Dr.Dobb's软件研发》2003年8月创刊号&#13;&#10;" href="http://www.sawin.cn/doc/SE/Agile/TheEdge11.htm" target="_blank">比如</a>：</span><span style="color: red">TRW</span><span style="font-family: 宋体; color: red">公司于</span><span style="color: red">1987-1994</span><span style="font-family: 宋体; color: red">年间为美国空军开发的导弹预警和地面指挥控制系统</span><span style="color: red">CCPDS-R</span><span style="font-family: 宋体; color: red">是历史上非常著名的、融合统一过程（该项目所采用的过程方法后来形成了</span><span style="color: red">RUP</span><span style="font-family: 宋体; color: red">的一个主要来源）和敏捷思想的成功范例。该获奖项目的规模为</span><span style="color: red">75</span><span style="font-family: 宋体; color: red">人、</span><span style="color: red">6</span><span style="font-family: 宋体; color: red">年、</span><span style="color: red">100</span><span style="font-family: 宋体; color: red">多万行</span><span style="color: red">Ada</span><span style="font-family: 宋体; color: red">代码，采用了类似</span><span style="color: red">RUP 4</span><span style="font-family: 宋体; color: red">个阶段的迭代递增、架构优先过程。它不仅按进度和预算交付了大型关键任务系统，而且还使用户获得了超出预想的功能，在生产率和质量方面取得了</span><span style="color: red">2</span><span style="font-family: 宋体; color: red">倍的增长。</span><span style="color: red">&nbsp;</span>&nbsp;</p>
<p><span style="font-family: 宋体; color: red"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>在整个项目过程中，</span><span style="font-family: 'ˎ̥','serif'; color: red"> CCPDS-R</span><span style="font-family: 宋体; color: red">承受了大量需求的变化，甚至包括开发后期的一个合同范围变更。同等程度的需求变化扼杀了大部分采用传统管理方法的项目，而</span><span style="font-family: 'ˎ̥','serif'; color: red">CCPDS-R</span><span style="font-family: 宋体; color: red">却由于采用了风险管理、设计阶段架构的不断集成以及基于演示的评审方法，有效控制和稳定了变更成本，取得了超乎寻常的成功。</span><span style="font-family: 'ˎ̥','serif'; color: red">CCPDS-R</span><span style="font-family: 宋体; color: red">在注重个人互动、可用的软件、客户协作和响应变化等方面都做得非常出色，可以说完全实现了敏捷价值观和目标。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>不过因为</span><span style="font-family: 'ˎ̥','serif'">IVAR</span><span style="font-family: 宋体">还未公布</span><span style="font-family: 'ˎ̥','serif'">SMART</span><span style="font-family: 宋体">方法的具体实现细节以及相关流程，所以对于外界看来光凭那个</span><span style="font-family: 'ˎ̥','serif'">PPT</span><span style="font-family: 宋体">还是有些&#8216;盲人摸象&#8217;，但必定其指定了一个方向就是&#8216;分久必合&#8217;，当下软件方法论中</span><span style="font-family: 'ˎ̥','serif'">RUP,AGILE</span><span style="font-family: 宋体">等各自占据一片江山，而存在即合理，所以与其排斥不如包容。针对合适的场合，合适的团队，使用&#8220;全适的开发方法&#8220;。当然无论是</span><span style="font-family: 'ˎ̥','serif'">UP</span><span style="font-family: 宋体">还是</span><span style="font-family: 'ˎ̥','serif'">AGILE</span><span style="font-family: 宋体">，都对开发者提出了较高的要求，就是对</span><span style="font-family: 'ˎ̥','serif'">OO</span><span style="font-family: 宋体">设计</span><span style="font-family: 宋体">方法和技能的掌握。即：</span>&nbsp;</p>
<p><span style="color: red"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>XP</span><span style="font-family: 宋体; color: red">要求开发团队具备熟练的</span><span style="color: red">OO</span><span style="font-family: 宋体; color: red">编码、测试和重构等技能，</span><span style="color: red">RUP</span><span style="font-family: 宋体; color: red">也对</span><span style="color: red">OO</span><span style="font-family: 宋体; color: red">需求分析、架构设计提出了较高要求。没有真正理解</span><span style="color: red">OO</span><span style="font-family: 宋体; color: red">范式与传统结构化方法的本质区别，缺乏</span><span style="color: red">OO</span><span style="font-family: 宋体; color: red">技能，那就玩不转了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体; color: black"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>而国内的开发者的水平又摆在这，所以最后还是应了老杜之前说的那句话：</span>&nbsp;</p>
<p><span style="font-family: 宋体; color: red"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp; </span>所谓&#8216;根据公司团队实际情况采用相应的方法&#8217;只是一种奢谈。在国内来看，这类方式论的普及和理解层次远没到国外的水平，对于咨询公司而言相应的培训市场也并没理解中那样有利可图。我更认为</span><span style="color: red">TDD,</span><span style="font-family: 宋体; color: red">这类敏捷实践在国内&#8216;水土不服&#8217;。</span></p> <img src="http://www.cnblogs.com/daizhj/aggbug/1602555.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/13/1602555.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/13/1602555.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IT餐馆—第二十三回 对手</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/12/1601742.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Thu, 12 Nov 2009 05:39:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/12/1601742.html</guid><description><![CDATA[<p>阅读: 428 评论: 1 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-12 13:39 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/12/1601742.html" target="_blank">原文链接</a></p><p><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;这几天产品终于发布了，在做完了阶段总结之后，剩下的主要工作就是解决官网上用户反馈的一些问题，因为工作量不是很大，所以</span><span style="font-family: 宋体">雨辰能抽一些时间观注</span><span style="font-family: 宋体; color: black">一些新技术比如</span><span style="color: black"> windows7</span><span style="font-family: 宋体; color: black">下开发</span><span style="color: black">multi-touch</span><span style="font-family: 宋体; color: black">应用等。不过今天早上有同事在</span><span style="color: black">RTX</span><span style="font-family: 宋体; color: black">上发消息</span><span style="font-family: 宋体">说从竞争对手那边泄露出来的源码中发现有抄袭自己产品的痕迹，很是不平。其实这种事这些年雨辰经历了一些，态度也从当初的气愤变成了现在的&#8216;一笑了之&#8217;。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>在大家私下聊天时，雨辰就半开玩笑的说：&#8220;我还担心&#8216;竞争对手不抄&#8217;呢。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>因为抄袭别人的代码就好比吸了海洛因一样，以后他有可能收不住手了，并且自己的产品中的&#8216;问题&#8217;有可能是从所抄的代码中&#8216;继承&#8217;过来，这本身就是个麻烦事，如果解决不了就只能把希望寄托在对手身上了，而这无疑是&#8216;非常危险&#8217;的。另外如果那天人家不开源了，那该怎么办，到时就好比&#8216;断了奶的孩子&#8217;一样。同时抄袭竞争对手的代码，对开发者本身也是一种&#8216;羞辱&#8217;，另外抄得越多，自己的自信心和自尊心受到的打击就越大。不过有些竞争对手是开头抄，后来觉得没什么意思了，就打着&#8216;走自己的路&#8217;的旗号，按自己的理解而不是客户需求来做设计开发产品，最后把产品整得四不像。当把</span>VC<span style="font-family: 宋体">的钱花的差不多，还没找到合适的盈利模式后，大家就散伙了之。另外就是在中国互联网公司里，大家往往比的不是技术产品和服务以及如何满足用户需求，而是比谁的</span>VC<span style="font-family: 宋体">装钱的口袋深。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>不过能有个陪你从头玩到尾的竞争对手真的很难得，看看电视剧《康熙王朝》中陈道明扮演的康熙在自己六十大寿时是怎么评价吴三桂，葛尔丹和郑经他们的。有了这样的对手，最后才发现最了解自己的竟然是他们，让自己时刻保持清醒的是他们。当然有优秀的对手对公司</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">个人都是有好处的。公司可以不断推陈出新，认真经营。个人也可以从对手那学到很多有益的东西，比如代码。甚至如果你不知道下一步何去何从，你可以从对手那里找到答案。所以要&#8216;学习</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">关心</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">爱护</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">培养你的对手！。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>培养竞争对手，比如允许市场上有对手的份额，甚至可以在产品发布之前，故意来个泄露版，向对手释放一些信息或烟雾弹。比如<span style="color: red"><font style="background-color: #ffff66"><a href="http://cache.baidu.com/c?m=9d78d513d9931cef06bec8281a16a6394d0594247c89df4f3992d15f9217465c1735b8e2703510738396273146b8492bbbad696f735877f286cb8a41deb1852858d2616b&amp;p=837dc54adddf07fc57edf82558&amp;user=baidu" target="_blank"><span style="color: red"><font style="background-color: #ffff66">Borland</font>停止了对OWL的继续开发并且不久就从Microsoft那里购买了MFC头文件，动态链接库等的授权，<strong>微软没有提供完整的MFC的集成支持</strong></span></a></font><strong>。</strong></span></span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>永远不要想着把对手消灭的一干二净，这样对自己公司的发展没什么好处，起码如果没对手了，公司也不会花高薪来养一群过剩的开发者了。而真要这样做是不会促进行业发展的。互联网为什么能这样火，原因就是新概念层出不穷，并且从来不缺少竞争对手以及那些坚韧的创业草根，看看</span>SNS<span style="font-family: 宋体">社区，电子商务。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>除此之外，雨辰还总结出来的两点就是：</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>一</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体; color: red">永远不要在产品发布特别是第一版时将所有的亮点都暴露出来，因为这样用户会看起来头晕眼花，被&#8216;繁多&#8217;的功能所迁制，而忽略自己很看重的东西，另外就是对竞争对手来说，其也可以通过你暴露出来的功能进行抄袭。当然有实力的公司和开发团队都会留一手，将一些更有价值的功能和特性放在类似&#8216;研究院&#8217;的地方，以便在后续的版本中不断加入这些在&#8216;研究院&#8217;里经过长时间验证极其创新性的东西，让对手永远在后面追赶，而无暇考虑更多深层次的问题。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>二</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体; color: red">功能上的迭代，比如开始是一个不起眼的小功能，即使竞争对手看来也悟不出你引入该功能的意图。当竞争对手抄之后，这个小功能原来是后续重要战略发展的基石，如果后续功能再结合公司特有的&#8216;竞争优势&#8217;的话，那么抄袭方就可能被架空。其实这就像连环计一样，只有最后把底牌掀出来才会知道葫芦里卖的什么药。而当对手恍然大悟时，已悔之晚矣。当然如果对手那边也有高人，从一开始就能从你的设计思路上看出一些蛛丝马迹，从业务发展脉落上准确推断出自己的意图，那这场斗争就更有戏剧性了。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>其实很长一段时间以后，雨辰都是把&#8216;竞争&#8217;按双方的实力进行划分为：</span></p>
<p><span style="font-family: 宋体">与比自己弱的对手或潜在对手竞争，当发生这种情况时，未必就马上调动核心开发人员亲自上阵，有时凭借其它部门力量，比如市场</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">销售</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">公关等就可以取得&#8216;阶段性成果&#8217;甚至是最终胜利。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>与比自己实力差不多的对手竞争，是一场消耗战，比谁能保持的&#8216;最佳状态&#8217;时间长，同时把握住机会。其实与水平相当的对手竞争正是开发者建功立业的好机会，相信不少开发者的工资福利和价值会随着公司间竞争的白热化程度而水涨船高。</span></p>
<p><span style="font-family: 宋体">与比自己强的对手竞争，首先就是做好自己的工作，少犯或不犯错，然后耐心等待对手犯错。不过当下的公司的现代化水平都很高和组织结构都很完善，决策流程和结果出现错误的几率很低。所以&#8216;蚂蚁打败大象的案例&#8217;不是很多，但相信一旦有肯定会非常精彩。</span></p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>不过一年前老杜曾跟雨辰讨论过这个问题，他喜欢按竞争双方所持的&#8216;优</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">劣势&#8217;进行划分：</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: red">用自己的劣势拼对手的优势，这是最蠢的一种自杀方式，做这种事的人除了给那些好大喜功的领导看一场烟火之外，什么都落不下。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: red">用自己的优势拼敌人的优势，就像你所说的实力差不多的公司，不管是市场销售人员和开发者以及技术支持人员水平旗鼓相当。这种针尖对麦芒的作法倒不失为正人君子所为，但相信一片红海之后，海水会变的更红。当然其实产品的竞争是公司之间的竞争，开发者只有里面充当&#8216;制造武器&#8217;的角色。你开发的产品火力强不强，能不能赢得用户，击败对手，只是部分决定因素。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-family: 宋体; color: red">用自己的优势去拼对手的劣势，虽然胜算大，但要看战后的市场有多大，与前期投入竞争的资源以及消耗进行比较，也就是&#8216;投入产出比如何&#8217;，另外在攻下阵地的同时还要提防对手&#8216;反扑&#8217;。</span>&nbsp;</p>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>当然不管是哪一种划分方式，都应了那句话：&#8220;战场上最后解决战斗的还是步兵&#8221;，而竞争到最后就看谁的产品优秀。而产品是什么？在销售人员那里是定单的载体以及业务，在老板眼中是钱，在开发人员眼中就是代码。只有公司上下对产品的认识达成共识，而不是不同人眼中不同的东西，那才能确保从产品的设计之初到最终推出一气呵成。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>还有国内一提到竞争就是&#8216;价格战&#8217;，拼完了价格就拼关系（也可能顺序相反），然后拼服务和培训，最后实在没的拼，就剩下拼命了（开句玩笑）。当然雨辰还想到了一点，就是拼谁的开发者名气大，比如</span> Anders Hejlsberg<span style="font-family: 宋体">架构的框架或产品肯定要比一名普通架构师能博得更多的眼球和信任，因为人家用户那边也可能有开发人员，人家老板信不过你还信不过他手下的人吗，如果人家的开发人员知道你的名气，那自然而然会为你的产品说好话。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>总而言之，竞争要拼公司的综合实力，很多时候技术人员的竞争中并不是处于重要位置，而是公司的背景，知名度，规模，家底等。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>当然除了公司外部的竞争对手，其实在公司内容也存在竞争，因为只有资源稀缺，就会有对资源的争夺，一般中小公司内部资源（人力资源，财力，权力）都很紧张，所以各部门特别是业务上有重叠的部门有些是即合作又竞争的关系。比如雨辰所在的公司的产品线上就有不同产品所服务的客户产生重叠的情况，所以在市场上就出现了竞争。当然有时这是内耗，有时是上层为了完善产品线所做的布局，所以不便多做评论，只不过对于公司里那些弱小的部分和团队就真正成了&#8216;夹缝中生存&#8217;了。</span>&nbsp;</p>
<p><span style="font-family: 宋体; color: black">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#8230;&#8230;</p><img src="http://www.cnblogs.com/daizhj/aggbug/1601742.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/12/1601742.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/12/1601742.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item><item><title>IT餐馆—第二十二回 控件</title><link>http://www.cnblogs.com/daizhj/archive/2009/11/10/1599589.html</link><dc:creator>代震军</dc:creator><author>代震军</author><pubDate>Tue, 10 Nov 2009 02:42:00 GMT</pubDate><guid>http://www.cnblogs.com/daizhj/archive/2009/11/10/1599589.html</guid><description><![CDATA[<p>阅读: 642 评论: 0 作者: <a href="http://www.cnblogs.com/daizhj/" target="_blank">代震军</a> 发表于 2009-11-10 10:42 <a href="http://www.cnblogs.com/daizhj/archive/2009/11/10/1599589.html" target="_blank">原文链接</a></p><p><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;周三中午吃完饭，雨辰从食堂回来，发现开发小组中的一位姓黄的同事（组里管他叫老黄牛）正在看一本</span>.net<span style="font-family: 宋体">的书，因为这几年雨辰已基本上不再买技术类的书了，因为真正看的上眼</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">有价值</span><span style="font-family: 宋体">、有水准的书籍前些年基本都翻遍了。</span><span style="font-family: 宋体">雨辰带着好奇心走过去问</span><span style="font-family: 宋体">老黄</span><span style="font-family: 宋体">关于该书的一些情况，因为已过了对那些所谓标以&#8216;入门&#8217;</span><span style="font-family: 宋体">、&#8216;精通&#8217;，&#8216;深入浅出&#8217;，&#8216;宝典&#8217;之类图书的&#8216;感冒期&#8217;，所以就单刀直入，问了老黄正在看的部分。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄也很高兴有人一起交流，就说：&#8220;目前正在看关于控件开发方面的内容，该书用了近</span>50<span style="font-family: 宋体">页的篇幅来介绍控件的原理，开发流程，相关函数方法，示例啥的。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰笑着对他说：&#8220;具我所知，在</span>.net<span style="font-family: 宋体">中控件分为自定义控件和用户控件，其中用户控件我接触的比较早，这些年也一直在用，特别是</span>web<span style="font-family: 宋体">用户控件。而</span>web<span style="font-family: 宋体">自定义控件是加入到产品组之后才开始设计使用的。不过这些年走过来倒是有些心得，不知道黄兄有兴趣听不。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄点点头：&#8220;当然了，我之前在上家公司也开发设计过一些用户控件，感觉还是挺容易上手的。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰拍拍老黄的肩膀，笑着说：&#8220;的确如此，其实我感觉控件的好处有几方面，首先就是提升代码的可复用性，进而封装可复用的业务逻辑（这主要体现在用户控件上）。其次是缓存，其提供了一种可以缓存页面局部信息的方法，比如在</span>web<span style="font-family: 宋体">用户控件头添加声明：</span></p>
<div class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&lt;%</span><span style="color: #000000">OutputCache&nbsp;Duration</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">300&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">&nbsp;VaryByParam</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800000">"</span><span style="color: #800000">none&nbsp;</span><span style="color: #800000">"</span><span style="color: #000000">%&gt;</span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>而第三点是用户控件也提供了一个不错的</span>AJAX<span style="font-family: 宋体">调用方式，之前就曾有人在网上使用</span>ajaxHelper<span style="font-family: 宋体">的方式来实现加载</span>ascx<span style="font-family: 宋体">文件并获取相应的返回信息之后，加载并刷新当面页面指定区域（通常是</span>div<span style="font-family: 宋体">元素）。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#8220;你前两点我认同，但第三点是什么意思呀，我怎么听不太明白？&#8221;老黄不解的问。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰解释说：&#8220;其实原理很简单，就是你在一个叫</span>ajax.aspx<span style="font-family: 宋体">的页面上放一个</span>form<span style="font-family: 宋体">标签，其</span><span style="color: black">runat</span><span style="font-family: 宋体; color: black">为</span><span style="color: black">"server",</span><span style="font-family: 宋体; color: black">然后在</span><span style="color: black">ajax.aspx.cs</span><span style="font-family: 宋体; color: black">文件的</span>Page_Load<span style="font-family: 宋体">事件中使用该</span>form<span style="font-family: 宋体">的</span>controls<span style="font-family: 宋体">属性，并调用该属性的</span>add<span style="font-family: 宋体">方法来加载指定的用户控件（作为参数传入），这时该</span>ajax.aspx<span style="font-family: 宋体">页面就会显示指定的用户控件的输出内容了。当然在</span>ajax.aspx<span style="font-family: 宋体">页面中会有一个标签用于记录当前的页面中用户控件显示信息的&#8216;区域&#8217;，这样在使用</span>prototype.js<span style="font-family: 宋体">这类框架中的</span>ajax<span style="font-family: 宋体">功能时，就可以直接向</span>ajax.aspx<span style="font-family: 宋体">页面传递要调用的用户控件&#8216;参数&#8217;，并将控件加载后返回的页面信息截取出来，做为</span>ajax<span style="font-family: 宋体">调用的返回结果，用于刷新指定页面元素（通常是</span>div<span style="font-family: 宋体">）中的</span>innerHtml<span style="font-family: 宋体">属性。说了这些，我给你个链接，你可以看看其最终的实现代码（<a title=" mootools-1.2 学习笔记之ajax基本操作" href="http://www.cnblogs.com/daizhj/articles/1291592.html" target="_blank">代码链接</a>）</span>&nbsp;</p>
<p><span style="font-family: 新宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>听了</span><span style="font-family: 宋体">雨辰这么说，老黄才明白了到底怎么回事，说：&#8220;不过我感觉这个</span>ajax.aspx<span style="font-family: 宋体">就像个代理一样，呵呵，不过这也算是提供了一个不错的思路了。因为我以前都是用</span>ajax<span style="font-family: 宋体">请求一个可执行的页面或链接，比如</span> aspx<span style="font-family: 宋体">、</span>ashx<span style="font-family: 宋体">或</span>asmx<span style="font-family: 宋体">。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰笑着说：&#8220;这也说明了</span>web<span style="font-family: 宋体">用户控件的开发与</span>web<span style="font-family: 宋体">页面还是很接近的，呵呵。另外就是在刚学习和开发用户控件时往往还会犯一些小毛病。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄听雨辰这么说，问道：&#8220;哪些毛病？！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>&#8220;首先就是将一</span><span style="font-family: 宋体; color: black; font-size: 10pt">些特殊的业务逻辑加入到用户控件代码中，降低了控件的通用性。其次就是有</span><span style="font-family: 宋体">些人习惯于在</span>web<span style="font-family: 宋体">用户控件上只放一个</span>LABLE<span style="font-family: 宋体">，然后就用</span>CS<span style="font-family: 宋体">文件来填充其</span>.text<span style="font-family: 宋体">属性。这不是什么好习惯。对于复杂的数据展示就应该使用</span>Repeater,Datagrid<span style="font-family: 宋体">等控件，甚至要复合几个控件来满足需求，而这种将数据和显示控件代码硬编码到一起的做法，会让后续的代码分离，阅读理解都会带来不少的麻烦。另外我发现有些开发者习惯于把</span>web<span style="font-family: 宋体">用户控件的所有</span>CS<span style="font-family: 宋体">代码都放到</span>Page_load<span style="font-family: 宋体">事件中，但因为用户控件的</span>CS<span style="font-family: 宋体">文件中也有</span><span style="font-family: 新宋体; font-size: 9pt">OnInit</span> <span style="font-family: 新宋体">、InitializeComponent等方法（与page相似）,应根据当前要实现的功能将代码均匀分布相应的事件代码中，比如初始化组件代码、数据绑定到控件的代码，页面显示代码等。这三个毛病只是其中的一部分，应该有一定的代表性了。&#8221;</span> <span style="font-family: 宋体">雨辰边想边说。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄点了点头。不过我还有个问题，之前我曾在项目中为所有的</span>web<span style="font-family: 宋体">用户控件构造了一个基类，在这个基类中提供了一些公有属性，比如控件版本号，控件名称以及一些常用属性的初始化操作等等，这样在其派生子类（控件）中可以直接使用这些被初始化好的属性了。当然我还想一些跳转逻辑写到这个控件基类中，比如在管理后台操作中，如用户身份验证出现问题时，就可以完成跳转，而不能等执行到主页面</span>page_load<span style="font-family: 宋体">时再跳转，不知道这个做有什么问题没有。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰笑着说：&#8220;你抽取出一个控件基类的作法我没什么异议，只是在&#8216;是否在用户控件中提供跳转操作&#8217;的想法有些差别。当然你这样写也能完成你想要实现的功能。但我认为对用户身份</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">权限校验这类的操作还是应该放到控件所属的主页面或业务逻辑层为宜，因为控件完成的只是做数据绑定，显示数据这类工作，如果掺杂过多的特殊业务逻辑会降低控件的通用性。另外如果让控件基类做这种权限类的操作时，你必须还要提供相应的&#8216;开关&#8217;属性，因为不是所有的应用场景都需要对用户权限进行校验，这无形中也增加了使用控件的&#8216;难度系数&#8217;，甚至让人产生歧义。当然如果你的这类控件只想用于我之前所说的那种</span>ajax<span style="font-family: 宋体">调用的话，那还说得过去，因为它很类似于直接调用</span>aspx<span style="font-family: 宋体">页面，这样当客户端请求用户控件时，通过对其所提供的身份信息进行验证，返回相应的结果或校验错误信息，这倒是一个不错的思路。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄笑着说：&#8220;你说要将页面跳转这类的代码放到什么地方呢？&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰想了想，在旁边的黑板上写了一些东西，内容如下：</span>&nbsp;</p>
<div style="width: 951px; height: 85px" class="cnblogs_code"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;主页面属性&nbsp;--&gt;主页面的构造函数--&gt;&nbsp;用户控件属性--&gt;用户控件的构造函数--&gt;用户控件的OnInit事件--&gt;用户控件的InitializeComponent方法--&gt;主页面的OnInit事件--&gt;主页面的InitializeComponent方法--&gt;主页面的Page_Load()--&gt;用户控件页的Page_Load()&nbsp;</span></div>
<p>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>然后转过身对老黄说：&#8220;这是对有用户控件的页面的执行流程，如果我要写权限验证的逻辑，我会将其放到第二步，也就是<span style="color: black">主页面的构造函数中，这样就可以在&#8216;验证操作&#8217;不通过的情况下，不再依次执行后续的控件初始以及</span></span>page_load<span style="font-family: 宋体">方法了，相信在速度上也会快许多，不过如果在构造方法中使用</span><span style="color: black">Response.Redirect(&#8230;)</span><span style="font-family: 宋体; color: black">这类的写法可能会出问题，我建议使用</span><span style="color: black">System.Web.HttpContext.Current.Response.Redirect()</span><span style="font-family: 宋体; color: black">，这样就差不多了。</span><span style="font-family: 宋体">&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>老黄看着这个执行流程，想了想自己开发的代码，说：&#8220;一会我回去测一下这个流程，如果如你所说的话，那我要改的地方就多了，呵呵。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰接着说：&#8220;其实开发控件是需要对页面和控件生命周期有一定了解的。特别是开发自定义控件。因为用户控件提供了</span>.ascx<span style="font-family: 宋体">和相应的</span>.ascx.cs<span style="font-family: 宋体">文件，这样就很便于将数据绑定与显示逻辑进行代码分离，同时其开发起来与进行</span>webform<span style="font-family: 宋体">页面开发有很多相似之处，甚至在刚上手时没什么区别，所以难度不是很大。而自定义控件就有所不同了，其自身没有前台界面文件（比如</span>ascx<span style="font-family: 宋体">等），所有的代码都是在相应</span>.cs<span style="font-family: 宋体">文件中提供的，比如要开发在</span>web<span style="font-family: 宋体">页面中使用的自定义控件，就需要继承</span><span style="color: black">WebControl</span><span style="font-family: 宋体; color: black">或</span><span style="color: black">Control</span><span style="font-family: 宋体; color: black">，并实现</span>Render(<span style="color: #2b91af">HtmlTextWriter pOutPut) </span><span style="font-family: 宋体">方法。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span>雨辰把水杯拿过来喝了一口水然后继续说道：&#8220;另外我更倾向于在用户控件中加入更多的业务逻辑，而在自定义控件中的业务逻辑就没那么重要了，因为自定义控件应该更强调其通用性、易用性的一面，比如之前在用户控件中拖入</span>lable<span style="font-family: 宋体">这类自定义控件等。另外在自定义控件开发中要考虑</span>webpage<span style="font-family: 宋体">和控件生命周期、</span><span style="font-family: 宋体">事件机制</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">回传事件</span><span style="font-family: 宋体">、</span><span style="font-family: 宋体">视图状态等问题及与之相关的流程函数。所以我感觉自定义控件开发要将更多的精力放在控件的通用性（比如可以在</span>winform<span style="font-family: 宋体">或</span>webform<span style="font-family: 宋体">中同时使用），还有控件底层实现机制上的理解上。有人说开发自定义控件要比用户控件复杂，原因就在于此。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>老黄说：&#8220;的确，我也认为做</span>web<span style="font-family: 宋体">型的自定义控件也要了解页面生命周期相关的内容，目前我还在开发设计用户控件阶段，没有涉足到自定义控件方面，呵呵。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>雨辰笑着说：&#8220;这只是时间问题，呵呵。另外就是我这些年开发控件时大体经历了四个阶段：</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: red">1.</span><span style="font-family: 宋体; color: red">上手阶段，这一阶段把什么代码都放在一个</span><span style="color: red">cs</span><span style="font-family: 宋体; color: red">或一个类中，并不根据其控件行为，结构的复杂性进行类层面上的定义分解，比如要开发</span><span style="color: red">tab</span><span style="font-family: 宋体; color: red">控件时，就应该将相应的属性页分解成一个</span><span style="color: red">cs</span><span style="font-family: 宋体; color: red">类文件，这样就可以把整个</span><span style="color: red">tab</span><span style="font-family: 宋体; color: red">控件看成是一个个属性页的&#8216;集合&#8217;来进行&#8216;复合处理&#8217;（使用</span><span style="color: red">CreateChildControls</span><span style="font-family: 宋体; color: red">创建子控件）。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: red">2.</span><span style="font-family: 宋体; color: red">看开源或破解的第三方商业控件库代码（有些不道德，但是个学习途径），这时才发现自己写的就是垃圾，看出了与别人的差距。感觉自己的水平就像是小学生，自信心受到了空前的打击，甚至不敢再进行开发。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: red">3.</span><span style="font-family: 宋体; color: red">收拾起&#8216;残破&#8217;的自信心，研究相应的优秀代码，同时深研底层实现（比如用</span><span style="color: red">reflector</span><span style="font-family: 宋体; color: red">看</span><span style="color: red">.net</span><span style="font-family: 宋体; color: red">中的控件&#8216;源码&#8217;，同时再看一些</span><span style="color: red">.net</span><span style="font-family: 宋体; color: red">出现之前的那些控件及其实现代码</span><span style="color: red">(</span><span style="font-family: 宋体; color: red">比如</span><span style="color: red">MFC,DELPHI</span><span style="font-family: 宋体; color: red">控件库</span><span style="color: red">)</span><span style="font-family: 宋体; color: red">，从对底层的理解上更上一层楼。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="color: red">4.</span><span style="font-family: 宋体; color: red">为控件提供界面丰富的&#8216;设计时支持&#8217;，比如使用</span><span style="color: red">PropertyGrid(</span><span style="font-family: 宋体; color: red">属性表</span><span style="color: red">)</span><span style="font-family: 宋体; color: red">以及继承并实现</span><span style="color: red">ControlDesigner</span><span style="font-family: 宋体; color: red">类</span><span style="font-family: 宋体; color: red">（位于</span><span style="color: red">System.Web.UI.Design</span><span style="font-family: 宋体; color: red">名空间）并重写</span><span style="color: red">GetDesignTimeHtml()</span><span style="font-family: 宋体; color: red">方法，这样就可以允许用户在</span><span style="color: red">VS</span><span style="font-family: 宋体; color: red">中的设计器中对控件&#8216;手动&#8217;进行初始化，这一点可以想想我们以前使用</span><span style="color: red">TreeView</span><span style="font-family: 宋体; color: red">这类控件时，手工添加树形结点的情况。</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>当然要开发好</span>web<span style="font-family: 宋体">控件，对</span>css<span style="font-family: 宋体">，</span>js<span style="font-family: 宋体">还要有一定理解，必定有时用样式或</span>JS<span style="font-family: 宋体">实现要比用</span>cs<span style="font-family: 宋体">代码要更方便，灵活，可定制性更好。只不过这方面商业控件要考虑</span>js<span style="font-family: 宋体">脚本加密、混淆等问题了。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>老黄点了点头说：&#8220;其实介绍如何开发控件就可以写上几本书了，看老外那边光一个列表控件就可以卖几百美刀，感觉真有大有&#8216;钱途&#8217;呀。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span>雨辰苦笑着说：&#8220;谁说不是呢，哎</span>! <span style="font-family: 宋体">另外目前国外的控件开发商都有功能丰富、界面华丽的产品，比如</span> <span>ComponentArt,</span> <span>telerik , devexpress, componentone, infragistics, netikatech</span><span style="font-family: 宋体; color: black">等等，并且其研发步伐往往还紧随像微软这样的</span><span style="font-family: 'Verdana','sans-serif'; color: black">IT</span><span style="font-family: 宋体; color: black">巨头，比如</span><span style="font-family: 'Verdana','sans-serif'; color: black">silverlight</span><span style="font-family: 宋体; color: black">这类技术的相关控件研发，我看其活得都</span><span style="font-family: 宋体">挺&#8216;滋润&#8217;。但国内控件开发者的生存状况就不太乐观了，必定这一产品是要以技术为支撑的，其使用的&#8216;客户&#8217;往往也是开发者，比行业软件开发者还要&#8216;幕后&#8217;。另外大家对软件&#8216;免费&#8217;有过多的依赖和&#8216;误解&#8217;。所以国内通过开发控件走商业化，要比软件商业化更难，甚至是&#8216;无解&#8217;。比如大家对一款商业化好用的控件库往往抱着下面的看法：</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体; color: red">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="color: red">1.</span><span style="font-family: 宋体; color: red">首先是想到破解版（最好还能有源码）。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="color: red">2.</span><span style="font-family: 宋体; color: red">考虑其它可以免费使用该控件的途径。</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="color: red">3.</span><span style="font-family: 宋体; color: red">如没有其它路子，就想自己能否开发一款相类似的控件出来</span> <span style="font-family: 宋体; color: red">（往往开发周期长或功能过于复杂而作罢）</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="color: red">4.</span><span style="font-family: 宋体; color: red">如果此路不通，再看看有无开源的项目来做替代品。有时最后因为不愿付费，而最终改变了软件的界面设计，给用户使用上造成困扰，用户体验也不好，甚至很</span><span style="color: red">BT</span><span style="font-family: 宋体; color: red">。&#8221;</span></p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span>老黄笑着说：&#8220;目前你说的这些我基本赞同，但我还是希望国内商业控件公司能有不错的发展，必定这是一个方向呀，之前曾在</span>csdn<span style="font-family: 宋体">上看过一家国内公司提出基于业务组件（实际也就是控件）开发，换句话说只要把几个组件（或控件）拖拽到窗体或页面中，简单设置一个属性，开发就完成了，多方便呀！&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span>雨辰坏笑着说：&#8220;如果真要有那一天，那你我就都</span>TM<span style="font-family: 宋体">失业了，因为到那时老板或业务专家，就可以完成软件开发，还要你我干什么，呵呵。&#8221;</span>&nbsp;</p>
<p><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体"><span style="font-family: 宋体">&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span>这时雨辰看了一下时间差不多了，寒暄几句之后，就回座位工作了。</span></p><img src="http://www.cnblogs.com/daizhj/aggbug/1599589.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/10/1599589.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/daizhj/archive/2009/11/10/1599589.html#commentform" target="_blank">发表评论</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/56837/" target="_blank">Android命名 冻酸奶之后是姜饼</a><span style="color:gray">(2010-02-10 14:11)</span><br/>· <a href="http://news.cnblogs.com/n/56836/" target="_blank">MySpace中国全面转型：欲争夺数字音乐版权</a><span style="color:gray">(2010-02-10 14:02)</span><br/>· <a href="http://news.cnblogs.com/n/56835/" target="_blank">王冉：中国会成全球最大移动互联网市场</a><span style="color:gray">(2010-02-10 13:42)</span><br/>· <a href="http://news.cnblogs.com/n/56833/" target="_blank">冷静，社交游戏！</a><span style="color:gray">(2010-02-10 13:38)</span><br/>· <a href="http://news.cnblogs.com/n/56834/" target="_blank">百度新宠：网络视频</a><span style="color:gray">(2010-02-10 13:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/56829/" target="_blank">.NET Reflector即将商业化</a><br/></p><p>网站导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/" target="_blank">个人主页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://home.cnblogs.com/group/" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a></p>]]></description></item></channel></rss>