﻿<?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>博客园-tubo</title><link>http://www.cnblogs.com/tubo/</link><description /><language>zh-cn</language><lastBuildDate>Fri, 19 Mar 2010 04:32:39 GMT</lastBuildDate><pubDate>Fri, 19 Mar 2010 04:32:39 GMT</pubDate><ttl>60</ttl><item><title>VS2008 T4模板include文件的查找位置</title><link>http://www.cnblogs.com/tubo/archive/2010/03/15/1685989.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Mon, 15 Mar 2010 02:54:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2010/03/15/1685989.html</guid><description><![CDATA[<p>阅读: 4 评论: 0 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2010-03-15 10:54 <a href="http://www.cnblogs.com/tubo/archive/2010/03/15/1685989.html" target="_blank">原文链接</a></p><p>最近在研究T4模板，其提供了一个include file的功能，可以将一些供代码生成公用的方法和类放到include文件中，提高代码生成代码的重用。如果把include file放到项目中.tt文件同一个文件夹中，vs2008可以找到它，但是这样的话，修改include文件将要维护多个版本。如果把include文件不放到项目中并且让vs2008能自动找到它，就可以不用维护include文件的多个副本了。VS2008在什么地方查找include文件呢，找了很久，终于在注册表中找到了：</p>  <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/VS2008T4include_991C/image_3.png" width="1004" height="210" /></p>  <p>在我的计算机上默认的include位置是：C:\Program Files\Microsoft Visual Studio 2008 SDK\VisualStudioIntegration\Tools\DSLTools\TextTemplates。</p>  <p>当然你也可以自己添加一个项，设定自己的include文件位置，就像上图中的T4Toolbox一样。</p><img src="http://www.cnblogs.com/tubo/aggbug/1685989.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/tubo/archive/2010/03/15/1685989.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2010/03/15/1685989.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>EF4.0 POCO之继承</title><link>http://www.cnblogs.com/tubo/archive/2010/01/08/1642045.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Fri, 08 Jan 2010 03:50:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2010/01/08/1642045.html</guid><description><![CDATA[<p>阅读: 994 评论: 7 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2010-01-08 11:50 <a href="http://www.cnblogs.com/tubo/archive/2010/01/08/1642045.html" target="_blank">原文链接</a></p><p>最近一直在看关于EF4.0的POCO的一些文章，自己也想做一些POCO的测试，正好看到<a href="http://www.cnblogs.com/xray2005/" target="_blank">风车车</a>的<a href="http://www.cnblogs.com/xray2005/archive/2010/01/06/EF4.html" target="_blank">Entity Framework 4 第一篇 POCO</a>和<a href="http://www.cnblogs.com/Barton131420/" target="_blank">双鱼座</a>的<a href="http://www.cnblogs.com/Barton131420/archive/2010/01/07/1640878.html" target="_blank">POCO真那么重要么？</a>，对于风车车EF4系列的第一篇POCO中就使用Code Only来讲解有点不太适应，呵呵，一下子就进入了没有edmx的时代了，过度太快了:)。看了双鱼座大侠的文章，感觉是真正的面向对象的设计，并且从正文中进入了这篇文章：<a href="http://www.cnblogs.com/Barton131420/archive/2009/09/04/1560237.html" target="_blank">体验ADO.NET Entity Framework的继承</a>，不管POCO是否重要（个人比较倾向于使用POCO），既然EF4.0支持POCO，那么我们就来测试一下吧，我直接使用了《体验ADO.NET Entity Framework的继承》文中例子（希望双鱼座大侠不要怪罪）。</p>  <p>使用vs2010 Beta2打开《体验》文中的例子，完成升级向导，我们还是使用&#8220;传统&#8221;一点的方式来体验POCO，右键点击InheritanceDemoModel.edmx选择属性，删除Custom tool，如下图所示：</p>  <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/EF4.0POCO_3E9/image_5.png" width="388" height="174" /> </p>  <p>新建如下实体类，其他代码略掉，请参考文后的代码附件：</p>  <pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-right-width: 1px; border-top: 1px dashed"  color:#0000ff?="color:#0000FF?">public <span style="color: #0000ff">class</span> Privilege
    {
        <span style="color: #0000ff">private</span> IList&lt;Role&gt; roles = <span style="color: #0000ff">new</span> List&lt;Role&gt;();
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Id { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Handle { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Display { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
        <span style="color: #0000ff">public</span> IList&lt;Role&gt; Roles { <span style="color: #0000ff">get</span> { <span style="color: #0000ff">return</span> roles; } <span style="color: #0000ff">set</span> { roles = <span style="color: #0000ff">value</span>; } }
    }&nbsp; </pre>

<p>还有DemoEntities，因为删除Custom Tool之后，不能自动生成代码，所以需要手写代码：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-right-width: 1px; border-top: 1px dashed"  color:#0000ff?="color:#0000FF?">public <span style="color: #0000ff">class</span> DemoEntities : ObjectContext
    {
        <span style="color: #0000ff">public</span> DemoEntities()
            : <span style="color: #0000ff">base</span>("<span style="color: #8b0000">name=DemoEntities</span>", "<span style="color: #8b0000">DemoEntities</span>")  
        {
            _roles = CreateObjectSet&lt;Role&gt;();
            _privileges = CreateObjectSet&lt;Privilege&gt;();
            _userOrGroups = CreateObjectSet&lt;UserOrGroup&gt;();
            }

        <span style="color: #0000ff">public</span> ObjectSet&lt;Role&gt; Roles
        {
            <span style="color: #0000ff">get</span> 
            { 
                <span style="color: #0000ff">return</span> _roles; 
            }
        }
        <span style="color: #0000ff">private</span> ObjectSet&lt;Role&gt; _roles;

        <span style="color: #0000ff">public</span> ObjectSet&lt;Privilege&gt; Privileges
        {
            <span style="color: #0000ff">get</span>
            {
                <span style="color: #0000ff">return</span> _privileges;
            }
        }
        <span style="color: #0000ff">private</span> ObjectSet&lt;Privilege&gt; _privileges;
        <span style="color: #0000ff">public</span> ObjectSet&lt;UserOrGroup&gt; UserOrGroups
        {
            <span style="color: #0000ff">get</span>
            {
                <span style="color: #0000ff">return</span> _userOrGroups;
            }
        }
        <span style="color: #0000ff">private</span> ObjectSet&lt;UserOrGroup&gt; _userOrGroups;
    
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> AddToUserOrGroups(UserOrGroup userOrGroup)
        {
            _userOrGroups.AddObject(userOrGroup);
        }

        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> AddToRoles(Role role)
        {
            _roles.AddObject(role);
        }

        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> AddToPrivileges(Privilege privilege)
        {
            _privileges.AddObject(privilege);
        }
    }</pre>

<p>单元测试代码不用作修改，直接运行单元测试，全部通过。</p><p>&nbsp;本文源代码<a href="http://cid-0a2f78dfe3031674.skydrive.live.com/self.aspx/Public/Source/InheritancePOCODemo1.zip" target="_blank">下载</a>，注意修改单元测试项目下的App.Config中的连接字符串</p><img src="http://www.cnblogs.com/tubo/aggbug/1642045.html?type=1" width="1" height="1" alt=""/><p>评论: 7　<a href="http://www.cnblogs.com/tubo/archive/2010/01/08/1642045.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2010/01/08/1642045.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>ExtJs实践：支持&amp;ldquo;复杂&amp;rdquo;Json的JsonReader</title><link>http://www.cnblogs.com/tubo/archive/2009/09/24/1572991.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Wed, 23 Sep 2009 16:45:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/24/1572991.html</guid><description><![CDATA[<p>阅读: 1612 评论: 5 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-24 00:45 <a href="http://www.cnblogs.com/tubo/archive/2009/09/24/1572991.html" target="_blank">原文链接</a></p><p>从服务端返回如下的JSON：</p>  <pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">{Id:2,Name:'Child1',Parent:{Id:1,Name:'Parent'}}</pre>

<p>定义了如下的JsonReader来准备显示角色列表，父角色的名称影射成ParentName：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">var</span> myReader = <span style="color: #0000ff">new</span> Ext.data.JsonReader({
    idProperty: 'id'          
    root: 'rows',             
    totalProperty: 'results', 
    
    fields: [
        {<span style="color: #0000ff">name</span>: 'Id'},
        {<span style="color: #0000ff">name</span>: 'Name'},
        {<span style="color: #0000ff">name</span>: 'ParentName', mapping: 'Parent.Name'}
    ]    
});</pre>

<p>当服务端传回来的JSON包含Parent，就如上面的JSON一样，这个reader能正常工作，但是当返回的JSON中不包含Parent或者Parent为null的时候，列表就不能正常显示了：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">{Id:2,Name:'Child1',Parent:<span style="color: #0000ff">null</span>}</pre>

<p>大家可能已经猜到mapping:’Parent.Name’也许出了问题，对，Parent为null，怎么能访问Name属性呢，这个时候ParentName也应该是null。但是JsonReader并没有考虑到这种情况，查看了JsonReader的源代码，发现了下面这个方法：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    getJsonAccessor: <span style="color: #0000ff">function</span>(){
        <span style="color: #0000ff">var</span> re = /[\[\.]/;
        <span style="color: #0000ff">return</span> <span style="color: #0000ff">function</span>(expr) {
            <span style="color: #0000ff">try</span> {
                <span style="color: #0000ff">return</span>(re.test(expr)) ?
                <span style="color: #0000ff">new</span> <span style="color: #0000ff">Function</span>(&quot;<span style="color: #8b0000">obj</span>&quot;, &quot;<span style="color: #8b0000">return obj.</span>&quot; + expr) :
                <span style="color: #0000ff">function</span>(obj){
                    <span style="color: #0000ff">return</span> obj[expr];
                };
            } <span style="color: #0000ff">catch</span>(e){}
            <span style="color: #0000ff">return</span> Ext.emptyFn;
        };
    }(),</pre>

<p>获取Json访问器方法，JsonReader会通过这个方法的根据fields设定获取一系列的如下的function:</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">function</span>(obj){
  <span style="color: #0000ff">return</span> obj.Id;
}

<span style="color: #0000ff">function</span>(obj){
  <span style="color: #0000ff">return</span> obj.Name;
}

<span style="color: #0000ff">function</span>(obj){
  <span style="color: #0000ff">return</span> obj.Parent.Name;
}</pre>

<p>大家看到问题了吧，就在obj.Parent.Name上，当Parent为null或者根本不存在的时候，程序到这里就终止了。要解决这个问题，我们就要修改这个获取Json访问器的方法，使它能返回如下的function:</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">function</span>(obj){
  <span style="color: #0000ff">try</span>{
    <span style="color: #0000ff">return</span> obj.Parent.Name;  
  }
  <span style="color: #0000ff">catch</span>(e){}
  <span style="color: #0000ff">return</span> undefined;
}</pre>

<p>当然我们不能去修改ExtJs的源程序，使用继承来覆盖原来的getJsonAccessor：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">ComplexJsonReader = Ext.extend(Ext.data.JsonReader, {
    getJsonAccessor: <span style="color: #0000ff">function</span>() {
        <span style="color: #0000ff">var</span> re = /[\[\.]/;
        <span style="color: #0000ff">return</span> <span style="color: #0000ff">function</span>(expr) {
            <span style="color: #0000ff">try</span> {
                <span style="color: #0000ff">return</span> (re.test(expr)) ?
                <span style="color: #0000ff">new</span> <span style="color: #0000ff">Function</span>(&quot;<span style="color: #8b0000">obj</span>&quot;, &quot;<span style="color: #8b0000">try { return  obj.</span>&quot; + expr + &quot;<span style="color: #8b0000">;}catch(e){}return undefined;</span>&quot;) :
                <span style="color: #0000ff">function</span>(obj) {
                    <span style="color: #0000ff">return</span> obj[expr];
                };
            } <span style="color: #0000ff">catch</span> (e) { }
            <span style="color: #0000ff">return</span> Ext.emptyFn;
        };
    } ()
    
});</pre>

<p>但是，如果你的GridPanel使用的是JsonStore的话，那么将不能享受ComplexJsonReader，因为JsonStore是一个顽固分子，它在内部限定了reader只能是JsonReader:</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">Ext.data.JsonStore = Ext.extend(Ext.data.Store, {
    <span style="color: #008000">/**
     * @cfg {Ext.data.DataReader} reader @hide
     */</span>
    <span style="color: #0000ff">constructor</span>: <span style="color: #0000ff">function</span>(config){
        Ext.data.JsonStore.superclass.<span style="color: #0000ff">constructor</span>.call(<span style="color: #0000ff">this</span>, Ext.apply(config, {
            reader: <span style="color: #0000ff">new</span> Ext.data.JsonReader(config)
        }));
    }
});
Ext.reg('jsonstore', Ext.data.JsonStore);</pre>

<p>所以你只能再派生一个ComplexJsonStore出来，但是不能从JsonStore继承，因为它很顽固，除了通过配置来设定reader之外，没有提供方法来设定，所以你想在它的构造函数调用之后再来替换掉reader，没有门，所以只能从Store继承：</p>

<pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">ComplexJsonStore = Ext.extend(Ext.data.Store, {
    <span style="color: #0000ff">constructor</span>: <span style="color: #0000ff">function</span>(config) {
        ComplexStore.superclass.<span style="color: #0000ff">constructor</span>.call(<span style="color: #0000ff">this</span>, Ext.apply(config, {
            reader: <span style="color: #0000ff">new</span> ComplexJsonReader(config)
        }));
    }
});</pre>

<p>嗯，ComplexJsonStore也很顽固，当然你也可以改变一下，让它不那么顽固 :)。</p>

<p>“复杂”Json？谁有更好的叫法？</p><img src="http://www.cnblogs.com/tubo/aggbug/1572991.html?type=1" width="1" height="1" alt=""/><p>评论: 5　<a href="http://www.cnblogs.com/tubo/archive/2009/09/24/1572991.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/24/1572991.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>HP CQ40-406TX安装Win7记</title><link>http://www.cnblogs.com/tubo/archive/2009/09/23/1572971.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Wed, 23 Sep 2009 15:33:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/23/1572971.html</guid><description><![CDATA[<p>阅读: 1750 评论: 1 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-23 23:33 <a href="http://www.cnblogs.com/tubo/archive/2009/09/23/1572971.html" target="_blank">原文链接</a></p><p> 最近笔记本的vista系统越来越慢了，准备重新安装系统，既然Win7都出来了，那就让vista退休吧。</p>  <p> 系统安装过程很顺利，完成之后发现系统里几个设备驱动没有找到，其中就包括显卡（Geforce G 103M，这个在我的意料之中，因为之前Vista也不认识这个显卡）：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_3.png" width="149" height="87" /> </p>  <p>于是，去nvida的官网<a href="http://cn.download.nvidia.com/Windows/186.81/186.81_notebook_win7_winvista_64bit_international_whql.exe">下载</a>最新的驱动程序：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_6.png" width="503" height="234" /> </p>  <p>用下载下来的安装程序，却只能安装声卡，没有发现与该驱动兼容的显卡（唉，怎么又在我的意料之中呢，因为Vista也是一样，NVIDIA下载的驱动也不能认识这个显卡），那就用NVIDIA提供的自动驱动程序检测来试一下吧：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_9.png" width="567" height="96" /> </p>  <p>结果还是没有找到兼容的驱动程序，出现如下提示，意思是叫我去HP的网站上下载相应的驱动程序：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_12.png" width="417" height="163" /> </p>  <p>我为什么一开始就没有去HP的网站上找驱动呢，因为根据安装Vista的经验，HP的网站上根本就没有该显卡的驱动，但是我还是准备试一下，我打开HP的美国网站，输入产品型号<strong>CQ45-406TX</strong>查找驱动，结果令人失望，没有提供Win7的驱动下载：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_15.png" width="564" height="101" /> </p>  <p>大家觉得很奇怪，我怎么查找<strong>CQ45-406TX</strong>呢？是因为我安装Vista的时候，遍寻CQ40-406TX的显卡驱动不着，无意间找到<strong>CQ45-406TX</strong>的显卡驱动，安装居然能认识这个显卡。</p>  <p>居然不提供Win7的驱动，就再把Vista的驱动下载下来，安装看看能不能认识这个显卡（纯粹是抱侥幸心理），当然，安装没有成功，不能安装在当前的系统下，这下没有辙了，打HP的800，告诉我HP目前不提供Win7的驱动，让我想别的办法。</p>  <p>后来想想，不可能NVIDIA的官方驱动不支持自己的芯片，找不到兼容的驱动，应该是设备的硬件ID不在安装配置文件中，于是找到显卡的硬件ID：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_18.png" width="378" height="146" /> </p>  <p>然后去从NVIDIA下载的驱动的安装配置文件（nvhm.inf）中找，显然找不到。我尝试手动加一条进去，设置成和它相近的其他硬件ID一样的，但是怎么找到与它相近的硬件ID呢，这个时候Vista的驱动派上用场了（没有白下载）：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_21.png" width="648" height="78" /> </p>  <p>和它相近的就是306C103C和306A103C，那就去Win7的驱动的安装信息文件中找这2个硬件ID，运气不错，找到了，于是对照到手工加上一条：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_24.png" width="599" height="58" /> </p>  <p>保存之后运行Setup，呵呵，大功告成，不过，显卡的名字很奇怪，不管它了，等HP出Win7的驱动再说吧，把其他几个不认识设备一起解决了：</p>  <p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/HPCQ40406TXWin7_13F3A/image_27.png" width="325" height="68" /></p><img src="http://www.cnblogs.com/tubo/aggbug/1572971.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/tubo/archive/2009/09/23/1572971.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/23/1572971.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>更改Sql Server数据库的所有者</title><link>http://www.cnblogs.com/tubo/archive/2009/09/16/1568150.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Wed, 16 Sep 2009 15:03:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/16/1568150.html</guid><description><![CDATA[<p>阅读: 10 评论: 0 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-16 23:03 <a href="http://www.cnblogs.com/tubo/archive/2009/09/16/1568150.html" target="_blank">原文链接</a></p><p>今天学到一招，更改sql server数据库中表的所有者：</p> <p>exec&nbsp;&nbsp; sp_msforeachtable&nbsp;&nbsp; 'sp_changeobjectowner&nbsp;&nbsp; ''?'',&nbsp;&nbsp; ''newOwner'''</p><img src="http://www.cnblogs.com/tubo/aggbug/1568150.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/tubo/archive/2009/09/16/1568150.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/16/1568150.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>Failed to retrieve paths under VSTemplate for the specified registry hive</title><link>http://www.cnblogs.com/tubo/archive/2009/09/14/1566654.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Mon, 14 Sep 2009 15:26:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/14/1566654.html</guid><description><![CDATA[<p>阅读: 32 评论: 0 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-14 23:26 <a href="http://www.cnblogs.com/tubo/archive/2009/09/14/1566654.html" target="_blank">原文链接</a></p><p>最近更换开发机的环境,从Windows XP换到Windows 7，结果以前在XP下的一个VS2008的一个插件项目在新环境中编译老是出错：</p> <h3><img title="Answer" alt="Answer" src="http://i2.social.microsoft.com/Forums/resources/images/trans.gif?cver=2.4.1184.0">Failed to retrieve paths under VSTemplate for the specified registry hive</h3> <p>在网上搜索了一番，终于找到一篇文章介绍的解决方案：</p> <p>运行Vs2008 SDK-〉Tools-〉Reset the Microsoft Visual Studio 2008 SP1 Experimental hive</p> <p>然后重新编译就OK了。</p><img src="http://www.cnblogs.com/tubo/aggbug/1566654.html?type=1" width="1" height="1" alt=""/><p>评论: 0　<a href="http://www.cnblogs.com/tubo/archive/2009/09/14/1566654.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/14/1566654.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>PostSharp应用：延迟加载（二）</title><link>http://www.cnblogs.com/tubo/archive/2009/09/09/1562933.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Tue, 08 Sep 2009 17:23:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/09/1562933.html</guid><description><![CDATA[<p>阅读: 1555 评论: 6 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-09 01:23 <a href="http://www.cnblogs.com/tubo/archive/2009/09/09/1562933.html" target="_blank">原文链接</a></p><p>　　在<a href="http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html">上一篇</a>文章中简单介绍了没有使用AOP情况下如何来实现延迟加载的，并给出了一个使用了AOP实现延迟加载后的代码效果。这篇文章就来介绍如何用PostSharp来达到这种效果。</p>
<p>　　PostSharp是在编译的时候将代码织入到你的代码中的，它是一个VisualStudio的插件，所以必须安装才能使用，去<a href="http://www.postsharp.org/download">官方网站下载</a>后安装，就可以开始你的PostSharp之旅了。</p>
<p>　　PostSharp可以对类、类的方法、类的字段等进行拦截，而延迟加载主要是对类的属性进行拦截，C#类的属性编译后就是set和get方法，我们可以对这些方法进行拦截达到拦截属性的目的，还有一种方法就是对属性对应的字段进行拦截来达到对属性的拦截，我们就是采用的对字段进行拦截的方法：</p>
<p>首先我们要引用PostSharp.Laos和PostSharp.Public，并添加相应的using语句到代码中：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">using</span> PostSharp.Laos;</pre>
<p>在字段上进行拦截，我们的Attribute需要继承自OnFieldAccessAspect这个抽象类（我们的Attribute类必须是可序列化的）:</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    [Serializable]
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> LazyLoadFieldAttribute : OnFieldAccessAspect
    {
        ....
    }</pre>
<p>仔细观察上一篇文章中以前的延迟加载的实现方式，最主要的东西就是那个委托，委托最终会被赋值为一个获取某个属性值的方法，在AOP的延迟加载中也需要这样一个方法，这个方法（名）需要通过Attribute的参数传入，光有方法名还不够，需要知道这个方法在哪个程序集的哪个类中，所以还需要传入方法所在类的FullName（包含程序集的名称），于是构造函数就如下：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    [Serializable]
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> LazyLoadFieldAttribute : OnFieldAccessAspect
    {
        <span style="color: #0000ff">string</span> lazyLoadMethodName;
        <span style="color: #0000ff">string</span> typeFullName;
        <span style="color: #0000ff">public</span> LazyLoadFieldAttribut(<span style="color: #0000ff">string</span> lazyLoadMethodName, <span style="color: #0000ff">string</span> typeFullName)
        {
            <span style="color: #0000ff">this</span>.lazyLoadMethodName = lazyLoadMethodName;
            <span style="color: #0000ff">this</span>.typeFullName = typeFullName;
        }
    }</pre>
<p>看到这里大家已经猜出来了吧？是的，我们要通过反射来调用获取属性值的延迟加载方法（在这里我们不讨论反射的性能问题，我在这里只是介绍使用PostSharp解决延迟加载的方法）。</p>
<p>OnFieldAccessAspect提供了2个操作字段值的方法：OnGetValue和OnSetValue，通过对这2个方法的重载我们就可以对字段值进行拦截了，这2个方法接收一个声明为FieldAccessEventArgs的参数，FieldAccessEventArgs有如下的属性：</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="FieldAccessEventArgs" border="0" alt="FieldAccessEventArgs" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/PostSharp_8B3/FieldAccessEventArgs_1.png" width="763" height="279" /> </p>
<p>我们将通过这些属性来获取需要延迟加载的类的信息以及实例等。</p>
<p>先来看看比较简单一点的OnSetValue的实现：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> OnSetValue(FieldAccessEventArgs eventArgs)
        {
            eventArgs.StoredFieldValue = eventArgs.ExposedFieldValue;
        }</pre>
<p>在这里ExposedFieldValue可以理解为我们要赋给字段的值，而StoredFieldValue就是当前字段保存的值，OnSetValue只是简单地把ExposedFieldValue赋给了StoredFieldValue。OnGetValue的实现：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> OnGetValue(FieldAccessEventArgs eventArgs)
        {
            <span style="color: #0000ff">if</span> (eventArgs.StoredFieldValue == <span style="color: #0000ff">null</span>)
            {
                eventArgs.StoredFieldValue = LazyLoadValue(lazyLoadMethodName, typeFullName, eventArgs.Instance);
            }
            eventArgs.ExposedFieldValue = eventArgs.StoredFieldValue;
        }</pre>
<p>也很简单，判断字段保存的值是否为null（这里主要是为了讲原理，简单化了，实际上如果是集合或者数组，还要判断他们是否为空），如果为null则通过LazyLoadValue去获取值，而LazyLoadValue就是通过反射用当前的实例（eventArgs.Instance）作为参数去调用lazyLoadMethodName指定的方法。</p>
<p>　　看起来很不错吧，但是等等，我们好像漏掉了什么？是的，被你发现了，当我们从数据源获取出来的值本来就是null，那不是每次都要去调用LazyLoadValue这个方法？对照以前的延迟加载的实现，我们发现少了一个isLoaded的属性，用来表明已经加载过了，不管是否为null，都不需要去数据源加载了。如何解决呢？不可能在类的定义里面去为每一个需要延迟加载的属性都声明一个isLoaded的字段吧，那代码看起来就不优雅了。</p>
<p>　　我首先想到的是不能在类里面在直接声明，那么是否可以用织入的方式为类增加一些isLoaded的字段呢，可以我找了很久都没有找到PostSharp在类里面织入字段的方法。后来考虑到如果在类里面声明一系列的isLoaded字段不雅观，那就用一个List来保存字段名表明那些字段已经加载过了（List&lt;string&gt; IsLoadedFieldList）列表中有的就是加载过了，没有的就没有加载，这样就只有一个字段，比许多isLoaded看起来要舒服点。最终我也放弃了这种做法，因为CompositionAspect出场了：</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="CompositionAspect" border="0" alt="CompositionAspect" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/PostSharp_8B3/CompositionAspect_1.png" width="726" height="98" /> </p>
<p>通过它，你可以给你的类增加一个接口实现，我不能在类里面直接织入一个IsLoadedFieldList字段，可以定义一个接口包含IsLoadedFieldList，然后你的类&#8220;实现&#8221;这个接口，当然不是你&#8220;显示&#8221;实现，而是PostSharp织入：</p>
<p>首先定义一个接口：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    <span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span> ILazyLoadable
    {
        List&lt;<span style="color: #0000ff">string</span>&gt; IsLoadedList { <span style="color: #0000ff">get</span>; }
    }</pre>
<p>为这个接口提供一个默认实现：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    <span style="color: #0000ff">internal</span> <span style="color: #0000ff">class</span> LazyLoadImplementation : ILazyLoadable
    {
        List&lt;<span style="color: #0000ff">string</span>&gt; isLoadedList = <span style="color: #0000ff">new</span> List&lt;<span style="color: #0000ff">string</span>&gt;();
        <span style="color: #0000ff">public</span> List&lt;<span style="color: #0000ff">string</span>&gt; IsLoadedList
        {
            <span style="color: #0000ff">get</span> { <span style="color: #0000ff">return</span> isLoadedList; }
        }
    }</pre>
<p>然后就是LazyLoadClassAttribute，这个Attribute是用在类上的：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    [Serializable]
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> LazyLoadClassAttribute : CompositionAspect
    {
        <span style="color: #0000ff">public</span> LazyLoadClassAttribute()
        {
        }
        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">object</span> CreateImplementationObject(InstanceBoundLaosEventArgs eventArgs)
        {
            <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> LazyLoadImplementation();
        }

        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> Type GetPublicInterface(Type containerType)
        {
            <span style="color: #0000ff">return</span> <span style="color: #0000ff">typeof</span>(ILazyLoadable);
        }
    }</pre>
<p>这样就需要对LazyLoadFieldAttribute的OnGetValue和OnSetValue做一点点修改：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> OnGetValue(FieldAccessEventArgs eventArgs)
        {
            <span style="color: #0000ff">string</span> fieldName = eventArgs.FieldInfo.Name;
            ILazyLoadable isLoaded = eventArgs.Instance <span style="color: #0000ff">as</span> ILazyLoadable;
            <span style="color: #0000ff">if</span> (isLoaded != <span style="color: #0000ff">null</span>)
            {
                <span style="color: #0000ff">if</span> (eventArgs.StoredFieldValue == <span style="color: #0000ff">null</span> &amp;&amp; !isLoaded.IsLoadedFieldList.Contains(fieldName))
                {
                    eventArgs.StoredFieldValue = LazyLoadValue(lazyLoadMethodName, typeFullName, eventArgs.Instance);
                    isLoaded.IsLoadedFieldList.Add(fieldName);
                }
            }
            eventArgs.ExposedFieldValue = eventArgs.StoredFieldValue;
        }

        <span style="color: #0000ff">public</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> OnSetValue(FieldAccessEventArgs eventArgs)
        { 
            <span style="color: #0000ff">string</span> fieldName = eventArgs.FieldInfo.Name;
            ILazyLoadable isLoaded = eventArgs.Instance <span style="color: #0000ff">as</span> ILazyLoadable;
            <span style="color: #0000ff">if</span> (isLoaded != <span style="color: #0000ff">null</span>)
            {
                <span style="color: #0000ff">if</span> (!isLoaded.IsLoadedFieldList.Contains(fieldName))
                {
                    isLoaded.IsLoadedFieldList.Add(fieldName);
                }
            }
            eventArgs.StoredFieldValue = eventArgs.ExposedFieldValue;
        }</pre>
<p>一个简单的延迟加载完成了。</p>
<p>&nbsp;</p>
<p>ps：写文章真累，有点虎头蛇尾了，太困了。</p><img src="http://www.cnblogs.com/tubo/aggbug/1562933.html?type=1" width="1" height="1" alt=""/><p>评论: 6　<a href="http://www.cnblogs.com/tubo/archive/2009/09/09/1562933.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/09/1562933.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>PostSharp应用：延迟加载（一）</title><link>http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Mon, 07 Sep 2009 16:33:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html</guid><description><![CDATA[<p>阅读: 1961 评论: 10 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-08 00:33 <a href="http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html" target="_blank">原文链接</a></p><h1></h1> <h1>PostSharp简介</h1> <p>引用<a href="http://www.postsharp.org/">PostSharp</a>官方网站上的介绍：</p> <blockquote style="padding-bottom: 15px; padding-left: 45px; padding-right: 15px; background: url(https://fe3uwa.bay.livefilestore.com/y1mk8zo5OHrypJbOxSljtWYu78Lbm8HgBLCkKMoe4rFo_sbj-WSe0ChFzy8pXLnoRdJDYXydXodjlhMuBml7xcOMSCqhV4Ogw19gO3oa4GNOWNk2ua_PCr8JY8DlVF8dLOUmIzOG7eq5qOnee7_85lviw/bq.gif) #ffffff no-repeat"> <p>PostSharp is a tool that can <strong>reduce the number of lines of code </strong>and <strong>improve its logical decoupling</strong>. Therefore its helps you delivering higher stability, cleaner design, and cheaper source code maintenance.</p></blockquote> <p>PostSharp是一个AOP框架，一个静态的AOP框架，它是在编译的时候把代码织入到您的代码中的。它是通过Attribute来标记需要静态织入代码的方法、成员以及类。PostSharp安装完成后，可以浏览它自带的例子来进行学习，我们这篇文章用它来做一个延迟加载的机制：</p> <p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/PostSharp_E5AF/image_3.png" width="747" height="548"> </p> <p>&nbsp;</p> <h1>延迟加载</h1> <p>　　延迟加载简单地说，就是当你从数据库中加载一个对象的时候，该对象的属性并不是所有的都一次加载到内存中，有些属性需要用到的时候才从数据库中加载，这样可以减少同数据库的通讯量、降低数据库的查询压力（有些属性的获取是需要多表进行join才能获取的）等等。</p> <p>　　先来看看使用AOP之前我的延迟加载的实现方式（c# 2.0），仍然是产品和产品分类类，产品类中的属性Category需要延迟加载：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Category
{
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">int</span> id;
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> name;
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Id
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> id;
        }
        <span style="color: #0000ff">set</span>
        {
            id = <span style="color: #0000ff">value</span>;
        }
    }
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> name;
        }
        <span style="color: #0000ff">set</span>
        {
            name = <span style="color: #0000ff">value</span>;
        }
    }

}

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Product
{
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">int</span> id;
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> name;
    <span style="color: #0000ff">private</span> Category category;
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Id
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> id;
        }
        <span style="color: #0000ff">set</span>
        {
            id = <span style="color: #0000ff">value</span>;
        }
    }
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> name;
        }
        <span style="color: #0000ff">set</span>
        {
            name = <span style="color: #0000ff">value</span>;
        }
    }
    <span style="color: #0000ff">public</span> Category Category
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> category;
        }
        <span style="color: #0000ff">set</span>
        {
            category = <span style="color: #0000ff">value</span>;
        }
    }

}</pre>
<p>1. 先定义2个委托用来获取2个方法，一个是获取单一关联属性，一个是获取列表关联属性的：</p>
<p>&nbsp;</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #008000">//单一关联属性加载</span>
<span style="color: #0000ff">delegate</span> LazyEntity LazyLoadEntity&lt;Entity, LazyEntity&gt;(Entity entity);
<span style="color: #008000">//列表关联属性加载</span>
<span style="color: #0000ff">delegate</span> IList&lt;LazyEntity&gt; LazyLoadList&lt;Entity, LazyEntity&gt;(Entity entity);</pre><br>
<p>2. 修改Product类的定义，增加如下的属性和方法：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">private</span> <span style="color: #0000ff">bool</span> isCategoryLoaded = <span style="color: #0000ff">false</span>;
<span style="color: #0000ff">internal</span> <span style="color: #0000ff">static</span> LazyLoadEntity&lt;Product, Category&gt; LazyLoadCategory;</pre>
<p>并且修改Product的Category的属性的get和set方法：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">    <span style="color: #0000ff">public</span> Category Category
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">if</span>(!isCategoryLoaded &amp;&amp; category == <span style="color: #0000ff">null</span>)
            {
                 <span style="color: #0000ff">if</span>(LazyLoadCategory != <span style="color: #0000ff">null</span>)
                 {
                     category = LazyLoadCategory(<span style="color: #0000ff">this</span>);
                     isCategoryLoaded = <span style="color: #0000ff">true</span>;
                 }
            }
            <span style="color: #0000ff">return</span> category;
        }
        <span style="color: #0000ff">set</span>
        {
            isCategoryLoaded = <span style="color: #0000ff">true</span>;
            category = <span style="color: #0000ff">value</span>;
        }
    }</pre>
<p>3. 在ProductManager类中构建一个根据一个产品的实例获取产品分类的方法并在一个静态的构造函数中赋值给LazyLoadCategory（当时使用的是典型的三层结构，Manager是业务逻辑层，多是静态方法）：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ProductManager
{
    <span style="color: #0000ff">static</span> ProductManager()
    {
        Product.LazyLoadCategory = LazyLoadCategory;
    }

    <span style="color: #0000ff">static</span> Category LazyLoadCategory(Product product)
    {
        ...
    }
}</pre>
<p>从上面可以看到构建一个延迟加载是多么的费事，需要写很多类似的代码，并且这个方法还有一个缺点就是如果你没有访问过ProductManager，那么你的Product的LazyLoadCategory将不会被赋值，你的延迟加载也就失效了。</p>
<h1>引入PostSharp</h1>
<p>引入了AOP之后，我们的延迟加载的代码看起来应该是这个样子的：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">[LazyLoadClass]
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Product
{
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">int</span> id;
    <span style="color: #0000ff">private</span> <span style="color: #0000ff">string</span> name;
    [LazyLoadField("<span style="color: #8b0000">LazyLoadCategoryByProductId</span>", "<span style="color: #8b0000">ProductService,LazyLoadSample</span>")]
    <span style="color: #0000ff">private</span> Category category;
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Id
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> id;
        }
        <span style="color: #0000ff">set</span>
        {
            id = <span style="color: #0000ff">value</span>;
        }
    }
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> name;
        }
        <span style="color: #0000ff">set</span>
        {
            name = <span style="color: #0000ff">value</span>;
        }
    }
    <span style="color: #0000ff">public</span> Category Category
    {
        <span style="color: #0000ff">get</span>
        {
            <span style="color: #0000ff">return</span> category;
        }
        <span style="color: #0000ff">set</span>
        {
            category = <span style="color: #0000ff">value</span>;
        }
    }

}</pre>是的，很简单，在类上标记[LazyLoadClass]，然后再在需要延迟加载的属性对应的字段上标记[LazyLoadField(&#8230;)]就可以了，如何实现的呢？ 
 <img src="http://www.cnblogs.com/tubo/aggbug/1562205.html?type=1" width="1" height="1" alt=""/><p>评论: 10　<a href="http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/08/1562205.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>ExtJs实践:支持返回Json格式的ComboBox</title><link>http://www.cnblogs.com/tubo/archive/2009/09/07/1561811.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Mon, 07 Sep 2009 06:38:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/09/07/1561811.html</guid><description><![CDATA[<p>阅读: 532 评论: 1 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-09-07 14:38 <a href="http://www.cnblogs.com/tubo/archive/2009/09/07/1561811.html" target="_blank">原文链接</a></p><p>假如我们程序中有产品(Product)和产品分类(Category)这2个类，前端使用ExtJs，通过JSON格式同后端进行通讯：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Category
{
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string </span>Id { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
}

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Product
{
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string </span>Id { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
    <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Name { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
    <span style="color: #0000ff">public</span> Category Category { <span style="color: #0000ff">get</span>; <span style="color: #0000ff">set</span>; }
}</pre>
<p>在产品添加页面，会有一个ComboBox来选择产品所属的分类（当然实际工作中产品的Id是不会让用户输入的）：</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/ExtJsJsonComboBox_EA61/image_3.png" width="368" height="159"> </p>
<p>如果使用ExtJs传统的ComboBox：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">        Ext.onReady(<span style="color: #0000ff">function</span>() {
            Ext.QuickTips.init();
            <span style="color: #0000ff">var</span> store = <span style="color: #0000ff">new</span> Ext.data.ArrayStore({
                fields: ['Id', 'Name'],
                data: [['1', '产品分类一'], ['2', '产品分类二']]
            });
            <span style="color: #0000ff">var</span> form = <span style="color: #0000ff">new</span> Ext.FormPanel({
                labelWidth: 75,
                frame: <span style="color: #0000ff">true</span>,
                title: 'ComboBox',
                bodyStyle: 'padding:5px 5px 0',
                width: 350,
                defaults: { width: 230 },
                defaultType: 'textfield',
                items: [
                { fieldLabel: '产品Id',
                    <span style="color: #0000ff">name</span>: 'Id'
                }, { fieldLabel: '产品名称',
                    <span style="color: #0000ff">name</span>: 'Name'
                }, <span style="color: #0000ff">new</span> Ext.form.ComboBox({
                    fieldLabel: '产品分类',
                    <span style="color: #0000ff">name</span>: 'Category',
                    hiddenName:'CategoryId',
                    store: store,
                    displayField: 'Name',
                    mode: 'local',
                    valueField: 'Id'
                })
],
                buttons: [{
                    text: '保存',
                    handler: <span style="color: #0000ff">function</span>() {
                        <span style="color: #0000ff">var</span> values = form.form.getValues();
                        <span style="color: #0000ff">alert</span>(Ext.util.JSON.encode(values));
                    }
                }
]
            });
            form.render(<span style="color: #0000ff">document</span>.body);
        });
</pre>
<p>如果在上面的表单中输入产品Id为&#8220;1&#8221;，产品名称为&#8220;产品1&#8221;，产品类别选择&#8220;产品分类一&#8221;，点击保存按钮，那么将得到一个json格式的字符串如下：</p>
<p><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/ExtJsJsonComboBox_EA61/image_9.png" width="418" height="128"> </p>
<p>即：{"Id&#8220;:"1&#8221;,"Name&#8221;:"产品1&#8221;,"CategoryId&#8221;:"1"}，而这个json字符串传到服务端是不能被完整的反序列化成一个Product的实例的，因为丢失了Category的信息，能够被完整地反序列化成一个Product的json字符串应该是下面这样的：</p>
<p>{"Id&#8220;:"1&#8221;,"Name&#8221;:"产品1&#8221;,"Category&#8221;:{"Id&#8220;:"1&#8221;,"Name&#8221;:"产品分类一"}}<br>那么我们就来改造ExtJs的ComboBox，让它能够返回JSON格式的值，继承Ext的ComboBox，增加一个表明是否是Json格式的属性和两个方法如下：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">JsonComboBox = Ext.extend(Ext.form.ComboBox, {
    isJsonFormat: <span style="color: #0000ff">true</span>,
    getName: <span style="color: #0000ff">function</span>() {
        <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.hiddenName)
            <span style="color: #0000ff">return</span> <span style="color: #0000ff">this</span>.hiddenName;
        <span style="color: #0000ff">return</span> <span style="color: #0000ff">this</span>.<span style="color: #0000ff">name</span>;
    },
    getJson: <span style="color: #0000ff">function</span>() {
        <span style="color: #0000ff">var</span> o = {};
        <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.valueField)
            o[<span style="color: #0000ff">this</span>.valueField] = <span style="color: #0000ff">this</span>.value;
        <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.displayField)
            o[<span style="color: #0000ff">this</span>.displayField] = <span style="color: #0000ff">this</span>.lastSelectionText;
        <span style="color: #0000ff">return</span> o;
    }
});</pre>
<p>同时也要对FormPanel进行如下改造，同样增加一个是否是Json格式的属性和一个获取表单Json格式字符串的方法：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">JsonForm = Ext.extend(Ext.form.FormPanel, {
            isJsonFormat: <span style="color: #0000ff">true</span>,
            getJsonString: <span style="color: #0000ff">function</span>() {
                <span style="color: #0000ff">var</span> f = <span style="color: #0000ff">this</span>;
                <span style="color: #0000ff">var</span> values = f.form.getValues();
                <span style="color: #0000ff">if</span> (<span style="color: #0000ff">this</span>.isJsonFormat === <span style="color: #0000ff">true</span>) {
                    f.items.each(<span style="color: #0000ff">function</span>(c) {
                        <span style="color: #0000ff">if</span> (c.isJsonFormat === <span style="color: #0000ff">true</span>) {
                            values[c.getName()] = c.getJson();
                        }
                    }, f);
                }
                <span style="color: #0000ff">var</span> data = Ext.util.JSON.encode(values);
                <span style="color: #0000ff">return</span> data;
            }
        });</pre>
<p>使用方法如下，注意，JsonCombobox只需要定义一个Name属性就可以了：</p><pre style="border-bottom: 1px dashed; border-left: #6ce26c 5px solid; border-top: 1px dashed; border-right: 1px dashed">        Ext.onReady(<span style="color: #0000ff">function</span>() {
            Ext.QuickTips.init();
            <span style="color: #0000ff">var</span> store = <span style="color: #0000ff">new</span> Ext.data.ArrayStore({
                fields: ['Id', 'Name'],
                data: [['1', '产品分类一'], ['2', '产品分类二']]
            });
            <span style="color: #0000ff">var</span> form = <span style="color: #0000ff">new</span> JsonForm({
                labelWidth: 75,
                frame: <span style="color: #0000ff">true</span>,
                title: 'JsonComboBox',
                bodyStyle: 'padding:5px 5px 0',
                width: 350,
                defaults: { width: 230 },
                defaultType: 'textfield',
                items: [
                { fieldLabel: '产品Id',
                    <span style="color: #0000ff">name</span>: 'Id'
                }, { fieldLabel: '产品名称',
                    <span style="color: #0000ff">name</span>: 'Name'
                }, <span style="color: #0000ff">new</span> JsonComboBox({
                    fieldLabel: '产品分类',
                    <span style="color: #0000ff">name</span>: 'Category',
                    store: store,
                    displayField: 'Name',
                    mode: 'local',
                    valueField: 'Id'
                })
],
                buttons: [{
                    text: '保存',
                    handler: <span style="color: #0000ff">function</span>() {
                        <span style="color: #0000ff">var</span> values = form.getJsonString();
                        <span style="color: #0000ff">alert</span>(values);
                    }
                }
]
            });
            form.render(<span style="color: #0000ff">document</span>.body);
        });
</pre>
<p>看看字符串是不是我们需要的格式：</p>
<p><img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/tubo/WindowsLiveWriter/ExtJsJsonComboBox_EA61/image_15.png" width="581" height="128"> </p>
<p>&nbsp;</p>
<p></p>
<p>转载请注明出处。</p> <img src="http://www.cnblogs.com/tubo/aggbug/1561811.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/tubo/archive/2009/09/07/1561811.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/09/07/1561811.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>ESXi On GA-MA78GM-US2H</title><link>http://www.cnblogs.com/tubo/archive/2009/06/07/1498325.html</link><dc:creator>tubo</dc:creator><author>tubo</author><pubDate>Sun, 07 Jun 2009 15:24:00 GMT</pubDate><guid>http://www.cnblogs.com/tubo/archive/2009/06/07/1498325.html</guid><description><![CDATA[<p>阅读: 284 评论: 1 作者: <a href="http://www.cnblogs.com/tubo/" target="_blank">tubo</a> 发表于 2009-06-07 23:24 <a href="http://www.cnblogs.com/tubo/archive/2009/06/07/1498325.html" target="_blank">原文链接</a></p><p>配了一台台式机，兼作工作用机和服务器（服务器安装在虚拟机里面），机器的主要配置如下：</p>
<p>CPU：AMD 9650 四核</p>
<p>主板：技嘉GA-MA78GM-US2H(集成显卡)</p>
<p>硬盘：ST 1T 7200RPM</p>
<p>内存：金士顿 2G*4</p>
<p>&nbsp;</p>
<p>因为32位的操作系统不支持4G以上的内存，所以主机操作系统选择了Vista 64位的旗舰版，虚拟机选择VMWare Workstation 6.5，安装完成后（3个2003企业版的虚拟机，虚拟机中的应用程序也已经配置完成），发现内存占用在主机没有开启任何软件的时候已经达到了70%多了，如果再增加一个虚拟机，8G的内存已经不能满足需要了，于是想到了前不久下载的VMWare ESXi 3.5.0 Update 4，就备份了安装好的虚拟机，开始安装ESXi 3.5.0。</p>
<p>因为知道ESXi官方支持的硬件数量有限，特别是这种非服务器主板，抱着试一下的心态直接使用官方的ISO刻盘，安装，果然安装过程中出现了&#8220;不能找到存储设备来安装ESXi 3.5.0的映像&#8221;，安装进行不下去了（在安装过程中，还有几个步骤的<font color="#ff0000">速度非常慢，需要耐心等待</font>，并且有些步骤还要<font color="#ff0000">按键盘任意键</font>才能继续下去）。开始在网上去搜索看看有没有人用这个主板安装成功的例子，还真找到了：<a title="http://www.vm-help.com/forum/viewtopic.php?f=8&amp;t=39" href="http://www.vm-help.com/forum/viewtopic.php?f=8&amp;t=39">http://www.vm-help.com/forum/viewtopic.php?f=8&amp;t=39</a>&nbsp; 在这篇文章中下载作者给出的oem.tgz并且再按照这篇文章 <a title="updating-vmware-esxi-disk-dump-file" href="http://www.grid.org/blog/cameron/updating-vmware-esxi-disk-dump-file">updating-vmware-esxi-disk-dump-file</a>重新制作ISO文件刻盘进行安装，安装的过程仍是非常耗时，好不容易安装好之后，重新启动过程中也是非常耗时（同安装过程一样，主要是在加载usb模块、ahci模块处耗时，并且要等待按键才能继续），终于启动完成，按F2进入配置页面，配置好网络，然后在客户端机器上用浏览器下载管理客户端（VI Client），安装连接都很正常，只是隔一会会重新连接，用ping查看，发现丢包非常严重，不知道什么原因，后来还蓝屏了（安装ESXi的机器）。</p>
<p>于是上VMWare的网站去看看有没有什么补丁需要安装的，结果发现ESXi已经发布4.0了，下载了下来，同时上网搜索4.0的oem.tgz，去发现了这篇文章<a title="http://www.vm-help.com/esx40i/Hardware_support.php" href="http://www.vm-help.com/esx40i/Hardware_support.php">http://www.vm-help.com/esx40i/Hardware_support.php</a>，从上面可以看到ESXi4.0已经官方支持这块主板的SATA控制器了，只是集成网卡还不支持，从列表中查找支持的网卡控制芯片，发现Intel Pro 1000 GT是被支持的，于是去买了一块Intel pro 1000GT安装上，并禁用了主板上集成的网卡。直接使用官方网站的ISO刻盘安装，安装过程仍是非常漫长和需要人为干预（同ESXi 3.5一样），安装完成后重新启动的过程还是漫长，设置好IP地址，ping发现丢包还是非常严重。在网上搜索了一下，没有找到答案。既然是加载usb模块的时候时间长，如果把主板上的usb禁用是不是会有所改变呢，进bios里面，将不需要用得板载端口全部禁用：USB、IDE（已经安装完成，光驱也不需要了）、并口、串口等，再次重新启动，速度很快了，ping也不掉包了。后来又进bios里面将usb控制打开，没有再出现问题了，其他几个端口还没有时间测试。<br /><br />后记:<br />后来又测试了一下,发现之需要关掉AMD的冷又静就好了</p><img src="http://www.cnblogs.com/tubo/aggbug/1498325.html?type=1" width="1" height="1" alt=""/><p>评论: 1　<a href="http://www.cnblogs.com/tubo/archive/2009/06/07/1498325.html#pagedcomment" target="_blank">查看评论</a>　<a href="http://www.cnblogs.com/tubo/archive/2009/06/07/1498325.html#commentform" target="_blank">发表评论</a></p><p><a href="http://job.cnblogs.com/" target="_blank">找优秀程序员，就在博客园</a></p><hr/><p>最新新闻：<br/>· <a href="http://news.cnblogs.com/n/59143/" target="_blank">阮一峰：Unix版权史</a><span style="color:gray">(2010-03-19 12:30)</span><br/>· <a href="http://news.cnblogs.com/n/59139/" target="_blank">解谜Facebook CEO的进化之路</a><span style="color:gray">(2010-03-19 12:00)</span><br/>· <a href="http://news.cnblogs.com/n/59138/" target="_blank">Google测试新搜索页面：增加用户位置信息</a><span style="color:gray">(2010-03-19 11:44)</span><br/>· <a href="http://news.cnblogs.com/n/59137/" target="_blank">分析称Digg将引领社会化新闻发展趋势</a><span style="color:gray">(2010-03-19 11:40)</span><br/>· <a href="http://news.cnblogs.com/n/59136/" target="_blank">Google全面升级Chrome浏览器 发安全更新补丁</a><span style="color:gray">(2010-03-19 11:37)</span><br/></p><p>编辑推荐：<a href="http://news.cnblogs.com/n/59093/" target="_blank">[视频]想做你的Code</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>