<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Timothy&#039;s Space &#187; .NET开发</title>
	<atom:link href="http://www.xiaozhou.net/category/dotnetdevelopment/feed" rel="self" type="application/rss+xml" />
	<link>http://www.xiaozhou.net</link>
	<description>君看一叶舟，出没风波里</description>
	<lastBuildDate>Tue, 27 Jul 2010 01:00:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Visual Studio 2010 尝鲜</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/a_taste_of_visual_studio_2010-2010-04-13.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/a_taste_of_visual_studio_2010-2010-04-13.htm#comments</comments>
		<pubDate>Tue, 13 Apr 2010 09:07:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[Studio]]></category>
		<category><![CDATA[Ultimate]]></category>
		<category><![CDATA[Visual]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/visual-studio-2010-%e5%b0%9d%e9%b2%9c-2010-04-13.htm</guid>
		<description><![CDATA[昨晚在群里看到同事的讨论，MSDN终于放出Visual Studio 2010 RTM下载了(下文简称VS2010)。早上上班看到这个消息很是激动，迫不及待的去MSDN把期待已久的VS2010给拖了下来。VS2010和以往发布的版本不一样，这次划分为三个版本：Professional、Premium、Ultimate。 俺比较贪心，要用就用最高版本，拖了个Ultimate旗舰版，ISO镜像总共2.2GB，其实跟以往的VS2008相比，也不算大。 下面是VS2010中的新增特性(网上copy过来的)： ·对多显示器的支持 ·支持调用继承树 ·新特性支持TDD ·新特性支持Office开发 ·全新的Quick Search功能 ·Call hierarchy高亮对象的引用 ·直接使用一个未定义的对象 ·提供更方便的javascript脚本编写 ·HTML snippets超越智能提示 ·可以进行自定义开始页 ·C# 4.0的语言新特性 ·提升了SharePoint开发功能 ·特性聚焦：分析和调试并行应用程序 ·正式包含F#函数式语言 下载完后，迫不及待开始安装： 和期望比较不一样的是，安完需要的组件，供占5个多GB的硬盘空间，还是比较苗条了。选完需要安装的组件，俺很慎重的按下了Install按钮…… 漫长的安装过程，中途机器重启了两次，一次是在.NET Framework 4.0安装过后，一次是在整体安装完毕过后。 安装完毕，俺怀着激动的心情，启动了VS2010，跳出不规则的Splash Window. 整体使用感觉相当不错，此前还担心WPF实现的IDE界面会拖慢运行速度，看来这样的担心是多余的。跟VS2008相比，感觉VS2010的反应速度会快很多。看来这方面的优化还是做足了功夫的。另外，令人满意的是VS2010的扩展功能，内置的Extention Manager能够看到很多的在线扩展，选择你想要的，可以在线安装和卸载。这种方式让VS2010的扩展更加丰富和强大，值得表扬！ 另外，还有很多的关于.NET Framework 4.0 以及 VS2010的新特性还没来得及体验，比如dynamic，并行编程，新版的ADO.NET Entity Framework，新引入的F#语言，等等…… 无意中也发现，ReSharper 5.0 也随着VS2010的发布而发布了，看来步调相当一致啊~这款功能强大的工具，自从VS2005开始，俺就一直用，现在不装反而不习惯了。于是卸掉之前的ReSharper 4.5，升级到5.0版。ReSharper 5.0本身也支持VS2008和VS2010，这样机器上的两个IDE可以和谐共存，并同时使用ReSharpter 5.0，简直太完美了。 总体感觉：VS2010和VS2008相比，确实是一大进步，或者说，确实是个飞跃…… 打算用段时间就把VS2008从机器中清理掉，嘿嘿…… 你可能也对下列文章感兴趣2009年05月26日 -- Visual Studio 2010 Beta1 is [...]]]></description>
			<content:encoded><![CDATA[<p>昨晚在群里看到同事的讨论，MSDN终于放出Visual Studio 2010 RTM下载了(下文简称VS2010)。早上上班看到这个消息很是激动，迫不及待的去MSDN把期待已久的VS2010给拖了下来。VS2010和以往发布的版本不一样，这次划分为三个版本：Professional、Premium、Ultimate。<br />
俺比较贪心，要用就用最高版本，拖了个Ultimate旗舰版，ISO镜像总共2.2GB，其实跟以往的VS2008相比，也不算大。</p>
<p>下面是VS2010中的新增特性(网上copy过来的)：<br />
·对多显示器的支持<br />
·支持调用继承树<br />
·新特性支持TDD<br />
·新特性支持Office开发<br />
·全新的Quick Search功能<br />
·Call hierarchy高亮对象的引用<br />
·直接使用一个未定义的对象<br />
·提供更方便的javascript脚本编写<br />
·HTML snippets超越智能提示<br />
·可以进行自定义开始页<br />
·C# 4.0的语言新特性<br />
·提升了SharePoint开发功能<br />
·特性聚焦：分析和调试并行应用程序<br />
·正式包含F#函数式语言</p>
<p>下载完后，迫不及待开始安装：<br />
<a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/1.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0pt none;" title="1" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/1_thumb.jpg" border="0" alt="1" width="461" height="356" /></a><br />
<a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/2.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0pt none;" title="2" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/2_thumb.jpg" border="0" alt="2" width="463" height="356" /></a> 和期望比较不一样的是，安完需要的组件，供占5个多GB的硬盘空间，还是比较苗条了。选完需要安装的组件，俺很慎重的按下了Install按钮……<br />
<a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/3.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0pt none;" title="3" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/3_thumb.jpg" border="0" alt="3" width="464" height="358" /></a><br />
漫长的安装过程，中途机器重启了两次，一次是在.NET Framework 4.0安装过后，一次是在整体安装完毕过后。</p>
<p><a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/4.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0pt none;" title="4" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/4_thumb.jpg" border="0" alt="4" width="460" height="356" /></a>安装完毕，俺怀着激动的心情，启动了VS2010，跳出不规则的Splash Window.<a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/6.jpg"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" title="6" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/6_thumb.jpg" border="0" alt="6" width="548" height="387" /></a></p>
<p>整体使用感觉相当不错，此前还担心WPF实现的IDE界面会拖慢运行速度，看来这样的担心是多余的。跟VS2008相比，感觉VS2010的反应速度会快很多。看来这方面的优化还是做足了功夫的。另外，令人满意的是VS2010的扩展功能，内置的Extention Manager能够看到很多的在线扩展，选择你想要的，可以在线安装和卸载。这种方式让VS2010的扩展更加丰富和强大，值得表扬！</p>
<p><a href="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/image.png"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border: 0px;" title="image" src="http://www.xiaozhou.net/pics/VisualStudio2010_E8ED/image_thumb.png" border="0" alt="image" width="644" height="446" /></a>另外，还有很多的关于.NET Framework 4.0 以及 VS2010的新特性还没来得及体验，比如dynamic，并行编程，新版的ADO.NET Entity Framework，新引入的F#语言，等等……<br />
无意中也发现，<a href="http://www.jetbrains.com/resharper/" target="_blank">ReSharper 5.0</a> 也随着VS2010的发布而发布了，看来步调相当一致啊~这款功能强大的工具，自从VS2005开始，俺就一直用，现在不装反而不习惯了。于是卸掉之前的ReSharper 4.5，升级到5.0版。ReSharper 5.0本身也支持VS2008和VS2010，这样机器上的两个IDE可以和谐共存，并同时使用ReSharpter 5.0，简直太完美了。</p>
<p>总体感觉：VS2010和VS2008相比，确实是一大进步，或者说，确实是个飞跃…… 打算用段时间就把VS2008从机器中清理掉，嘿嘿……</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年05月26日 -- <a href="http://www.xiaozhou.net/ittech/software/visual-studio-2010-beta1-is-available-for-download-2009-05-26.htm" title="Visual Studio 2010 Beta1 is available for download">Visual Studio 2010 Beta1 is available for download</a> (0)</li><li>2009年07月13日 -- <a href="http://www.xiaozhou.net/ittech/software/visual-studio-ide-color-scheme-2009-07-13.htm" title="Visual Studio IDE配色方案">Visual Studio IDE配色方案</a> (9)</li><li>2010年02月13日 -- <a href="http://www.xiaozhou.net/essay/happy_new_year_2010-2-2010-02-13.htm" title="Happy New Year！2010">Happy New Year！2010</a> (20)</li><li>2010年01月4日 -- <a href="http://www.xiaozhou.net/essay/happy_new_year_2010-2010-01-04.htm" title="Happy New Year 2010 &amp; 2009回顾">Happy New Year 2010 &amp; 2009回顾</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/a_taste_of_visual_studio_2010-2010-04-13.htm/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>扩展方法收集&#8211;实体验证</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm#comments</comments>
		<pubDate>Sun, 17 Jan 2010 14:31:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[Entity]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>
		<category><![CDATA[Validation]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95%e6%94%b6%e9%9b%86-%e5%ae%9e%e4%bd%93%e9%aa%8c%e8%af%81-2010-01-17.htm</guid>
		<description><![CDATA[关于实体验证，是早期在博客园看到一个同学的文章，里面利用扩展方法对实体进行验证的思路比较有创意。大家可以先跳过去先看一下：http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html 这个实体验证的扩展方法，设计比较巧妙，充分利用了链式编程的特点，让代码更加简洁和美观，唯一不足的地方是后来作者在改进的时候感觉不是很到位。于是偶的同事Rex同学，对这实体验证的扩展方法进行了改进，在我看来，应该算是比较完美的解决方法了，因此在我们的实际项目中，也比较大量的应用到了此扩展方法。在这里贴出来，给大家分享一下。 贴代码： ?View Code CSHARP1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [...]]]></description>
			<content:encoded><![CDATA[<p>关于实体验证，是早期在博客园看到一个同学的文章，里面利用扩展方法对实体进行验证的思路比较有创意。大家可以先跳过去先看一下：<a href="http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html">http://www.cnblogs.com/tristanguo/archive/2009/05/15/1457197.html</a><br />
这个实体验证的扩展方法，设计比较巧妙，充分利用了链式编程的特点，让代码更加简洁和美观，唯一不足的地方是后来作者在改进的时候感觉不是很到位。于是偶的同事<a href="http://xzwplus.cnblogs.com/" target="_blank">Rex</a>同学，对这实体验证的扩展方法进行了改进，在我看来，应该算是比较完美的解决方法了，因此在我们的实际项目中，也比较大量的应用到了此扩展方法。在这里贴出来，给大家分享一下。<br />
贴代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p498code3'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4983"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
</pre></td><td class="code" id="p498code3"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Collections.Generic</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> CommonLib
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">class</span> EntityValidator
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> ValidateResult Validate<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> T target,
                                              Predicate predicate,
                                              <span style="color: #6666cc; font-weight: bold;">string</span> errorMessage<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            var result <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> ValidateResult<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>predicate<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                result<span style="color: #008000;">.</span><span style="color: #0000FF;">Errors</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>errorMessage<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> result<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> ValidateResult Validate<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> ValidateResult target,
                                              Predicate predicate,
                                              <span style="color: #6666cc; font-weight: bold;">string</span> errorMessage<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #008000;">!</span>predicate<span style="color: #008000;">&#40;</span>target<span style="color: #008000;">.</span><span style="color: #0000FF;">Entity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                target<span style="color: #008000;">.</span><span style="color: #0000FF;">Errors</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Add</span><span style="color: #008000;">&#40;</span>errorMessage<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">return</span> target<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
&nbsp;
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> ValidateResult
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">internal</span> List Errors <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">internal</span> T Entity <span style="color: #008000;">&#123;</span> get<span style="color: #008000;">;</span> <span style="color: #0600FF; font-weight: bold;">private</span> set<span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">bool</span> HasErrors
        <span style="color: #008000;">&#123;</span>
            get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Errors<span style="color: #008000;">.</span><span style="color: #0000FF;">Count</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">internal</span> ValidateResult<span style="color: #008000;">&#40;</span>T entity<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Errors <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> List<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Entity <span style="color: #008000;">=</span> entity<span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> ErrorMessages <span style="color: #008000;">&#123;</span> get <span style="color: #008000;">&#123;</span> <span style="color: #0600FF; font-weight: bold;">return</span> Errors<span style="color: #008000;">.</span><span style="color: #0000FF;">ToArray</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008000;">&#125;</span> <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>有了这个实体验证的方法，代码可以简洁多了，并且再也不用在业务逻辑判断中，写入复杂的if…else语句块，取而代之的代码，示例如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p498code4'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4984"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p498code4"><pre class="csharp" style="font-family:monospace;">ValidateResult validateResult <span style="color: #008000;">=</span>
                        content<span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> <span style="color: #008000;">!</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">.</span><span style="color: #0000FF;">IsNullOrEmpty</span><span style="color: #008000;">&#40;</span>c<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span><span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;Name为空&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">MobilePhone</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">11</span> , <span style="color: #666666;">&quot;MobilePhone长度不正确&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Age</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span>, <span style="color: #666666;">&quot;年龄不在规定范围&quot;</span><span style="color: #008000;">&#41;</span>
                               <span style="color: #008000;">.</span><span style="color: #0000FF;">Validate</span><span style="color: #008000;">&#40;</span>c <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&amp;</span>lt<span style="color: #008000;">;=</span> <span style="color: #FF0000;">200</span> <span style="color: #008000;">&amp;</span>amp<span style="color: #008000;">;&amp;</span>amp<span style="color: #008000;">;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&amp;</span>gt<span style="color: #008000;">;=</span> <span style="color: #FF0000;">180</span>, <span style="color: #666666;">&quot;身高不符合标准&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                    <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>validateResult<span style="color: #008000;">.</span><span style="color: #0000FF;">HasErrors</span><span style="color: #008000;">&#41;</span>
                    <span style="color: #008000;">&#123;</span>
                        log<span style="color: #008000;">.</span><span style="color: #0000FF;">Info</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;实体验证失败:&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                        validateResult<span style="color: #008000;">.</span><span style="color: #0000FF;">ErrorMessages</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> log<span style="color: #008000;">.</span><span style="color: #0000FF;">Info</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                        <span style="color: #0600FF; font-weight: bold;">return</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">;</span>
                    <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>怎么样？这样的链式编程的代码，比起一大串的if…else组合语句，简洁、明了多了，并且还可以提高代码阅读的效率，强烈推荐各位同学使用。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年11月14日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm" title="常用扩展方法收集&#038;整理(置顶-不断更新)">常用扩展方法收集&#038;整理(置顶-不断更新)</a> (35)</li><li>2009年09月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm" title="扩展方法使用小结">扩展方法使用小结</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Linq to Sql 之延迟加载与立即加载</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-delay-load-and-immediately-load-2009-12-20.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-delay-load-and-immediately-load-2009-12-20.htm#comments</comments>
		<pubDate>Sun, 20 Dec 2009 14:03:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[DeferredLoadingEnabled]]></category>
		<category><![CDATA[delay]]></category>
		<category><![CDATA[linq]]></category>
		<category><![CDATA[linq2sql]]></category>
		<category><![CDATA[load]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-%e4%b9%8b%e5%bb%b6%e8%bf%9f%e5%8a%a0%e8%bd%bd%e4%b8%8e%e7%ab%8b%e5%8d%b3%e5%8a%a0%e8%bd%bd-2009-12-20.htm</guid>
		<description><![CDATA[Linq的延迟加载 Linq to Sql中默认采用的模式就是延迟执行，所谓延迟执行，其实就是在获取对象本身时，并不会获取和其关联的其他对象，只有在访问其关联对象的时候，程序才会去加载关联对象的数据到内存中。这样的好处是程序不会在初次访问的时候，就加载大批量的数据，而是以一种延迟加载的方式进行处理，相对而言，对于系统和网络的性能开支会减小很多。对于一个默认的Linq to Sql查询，延迟加载就是其默认的设置，不过，在某些情况下，延迟加载并非完全“智能”，不但没有实现其本意，反而增大了网络流量和性能开支。下面我们以SQL Server中的演示数据库NorthWind来试验一下： ?View Code CSHARP1 2 3 4 5 6 7 8 9 10 11 12 13 LinqTestDataContext ctx = new LinqTestDataContext&#40;&#41;; ctx.Log = Console.Out; &#160; var result = ctx.Orders.Where&#40;p =&#38;gt; p.OrderID == 10251&#41;; &#160; foreach &#40;var t in result&#41; &#123; Console.WriteLine&#40;&#38;quot;OrderID:&#38;quot; + t.OrderID + &#38;quot;-&#38;quot; + &#38;quot;OrderDate:&#38;quot; + t.OrderDate.Value.ToString&#40;&#38;quot;yyyy-MM-dd&#38;quot;&#41;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<h3>Linq的延迟加载</h3>
<p>Linq to Sql中默认采用的模式就是延迟执行，所谓延迟执行，其实就是在获取对象本身时，并不会获取和其关联的其他对象，只有在访问其关联对象的时候，程序才会去加载关联对象的数据到内存中。这样的好处是程序不会在初次访问的时候，就加载大批量的数据，而是以一种延迟加载的方式进行处理，相对而言，对于系统和网络的性能开支会减小很多。对于一个默认的Linq to Sql查询，延迟加载就是其默认的设置，不过，在某些情况下，延迟加载并非完全“智能”，不但没有实现其本意，反而增大了网络流量和性能开支。下面我们以SQL Server中的演示数据库NorthWind来试验一下：</p>
<p><a href="http://www.xiaozhou.net/pics/LinqtoSql_DA95/linq_context.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="linq_context" border="0" alt="linq_context" src="http://www.xiaozhou.net/pics/LinqtoSql_DA95/linq_context_thumb.jpg" width="624" height="312" /></a>     </p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code12'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45412"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p454code12"><pre class="csharp" style="font-family:monospace;">LinqTestDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> LinqTestDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Log</span> <span style="color: #008000;">=</span> Console<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Out</span><span style="color: #008000;">;</span>
&nbsp;
var result <span style="color: #008000;">=</span> ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Orders</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderID</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">10251</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var t <span style="color: #0600FF; font-weight: bold;">in</span> result<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
	Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>OrderID<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderID</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>OrderDate<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderDate</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>yyyy<span style="color: #008000;">-</span>MM<span style="color: #008000;">-</span>dd<span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>通过Linq to sql查询所有OrderID为10251的订单信息，并输出订单编号和订单日期。通过显示Linq的日志输出，我们可以看到后台生成的SQL语句如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code13'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45413"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p454code13"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>EmployeeID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>
t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>RequiredDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShippedDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipVia<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Freight<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Sh
ipName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipAddress<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCity<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipRegion<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipPosta
lCode<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCountry<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Orders<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> @p0</pre></td></tr></table></div>

<p>输出的SQL看来还比较正常。下面我们再来改一下我们的程序： </p>
<p></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code14'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45414"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p454code14"><pre class="csharp" style="font-family:monospace;"> <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var t <span style="color: #0600FF; font-weight: bold;">in</span> result<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>OrderID<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> <span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderID</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>OrderDate<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderDate</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>yyyy<span style="color: #008000;">-</span>MM<span style="color: #008000;">-</span>dd<span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span><span style="color: #008000;">&#41;</span> 
		<span style="color: #008000;">+&amp;</span>quot<span style="color: #008000;">;-</span>CustomerName<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span>
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Customer</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ContactName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span>var m <span style="color: #0600FF; font-weight: bold;">in</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Order_Details</span><span style="color: #008000;">&#41;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>ProductID<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>Price<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">UnitPrice</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>Amount<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>出了输出订单相关信息外，还输出其关联对象：客户姓名、订单中的产品编号、单价、数量</p>
<p>再来看看输出的SQL语句：</p>
<p>
  </p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code15'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45415"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p454code15"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>EmployeeID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>
t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>RequiredDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShippedDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipVia<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Freight<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Sh
ipName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipAddress<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCity<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipRegion<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipPosta
lCode<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCountry<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Orders<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> @p0
&nbsp;
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CompanyName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactT
itle<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Address<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>City<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Region<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>PostalCode<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Coun
try<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Phone<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Fax<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Customers<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> @p0
&nbsp;
&nbsp;
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ProductID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>UnitPrice<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Quantity<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Discount<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">Order</span> Details<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> @p0</pre></td></tr></table></div>

<p>我们可以看到，对于我们修改后的代码，程序向数据库请求了三条SQL语句，当然，这还不是最坏的情况，但是我们在这里的确看到延迟加载似乎“变了味道”，不但没有节省开支，反而增大了网络浏览。怎样才能改善这样的情况呢？</p>
<h3>关于立即加载</h3>
<p>其实我们知道，有很多扩展方法会导致延迟加载失效，而开始立即执行。当我们在调用诸如：ToList、ToDictionary、ToLookup或者ToArray之类的扩展方法之后，程序会将最终的结果存放到某个临时的变量集合中，并让所有的数据一次性的加载完成。</p>
<p>另外，还有一种方式，通过设置DataContext的DeferredLoadingEnabled属性为false,显示的关闭默认的延迟加载方式。</p>
<p></p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code16'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45416"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p454code16"><pre class="csharp" style="font-family:monospace;">LinqTestDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> LinqTestDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">DeferredLoadingEnabled</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>&#160;</p>
<p>这些方式虽然比较方便，但是还是有一定的局限性。例如，简单的使用ToList只能解决一些简单的查询问题，而对于复杂的查询需求，ToList还是不能解决延迟取得子对象所引发的多次查询问题。并且，在大量数据被加载到内存中的时候，对内存的需求也是很大的。不过，幸好Linq to sql给我们提供了另外一套不错的方法。</p>
<h3>使用DataLoadOptions实现对加载对象的优化</h3>
<p>Linq to Sql提供DataLoadOptions，用以立即加载关联的对象数据，其中包含两种方法：<br />
  <br />LoadWith方法，用于立即加载与主对象相关联的数据 </p>
<p>AssociateWith方法，用于对关联对象的数据进行筛选，并加载</p>
<p>有了DataLoadOptions，我们就可以用如下的方式优化我们的查询中需要加载的对象：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code17'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45417"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p454code17"><pre class="csharp" style="font-family:monospace;">            LinqTestDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> LinqTestDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Log</span> <span style="color: #008000;">=</span> Console<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Out</span><span style="color: #008000;">;</span>
&nbsp;
            DataLoadOptions dl <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataLoadOptions<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            dl<span style="color: #008000;">.</span><span style="color: #0000FF;">LoadWith</span><span style="color: #008000;">&lt;</span>order<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">Customer</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            dl<span style="color: #008000;">.</span><span style="color: #0000FF;">LoadWith</span><span style="color: #008000;">&lt;</span>order<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">Order_Details</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">LoadOptions</span> <span style="color: #008000;">=</span> dl<span style="color: #008000;">;</span>
&nbsp;
            var result <span style="color: #008000;">=</span> ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Orders</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&amp;</span>gt<span style="color: #008000;">;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderID</span> <span style="color: #008000;">==</span> <span style="color: #FF0000;">10251</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToList</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var t <span style="color: #0600FF; font-weight: bold;">in</span> result<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>OrderID<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> <span style="color: #008000;">+</span> 
		t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderID</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>OrderDate<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">OrderDate</span><span style="color: #008000;">.</span><span style="color: #0000FF;">Value</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ToString</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>yyyy<span style="color: #008000;">-</span>MM<span style="color: #008000;">-</span>dd<span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span><span style="color: #008000;">&#41;</span> 
		<span style="color: #008000;">+&amp;</span>quot<span style="color: #008000;">;-</span>CustomerName<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span>
		<span style="color: #008000;">+</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Customer</span><span style="color: #008000;">.</span><span style="color: #0000FF;">ContactName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span>var m <span style="color: #0600FF; font-weight: bold;">in</span> t<span style="color: #008000;">.</span><span style="color: #0000FF;">Order_Details</span><span style="color: #008000;">&#41;</span>
                Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;</span>ProductID<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>Price<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">UnitPrice</span> 
		<span style="color: #008000;">+</span> <span style="color: #008000;">&amp;</span>quot<span style="color: #008000;">;-</span>Amount<span style="color: #008000;">:&amp;</span>quot<span style="color: #008000;">;</span> 
		<span style="color: #008000;">+</span> m<span style="color: #008000;">.</span><span style="color: #0000FF;">Quantity</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>对于我们开发者而言，需要注意的是，对于同一个DataContext实例，DataLoadOptions只能设定一次，并且一旦设定，就无法更改。</p>
<p>接下来，运行程序，看看优化后，程序向数据库服务器请求的的SQL：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p454code18'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45418"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p454code18"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>EmployeeID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>
t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>RequiredDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShippedDate<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipVia<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Freight<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Sh
ipName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipAddress<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCity<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipRegion<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipPosta
lCode<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ShipCountry<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>OrderID2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ProductID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>UnitPrice<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Quantity<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Discount<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> COUNT<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">*</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">Order</span> Details<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t4<span style="color: #66cc66;">&#93;</span>
    <span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t4<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>value<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>test<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>CustomerID2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Company
Name<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactTitle<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Address<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>City<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2
<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Region<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>PostalCode<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Country<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Phone<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Fax<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Orders<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #66cc66;">&#40;</span>
    <span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>test<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CompanyName<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactName
<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ContactTitle<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Address<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>City<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Region<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Postal
Code<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Country<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Phone<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Fax<span style="color: #66cc66;">&#93;</span>
    <span style="color: #993333; font-weight: bold;">FROM</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>Customers<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t1<span style="color: #66cc66;">&#93;</span>
    <span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span>
<span style="color: #993333; font-weight: bold;">LEFT</span> <span style="color: #993333; font-weight: bold;">OUTER</span> <span style="color: #993333; font-weight: bold;">JOIN</span> <span style="color: #66cc66;">&#91;</span>dbo<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span><span style="color: #993333; font-weight: bold;">Order</span> Details<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span> <span style="color: #993333; font-weight: bold;">ON</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span>
&nbsp;
<span style="color: #993333; font-weight: bold;">WHERE</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span> <span style="color: #66cc66;">=</span> @p0
<span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> <span style="color: #66cc66;">&#91;</span>t0<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>OrderID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t2<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>CustomerID<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">,</span> <span style="color: #66cc66;">&#91;</span>t3<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">.</span><span style="color: #66cc66;">&#91;</span>ProductID<span style="color: #66cc66;">&#93;</span></pre></td></tr></table></div>

<p>可以看出，之前的分三次向数据库提交sql的情况，现在被程序优化为一条带LEFT JOIN的关联查询，而获取关联数据。三次SQL请求，被优化为一次，从而减少了数据库和网络流量开支，由此看来DataLoadOptions的好处不言而喻。</p>
<h3></h3>
<h3>一点小结</h3>
<p>延迟加载与立即加载，并无孰优孰劣之区别，在某些情况下，需要我们根据自己的需求和实际情况来选择来进行选择。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2010年06月19日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/lazy_load_plugin_enabled-2010-06-19.htm" title="启用Lazy Load插件">启用Lazy Load插件</a> (13)</li><li>2004年12月22日 -- <a href="http://www.xiaozhou.net/vcdevelopment/dynamic-loading-and-explicit-pictures-2004-12-22.htm" title="动态加载并显示图片">动态加载并显示图片</a> (0)</li><li>2004年12月20日 -- <a href="http://www.xiaozhou.net/vcdevelopment/dynamic-loading-a-bitmap-2004-12-20.htm" title="动态加载位图">动态加载位图</a> (0)</li><li>2004年10月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/load-images-from-the-file-2004-10-26.htm" title="从文件装载图象">从文件装载图象</a> (0)</li><li>2004年10月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/dynamically-loaded-dll-2004-10-26.htm" title="动态加载DLL">动态加载DLL</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-delay-load-and-immediately-load-2009-12-20.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>开源的作业调度框架：Quartz.NET</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/open_source_job_scheduling_framework_quartz_net-2009-12-05.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/open_source_job_scheduling_framework_quartz_net-2009-12-05.htm#comments</comments>
		<pubDate>Sat, 05 Dec 2009 15:59:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[Quartz.NET]]></category>
		<category><![CDATA[scheduler]]></category>
		<category><![CDATA[sourceforge]]></category>
		<category><![CDATA[trigger]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e5%bc%80%e6%ba%90%e7%9a%84%e4%bd%9c%e4%b8%9a%e8%b0%83%e5%ba%a6%e6%a1%86%e6%9e%b6%ef%bc%9aquartz-net-2009-12-05.htm</guid>
		<description><![CDATA[Quartz.NET是一套开源的作业调度框架，是最初由Java平台的企业级开源作业调度框架 Quartz 移植到.NET平台的。在sourceforge上，Quartz.NET的主页有这样的介绍： Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems. (Quartz.NET是能应用在小到轻量级的应用程序，大到重量级的企业级系统中的全功能的开源任务调度系统)并且，值得令人信服的是，Quartz.NET已经在生产环境中得以用，并得到了良好的反馈。 回想一下，在小到普通的应用程序，大到企业级项目中，我们常常会遇到需要定时轮询和调度的场景，简单点的需求是每隔固定的秒数或者分钟、小时进行轮询，复杂点的是每周的某个时刻，或者每月，或者每年才执行一次，又或者更复杂的情景，某些天需要执行，某些天不执行。用Windows自带的计划任务，能够实现简单的逻辑，如果要用程序实现这样的逻辑，想必也很复杂了。其实，用Quartz能很好的应付这些情况。 Quartz.NET的核心模块分为几个部分，Scheduler、Job、JobDetail、Trigger Scheduler:实现调度的主体，负责调度任务的开始、结束，Scheduler中包含已注册的JobDetail和Trigger,并且，当Trigger中的条件得以触发时，Scheduler负责执行和Trigger相关联的Job，实现任务的调度。 Job:需要被调度的任务，Job必须实现IJob接口的Execute方法，而Execute方法的内容，其实也就是我们需要根据不同的需求自己实现的业务逻辑。 JobDetail:包含对Job的具体描述，包括Job的名称、所属的Group名称、以及Job的Type描述，用以Quartz.NET通过反射实现对Job的调用。 Trigger:触发器，描述调度的触发条件和时机。 Quartz.NET之所以没把Job和Trigger设计在一起，而是采用一种松耦合的方式，把Job和Trigger独立为两个不同的对象，原因是因为在Quartz.NET中，Job和Trigger可以建立一种一对多的关系，也就是可以对一个调度任务绑定多个Trigger，另外的好处是当某个Job的Trigger过期的时候，可以直接为Job绑定新的Trigger而不用重新定义和这个Trigger相关联的Job。 最初见到Quartz.NET，还是0.6的版本，一直躺在偶的硬盘里面，直到最近项目中遇到很多需要定时轮询处理的情况，突然想到了Quartz.NET，打开它在sourceforge的大本营，才发现Quartz.NET已经更新到1.0.1版本了。 Quartz.NET为我们提供了简洁的API，通过简单的例子，我们就可以很快上手和使用 在Quartz.NET中，所有的Job都必须实现IJob接口： ?View Code CSHARP1 2 3 4 5 6 7 namespace Quartz &#123; public interface IJob &#123; void Execute&#40;JobExecutionContext context&#41;; &#125; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://quartznet.sourceforge.net/" target="_blank">Quartz.NET</a>是一套开源的作业调度框架，是最初由Java平台的企业级开源作业调度框架 <a href="http://www.quartz-scheduler.org/" target="_blank">Quartz</a> 移植到.NET平台的。在sourceforge上，Quartz.NET的主页有这样的介绍： Quartz.NET is a full-featured, open source job scheduling system that can be used from smallest apps to large scale enterprise systems. (Quartz.NET是能应用在小到轻量级的应用程序，大到重量级的企业级系统中的全功能的开源任务调度系统)并且，值得令人信服的是，Quartz.NET已经在生产环境中得以用，并得到了良好的反馈。</p>
<p>回想一下，在小到普通的应用程序，大到企业级项目中，我们常常会遇到需要定时轮询和调度的场景，简单点的需求是每隔固定的秒数或者分钟、小时进行轮询，复杂点的是每周的某个时刻，或者每月，或者每年才执行一次，又或者更复杂的情景，某些天需要执行，某些天不执行。用Windows自带的计划任务，能够实现简单的逻辑，如果要用程序实现这样的逻辑，想必也很复杂了。其实，用Quartz能很好的应付这些情况。</p>
<p>Quartz.NET的核心模块分为几个部分，Scheduler、Job、JobDetail、Trigger</p>
<p>Scheduler:实现调度的主体，负责调度任务的开始、结束，Scheduler中包含已注册的JobDetail和Trigger,并且，当Trigger中的条件得以触发时，Scheduler负责执行和Trigger相关联的Job，实现任务的调度。<br />
Job:需要被调度的任务，Job必须实现IJob接口的Execute方法，而Execute方法的内容，其实也就是我们需要根据不同的需求自己实现的业务逻辑。<br />
JobDetail:包含对Job的具体描述，包括Job的名称、所属的Group名称、以及Job的Type描述，用以Quartz.NET通过反射实现对Job的调用。<br />
Trigger:触发器，描述调度的触发条件和时机。</p>
<p>Quartz.NET之所以没把Job和Trigger设计在一起，而是采用一种松耦合的方式，把Job和Trigger独立为两个不同的对象，原因是因为在Quartz.NET中，Job和Trigger可以建立一种一对多的关系，也就是可以对一个调度任务绑定多个Trigger，另外的好处是当某个Job的Trigger过期的时候，可以直接为Job绑定新的Trigger而不用重新定义和这个Trigger相关联的Job。</p>
<p>最初见到Quartz.NET，还是0.6的版本，一直躺在偶的硬盘里面，直到最近项目中遇到很多需要定时轮询处理的情况，突然想到了Quartz.NET，打开它在sourceforge的大本营，才发现Quartz.NET已经更新到1.0.1版本了。</p>
<p>Quartz.NET为我们提供了简洁的API，通过简单的例子，我们就可以很快上手和使用</p>
<p>在Quartz.NET中，所有的Job都必须实现IJob接口：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p431code22'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43122"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p431code22"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">namespace</span> Quartz
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">interface</span> IJob
    <span style="color: #008000;">&#123;</span>
        <span style="color: #6666cc; font-weight: bold;">void</span> Execute<span style="color: #008000;">&#40;</span>JobExecutionContext context<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>JobExecutionContext 包含运行时的一些上下文信息，还可以用来传递参数</p>
<p>编写我们自己的Job，实现IJob接口：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p431code23'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43123"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p431code23"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">Quartz</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> ExampleJob
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">class</span> TestJob <span style="color: #008000;">:</span> IJob
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #6666cc; font-weight: bold;">void</span> Execute<span style="color: #008000;">&#40;</span>JobExecutionContext context<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Job executed!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>然后就可以通过Scheduler来调度任务了</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p431code24'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43124"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code" id="p431code24"><pre class="csharp" style="font-family:monospace;"><span style="color: #008080; font-style: italic;">// 创建SchedulerFactory</span>
ISchedulerFactory schedFact <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> StdSchedulerFactory<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 获取Scheduler实例</span>
IScheduler sched <span style="color: #008000;">=</span> schedFact<span style="color: #008000;">.</span><span style="color: #0000FF;">GetScheduler</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
sched<span style="color: #008000;">.</span><span style="color: #0000FF;">Start</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #008080; font-style: italic;">// 创建JobDetail</span>
JobDetail jobDetail <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> JobDetail<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;ExampleJob&quot;</span>, <span style="color: #666666;">&quot;MyJobGroup&quot;</span>, <a href="http://www.google.com/search?q=typeof+msdn.microsoft.com"><span style="color: #008000;">typeof</span></a><span style="color: #008000;">&#40;</span>ExampleJob<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// 创建Trigger，每分钟触发一次</span>
Trigger trigger <span style="color: #008000;">=</span> TriggerUtils<span style="color: #008000;">.</span><span style="color: #0000FF;">MakeMinutelyTrigger</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008080; font-style: italic;">// 设定trigger的开始时间</span>
trigger<span style="color: #008000;">.</span><span style="color: #0000FF;">StartTimeUtc</span> <span style="color: #008000;">=</span> TriggerUtils<span style="color: #008000;">.</span><span style="color: #0000FF;">GetEvenHourDate</span><span style="color: #008000;">&#40;</span>DateTime<span style="color: #008000;">.</span><span style="color: #0000FF;">UtcNow</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
trigger<span style="color: #008000;">.</span><span style="color: #0000FF;">Name</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;myTrigger&quot;</span><span style="color: #008000;">;</span>
sched<span style="color: #008000;">.</span><span style="color: #0000FF;">ScheduleJob</span><span style="color: #008000;">&#40;</span>jobDetail, trigger<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>这样，任务调度框架便会每分钟调度一次我们的Job，在控制台每分钟都能看到一句 ”Job executed!”，是不是很简单呢？</p>
<p>其实Quartz.NET还有很多方便开发人员的特性和高级功能，比如通过配置文件配置Job和Trigger，可以让你的调度程序更加灵活，以应对后续需求的变化，而不需要重新编译程序。另外，还有调度线程池、JobStore、Clustering等很多高级功能，等着我们去发现。</p>
<p>相关资源：</p>
<p>Quartz.NET 主页：<a title="http://quartznet.sourceforge.net" href="http://quartznet.sourceforge.net">http://quartznet.sourceforge.net</a></p>
<p>在sourceforge的Quartz.NET主页上，有入门教程供初学者查看：<a href="http://quartznet.sourceforge.net/tutorial/index.html">http://quartznet.sourceforge.net/tutorial/index.html</a></p>
<p>另外，博客园的张善友也把教程翻译成了中文的，供E文不好的同学学习和参考，地址：<a href="http://www.cnblogs.com/shanyou/archive/2007/08/25/QuartzNETtutorial.html">http://www.cnblogs.com/shanyou/archive/2007/08/25/QuartzNETtutorial.html</a></p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2008年03月29日 -- <a href="http://www.xiaozhou.net/myworks/dynamic-plugins-manager-3-demo-2008-03-29.htm" title="Dynamic Plugins Manager (三) Demo">Dynamic Plugins Manager (三) Demo</a> (6)</li><li>2005年02月2日 -- <a href="http://www.xiaozhou.net/vcdevelopment/richedit-insert-gif-2005-02-02.htm" title="RICHEDIT中插入GIF">RICHEDIT中插入GIF</a> (2)</li><li>2010年04月22日 -- <a href="http://www.xiaozhou.net/ittech/software/tencent_micro_blog_invitation-2010-04-22.htm" title="发放腾讯微博邀请三枚">发放腾讯微博邀请三枚</a> (29)</li><li>2004年12月28日 -- <a href="http://www.xiaozhou.net/vcdevelopment/with-regard-to-the-essential-differences-between-debug-and-release-of-the-discussion-of-2004-12-28.htm" title="关于Debug和Release之本质区别的讨论">关于Debug和Release之本质区别的讨论</a> (1)</li><li>2006年01月10日 -- <a href="http://www.xiaozhou.net/essay/the-movie-u0026quotthe-classicu0026quot-can-not-not-believe-in-fate-2006-01-10.htm" title="电影《爱有天意》（不可不信缘）">电影《爱有天意》（不可不信缘）</a> (5)</li><li>2006年02月23日 -- <a href="http://www.xiaozhou.net/vcdevelopment/talk-about-the-destruction-of-non-modal-dialog-box-2006-02-23.htm" title="再谈非模态对话框的销毁">再谈非模态对话框的销毁</a> (4)</li><li>2006年07月17日 -- <a href="http://www.xiaozhou.net/essay/hot-summer-2006-07-17.htm" title="闷热的夏天">闷热的夏天</a> (4)</li><li>2004年10月21日 -- <a href="http://www.xiaozhou.net/vcdevelopment/enumerate-the-registry-key-name-and-key-value-2004-10-21.htm" title="枚举注册表键名与键值">枚举注册表键名与键值</a> (2)</li><li>2010年02月13日 -- <a href="http://www.xiaozhou.net/essay/happy_new_year_2010-2-2010-02-13.htm" title="Happy New Year！2010">Happy New Year！2010</a> (20)</li><li>2010年06月14日 -- <a href="http://www.xiaozhou.net/ittech/vps-ittech/burstnet_and_linode_vps_unixbench_test-2010-06-14.htm" title="BurstNET和Linode VPS的UnixBench测试">BurstNET和Linode VPS的UnixBench测试</a> (6)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/open_source_job_scheduling_framework_quartz_net-2009-12-05.htm/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>常用扩展方法收集&amp;整理(置顶-不断更新)</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm#comments</comments>
		<pubDate>Fri, 13 Nov 2009 16:33:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e6%96%b9%e6%b3%95%e6%94%b6%e9%9b%86%e6%95%b4%e7%90%86-%e4%b8%80-2009-11-14.htm</guid>
		<description><![CDATA[常用的扩展方法收集与整理。]]></description>
			<content:encoded><![CDATA[<p>扩展方法，是.NET 3.5中引入的新特性，在<a href="http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm" target="_blank">《扩展方法使用小结中》</a>，我有具体的介绍。合理的使用扩展方法，能节约不少的代码量，甚至能在开发中给我们带来意想不到的效果，让代码更加的简洁、易懂。其实，网上早就有了不少的大牛写的各种出色的扩展方法，以至于我有了整理一个扩展方法库的想法，把一些实用、优秀的扩展方法收集起来，一来为资源共享，二来也是为了应用在以后的项目代码中，提高开发效率。<span id="more-389"></span></p>
<p>1.Foreach方法<br />
首先上场的是Foreach，在使用Linq的时候，太容易派上用场了。比如，在使用Linq to Sql查询后，我们常常需要遍历结果，然后输出，代码如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code25'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38925"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code25"><pre class="csharp" style="font-family:monospace;">DataClassDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataClassDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
var result <span style="color: #008000;">=</span> ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Products</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>var product <span style="color: #0600FF; font-weight: bold;">in</span> result<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>product<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>自从有了Foreach，可以节省不少的力气了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code26'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38926"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p389code26"><pre class="csharp" style="font-family:monospace;">DataClassDataContext ctx <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> DataClassDataContext<span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
ctx<span style="color: #008000;">.</span><span style="color: #0000FF;">Products</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Where</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductID</span> <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">10</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>p <span style="color: #008000;">=&gt;</span> Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>p<span style="color: #008000;">.</span><span style="color: #0000FF;">ProductName</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span></pre></td></tr></table></div>

<p>Foreach代码如下:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code27'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38927"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code27"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> <span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> <span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> source, Action<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> action<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">foreach</span><span style="color: #008000;">&#40;</span>var item <span style="color: #0600FF; font-weight: bold;">in</span> source<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            action<span style="color: #008000;">&#40;</span>item<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>2.In方法<br />
判断某个类型的变量是否在一个序列中</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code28'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38928"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p389code28"><pre class="csharp" style="font-family:monospace;"><span style="color: #6666cc; font-weight: bold;">string</span> <span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> names <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</span><span style="color: #666666;">&quot;Andy&quot;</span>, <span style="color: #666666;">&quot;Timothy&quot;</span>, <span style="color: #666666;">&quot;Ben&quot;</span>, <span style="color: #666666;">&quot;Rex&quot;</span>, <span style="color: #666666;">&quot;Ven&quot;</span>, <span style="color: #666666;">&quot;Ken&quot;</span><span style="color: #008000;">&#125;</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">if</span><span style="color: #008000;">&#40;</span>names<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Timothy&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Found!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>使用In方法:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code29'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38929"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code29"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Timothy&quot;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">In</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Andy&quot;</span>, <span style="color: #666666;">&quot;Timothy&quot;</span>, <span style="color: #666666;">&quot;Ben&quot;</span>, <span style="color: #666666;">&quot;Rex&quot;</span>, <span style="color: #666666;">&quot;Ven&quot;</span>, <span style="color: #666666;">&quot;Ken&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Found!&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>In方法代码如下:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code30'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38930"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code30"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">bool</span> <span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> T t, <span style="color: #0600FF; font-weight: bold;">params</span> T<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> c<span style="color: #008000;">&#41;</span>
<span style="color: #008000;">&#123;</span>
    <span style="color: #0600FF; font-weight: bold;">return</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Contains</span><span style="color: #008000;">&#40;</span>t<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>3.WinForm下的控件选择器(摘自 博客园-鹤冲天 的博客 http://www.cnblogs.com/ldp615/archive/2009/11/08/1598596.html)</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code31'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38931"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p389code31"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">public</span> <span style="color: #0600FF; font-weight: bold;">static</span> IEnumerable<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span> GetControls<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> Control control, Func<span style="color: #008000;">&lt;</span>T, <span style="color: #6666cc; font-weight: bold;">bool</span><span style="color: #008000;">&gt;</span> filter<span style="color: #008000;">&#41;</span> <span style="color: #0600FF; font-weight: bold;">where</span> T <span style="color: #008000;">:</span> Control
<span style="color: #008000;">&#123;</span>
	<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>Control c <span style="color: #0600FF; font-weight: bold;">in</span> control<span style="color: #008000;">.</span><span style="color: #0000FF;">Controls</span><span style="color: #008000;">&#41;</span>
 	<span style="color: #008000;">&#123;</span>
		<span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>c <a href="http://www.google.com/search?q=is+msdn.microsoft.com"><span style="color: #008000;">is</span></a> T<span style="color: #008000;">&amp;&amp;</span><span style="color: #008000;">&#40;</span>filter <span style="color: #008000;">==</span> <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">||</span>filter<span style="color: #008000;">&#40;</span>c <span style="color: #0600FF; font-weight: bold;">as</span> T<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
		<span style="color: #008000;">&#123;</span>
 			<span style="color: #0600FF; font-weight: bold;">yield</span> <span style="color: #0600FF; font-weight: bold;">return</span> c <span style="color: #0600FF; font-weight: bold;">as</span> T<span style="color: #008000;">;</span>
 		<span style="color: #008000;">&#125;</span>
 		<span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span>T _t <span style="color: #0600FF; font-weight: bold;">in</span> GetControls<span style="color: #008000;">&lt;</span>T<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span>c, filter<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span>
 		<span style="color: #0600FF; font-weight: bold;">yield</span> <span style="color: #0600FF; font-weight: bold;">return</span> _t<span style="color: #008000;">;</span>
 	<span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>使用方法：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p389code32'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38932"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p389code32"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">this</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetControls</span><span style="color: #008000;">&lt;</span>Button<span style="color: #008000;">&gt;</span><span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">ForEach</span><span style="color: #008000;">&#40;</span>b <span style="color: #008000;">=&gt;</span> b<span style="color: #008000;">.</span><span style="color: #0000FF;">Enabled</span> <span style="color: #008000;">=</span> <span style="color: #0600FF; font-weight: bold;">false</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>  <span style="color: #008080; font-style: italic;">//禁用界面上所有Button控件</span></pre></td></tr></table></div>

<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2010年01月17日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm" title="扩展方法收集&#8211;实体验证">扩展方法收集&#8211;实体验证</a> (8)</li><li>2009年09月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm" title="扩展方法使用小结">扩展方法使用小结</a> (0)</li><li>2010年06月23日 -- <a href="http://www.xiaozhou.net/mac-development/objectivec/objective_c_learning_note_1_the_first_hello_world_programe-2010-06-23.htm" title="Objective-C 学习笔记(一) 第一个Hello World程序">Objective-C 学习笔记(一) 第一个Hello World程序</a> (14)</li><li>2009年05月29日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/c-ide-mobile-write-your-c-code-anywhere-2009-05-29.htm" title="C# IDE Mobile – Write your C# code anywhere!">C# IDE Mobile – Write your C# code anywhere!</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm/feed</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>扩展方法使用小结</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm#comments</comments>
		<pubDate>Mon, 28 Sep 2009 15:24:42 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[Extention]]></category>
		<category><![CDATA[Method]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=245</guid>
		<description><![CDATA[随着.Net Framework一路走来，已经让广大开发人员体验到快速开发的甜头，这得益于.Net Framework为我们提供了更高层次的封装，开发人员不必关心底层的Win32 API及其繁琐的调用参数，而可以把大部分的经历放在对业务的分析和实现。随着.Net的不断革新，也引入了更多的特性，例如C# 2.0，就增加了匿名方法和迭代器，这些特性让我们的编码效率更高。随着C# 3.0的推出，引入了更多的新特性，包括：隐式类型局部变量、对象初始化器、Lambda表达式、扩展方法、匿名类型。 而这些特性，都为LINQ的推出，构建好了基础。其中一个比较不错的特性，就是扩展方法。扩展方法，顾名思义，就是在类型定义完成之后，再继续为其添加新的方法。这是相当方便的，比如对于一个已经封装好的Assembly来说，我们不用改动Assembly的代码，而通过扩展方法就能实现对其功能的扩展，而且在调用的时候，仅仅通过代码，你几乎判断不出这是扩展方法，还是Assembly本身的方法。 扩展方法在.Net 3.5中的应用也是非常普遍的，如果你仔细观察，就会发现我们常用的Linq to Object中的Where,Select,Average,Sum等方法，以及Linq to SQL中的Where,Select,Average,Sum等方法，其实都是扩展方法，他们分别定义于System.Linq.Enumerable类和System.Linq.Queryable类之中。 就扩展方法本身而言，也存在一些限制之处。对于编译器来说，如果扩展方法和被扩展类型的方法发生冲突的时候，在调用此方法的时候，究竟是调用被扩展类型的方法，还是扩展方法呢？通过一个例子，我们就能发现其中的区别。 1: class Program 2: { 3: static void Main(string[] args) 4: { 5: new TestClassA().Display("Test"); 6: new TestClassB().Display("Test"); 7: Console.ReadLine(); 8: } 9: } 10: 11: class TestClassA 12: { 13: public void Display(int b) 14: { 15: Console.WriteLine("This is TestClassA.Display() [...]]]></description>
			<content:encoded><![CDATA[<p>随着.Net Framework一路走来，已经让广大开发人员体验到快速开发的甜头，这得益于.Net Framework为我们提供了更高层次的封装，开发人员不必关心底层的Win32 API及其繁琐的调用参数，而可以把大部分的经历放在对业务的分析和实现。随着.Net的不断革新，也引入了更多的特性，例如C# 2.0，就增加了匿名方法和迭代器，这些特性让我们的编码效率更高。随着C# 3.0的推出，引入了更多的新特性，包括：隐式类型局部变量、对象初始化器、Lambda表达式、扩展方法、匿名类型。</p>
<p>而这些特性，都为LINQ的推出，构建好了基础。其中一个比较不错的特性，就是扩展方法。扩展方法，顾名思义，就是在类型定义完成之后，再继续为其添加新的方法。这是相当方便的，比如对于一个已经封装好的Assembly来说，我们不用改动Assembly的代码，而通过扩展方法就能实现对其功能的扩展，而且在调用的时候，仅仅通过代码，你几乎判断不出这是扩展方法，还是Assembly本身的方法。</p>
<p>扩展方法在.Net 3.5中的应用也是非常普遍的，如果你仔细观察，就会发现我们常用的Linq to Object中的Where,Select,Average,Sum等方法，以及Linq to SQL中的Where,Select,Average,Sum等方法，其实都是扩展方法，他们分别定义于System.Linq.Enumerable类和System.Linq.Queryable类之中。</p>
<p>就扩展方法本身而言，也存在一些限制之处。对于编译器来说，如果扩展方法和被扩展类型的方法发生冲突的时候，在调用此方法的时候，究竟是调用被扩展类型的方法，还是扩展方法呢？通过一个例子，我们就能发现其中的区别。</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>  <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   4:  </span>        {</pre>
<pre class="alt"><span class="lnum">   5:  </span>            <span class="kwrd">new</span> TestClassA().Display(<span class="str">"Test"</span>);</pre>
<pre><span class="lnum">   6:  </span>            <span class="kwrd">new</span> TestClassB().Display(<span class="str">"Test"</span>);</pre>
<pre class="alt"><span class="lnum">   7:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">   8:  </span>        }</pre>
<pre class="alt"><span class="lnum">   9:  </span>    }</pre>
<pre><span class="lnum">  10:  </span></pre>
<pre class="alt"><span class="lnum">  11:  </span>    <span class="kwrd">class</span> TestClassA</pre>
<pre><span class="lnum">  12:  </span>    {</pre>
<pre class="alt"><span class="lnum">  13:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">int</span> b)</pre>
<pre><span class="lnum">  14:  </span>        {</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"This is TestClassA.Display() ..."</span>);</pre>
<pre><span class="lnum">  16:  </span>        }</pre>
<pre class="alt"><span class="lnum">  17:  </span>    }</pre>
<pre><span class="lnum">  18:  </span></pre>
<pre class="alt"><span class="lnum">  19:  </span>    <span class="kwrd">class</span> TestClassB</pre>
<pre><span class="lnum">  20:  </span>    {</pre>
<pre class="alt"><span class="lnum">  21:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">string</span> s)</pre>
<pre><span class="lnum">  22:  </span>        {</pre>
<pre class="alt"><span class="lnum">  23:  </span>            Console.WriteLine(<span class="str">"This is TestClassB.Display() ..."</span>);</pre>
<pre><span class="lnum">  24:  </span>        }</pre>
<pre class="alt"><span class="lnum">  25:  </span>    }</pre>
<pre><span class="lnum">  26:  </span></pre>
<pre class="alt"><span class="lnum">  27:  </span>    <span class="kwrd">static</span> <span class="kwrd">class</span> TestClassExtention</pre>
<pre><span class="lnum">  28:  </span>    {</pre>
<pre class="alt"><span class="lnum">  29:  </span>        <span class="kwrd">static</span> <span class="kwrd">public</span> <span class="kwrd">void</span> Display(<span class="kwrd">this</span> <span class="kwrd">object</span> o, <span class="kwrd">string</span> s)</pre>
<pre><span class="lnum">  30:  </span>        {</pre>
<pre class="alt"><span class="lnum">  31:  </span>            Console.WriteLine(<span class="str">"This is TestClassExtention.Display() ..."</span>);</pre>
<pre><span class="lnum">  32:  </span>        }</pre>
<pre class="alt"><span class="lnum">  33:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>程序输出：</p>
<p><a href="/pics/C3.0_13679/ExtentionMethod.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="ExtentionMethod" src="/pics/C3.0_13679/ExtentionMethod_thumb.jpg" border="0" alt="ExtentionMethod" width="684" height="167" /></a></p>
<p>可以看出,TestClassA的方法和扩展方法并没有冲突，因为他们的方法签名是不一样的，而TestClassB的方法和扩展方法有冲突，因为他们的都是接受一个string类型的输入参数。从结果可以看到，程序对Display的方法调用，TestClassB本身的Display方法，要“优先”于扩展方法Display被调用。因此，类本身的方法如果满足调用条件，那么这个方法会被优先执行，只有在类当中无法找到同样参数的方法时，扩展方法才有机会被执行。所以，我们可以得出这样的结论：扩展方法的优先级较低，也即扩展方法不会覆盖同名的类本身的方法。</p>
<p>另外，还有一个比较明显的区别，就是扩展方法要远远弱于类本身的方法，比如，在一个类中，类的方法可以访问自己的非公有成员，而扩展方法做不到这一点。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2010年01月17日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/extention_method_entity_validation-2010-01-17.htm" title="扩展方法收集&#8211;实体验证">扩展方法收集&#8211;实体验证</a> (8)</li><li>2009年11月14日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm" title="常用扩展方法收集&#038;整理(置顶-不断更新)">常用扩展方法收集&#038;整理(置顶-不断更新)</a> (35)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/extension-method-uses-summary-2009-09-28.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>IIS7中Host WCF遇到的问题</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/iis7-problems-encountered-in-the-host-wcf-2009-09-03.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/iis7-problems-encountered-in-the-host-wcf-2009-09-03.htm#comments</comments>
		<pubDate>Thu, 03 Sep 2009 06:00:56 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[IIS7]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[wcf]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=240</guid>
		<description><![CDATA[最近重装了系统，用上了Windows 7，在IIS7中Host WCF Service的时候，遇到一个比较奇怪的问题，当在站点下面添加应用，指向WCF的目录后，访问.svc文件，浏览器提示以下错误： &#160; The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map. .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ [...]]]></description>
			<content:encoded><![CDATA[<p>最近重装了系统，用上了Windows 7，在IIS7中Host WCF Service的时候，遇到一个比较奇怪的问题，当在站点下面添加应用，指向WCF的目录后，访问.svc文件，浏览器提示以下错误：</p>
<p>&#160;</p>
<pre class="csharpcode">The page you are requesting cannot be served because of the extension configuration.
If the page is a script, add a handler. If the file should be downloaded, add a MIME map. </pre>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<style type="text/css">
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
<p>&#160;</p>
<p>这种错误应该是.svc文件没有映射到相关的handler上，因此IIS不知道怎么处理该请求。带着错误信息，在网上搜索了一把，终于找到了解决方法，看来搜索引擎很强大。</p>
<p>解决方法如下：</p>
<p>1.用管理员身份运行cmd命令行</p>
<p>2.切换到目录C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation</p>
<p>3.运行命令： servicemodelreg –i</p>
<p>这样，工具会自动把WCF相关的注册项安装到IIS7中，再打开浏览器访问WCF Service，一切正常。</p>
<p>细想了一下自己的装机过程，先装了VSTS和.net framework，后来发现IIS7没有在windows7里面默认安装，要到部署WCF的时候，才装好IIS7。这样在安装.net framework 3.0的时候，因为没有安装IIS7，所以一些注册项就没有起到作用。此方法可以将WCF的配置项重新配置到IIS7中，供同学们参考。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年11月17日 -- <a href="http://www.xiaozhou.net/ittech/software/problem_of_win7_gadget_weather_plugin-2009-11-17.htm" title="关于Win7 天气插件的问题">关于Win7 天气插件的问题</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/iis7-problems-encountered-in-the-host-wcf-2009-09-03.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# IDE Mobile – Write your C# code anywhere!</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/c-ide-mobile-write-your-c-code-anywhere-2009-05-29.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/c-ide-mobile-write-your-c-code-anywhere-2009-05-29.htm#comments</comments>
		<pubDate>Fri, 29 May 2009 15:06:23 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[Mobile]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=232</guid>
		<description><![CDATA[最近败了个QWERTY全键盘的HTC Touch pro，全键盘的感觉不错，输入速度比以前靠触摸笔点屏幕快多了。装了个Python的Windows mobile版本，没事学着写Python玩玩。一日突发奇想，要是能在PPC手机上写C#的程序并能运行起来，那就太棒了。果然不出我所料，国外已经有大侠已经做好了这个东东，一个运行在Windows Mobile手机上的简单的C# IDE，让你可以随时在你的PPC手机上写C#的程序。这是作者自己实现的一个简单IDE，现在已经支持的功能如下： * 可以创建基于图形用户界面的程序 * 可创建方法和类 * 可以调用所有的.NET Compact Framework的类。 * 执行文件操作 * 运行进程 * 使用.NET 2.0中的范型 * 支持C#的控制语句，包括循环、条件判断&#8230;&#8230; IDE的使用非常简单，写入你的代码，然后可以立即运行，看到结果。 简单的例子，如下： 1: using System.Windows.Forms; 2: namespace TestNS 3: { 4: class TestCL 5: { 6: public static void Main() 7: { 8: MessageBox.Show(&#34;Hello Timothy!&#34;); 9: } 10: } 11: } .csharpcode, [...]]]></description>
			<content:encoded><![CDATA[<p>最近败了个QWERTY全键盘的HTC Touch pro，全键盘的感觉不错，输入速度比以前靠触摸笔点屏幕快多了。装了个Python的Windows mobile版本，没事学着写Python玩玩。一日突发奇想，要是能在PPC手机上写C#的程序并能运行起来，那就太棒了。果然不出我所料，国外已经有大侠已经做好了这个东东，一个运行在Windows Mobile手机上的简单的C# IDE，让你可以随时在你的PPC手机上写C#的程序。这是作者自己实现的一个简单IDE，现在已经支持的功能如下：</p>
<p>* 可以创建基于图形用户界面的程序</p>
<p>* 可创建方法和类</p>
<p>* 可以调用所有的.NET Compact Framework的类。</p>
<p>* 执行文件操作</p>
<p>* 运行进程</p>
<p>* 使用.NET 2.0中的范型</p>
<p>* 支持C#的控制语句，包括循环、条件判断&hellip;&hellip;</p>
<p>IDE的使用非常简单，写入你的代码，然后可以立即运行，看到结果。</p>
<p>简单的例子，如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">using</span> System.Windows.Forms;</pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">namespace</span> TestNS</pre>
<pre class="alt"><span class="lnum">   3:  </span>{</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">class</span> TestCL</pre>
<pre class="alt"><span class="lnum">   5:  </span>    {</pre>
<pre><span class="lnum">   6:  </span>       <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> Main()</pre>
<pre class="alt"><span class="lnum">   7:  </span>       {</pre>
<pre><span class="lnum">   8:  </span>            MessageBox.Show(<span class="str">&quot;Hello Timothy!&quot;</span>);</pre>
<pre class="alt"><span class="lnum">   9:  </span>       }</pre>
<pre><span class="lnum">  10:  </span>    }</pre>
<pre class="alt"><span class="lnum">  11:  </span>}</pre>
</div>
<style type="text/css">
<p>.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }</style>
</p>
<p>&nbsp;</p>
<p>点击菜单下面的Debug-&gt;Run,运行结果截图如下：</p>
<p><a href="/pics/CIDEMobileWriteyourCcodeanywh&#101;re_13065/1.jpg"><img title="1" border="0" alt="1" width="324" height="431" style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" src="/pics/CIDEMobileWriteyourCcodeanywh&#101;re_13065/1_thumb.jpg" /></a></p>
<p>&nbsp;</p>
<p>IDE自带一些简单的功能， 包括插入代码模板，编辑(复制、粘贴、剪切)功能，还支持插件功能。</p>
<p><a href="/pics/CIDEMobileWriteyourCcodeanywh&#101;re_13065/2.jpg"><img title="2" border="0" alt="2" width="324" height="431" style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" src="/pics/CIDEMobileWriteyourCcodeanywh&#101;re_13065/2_thumb.jpg" /></a></p>
<p>&nbsp;</p>
<p>软件下载地址： <a title="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile.zip" href="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile.zip">http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile.zip</a></p>
<p>Code Sample: <a title="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_samples.zip" href="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_samples.zip">http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_samples.zip</a></p>
<p>用户手册、帮助文档地址： <a title="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_manual/index.htm" href="http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_manual/index.htm">http://www.geocities.com/hrowson/wm5_software/cs_ide_mobile_manual/index.htm</a></p>
<p>作者主页：<a title="http://www.geocities.com/hrowson/wm5_software/index.htm" href="http://www.geocities.com/hrowson/wm5_software/index.htm">http://www.geocities.com/hrowson/wm5_software/index.htm</a></p>
<p>赶紧下载吧，write your C# code anywh&#101;re! 活活~~</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2010年06月23日 -- <a href="http://www.xiaozhou.net/mac-development/objectivec/objective_c_learning_note_1_the_first_hello_world_programe-2010-06-23.htm" title="Objective-C 学习笔记(一) 第一个Hello World程序">Objective-C 学习笔记(一) 第一个Hello World程序</a> (14)</li><li>2010年02月12日 -- <a href="http://www.xiaozhou.net/ittech/software/wm65_sms_mode_switch-2010-02-12.htm" title="WM6.5 短信聊天模式切换">WM6.5 短信聊天模式切换</a> (10)</li><li>2009年12月30日 -- <a href="http://www.xiaozhou.net/ittech/software/mobile_phone_rom_upgrade_to_wm6_5_28011-2009-12-30.htm" title="手机ROM更新至WM6.5-28011">手机ROM更新至WM6.5-28011</a> (8)</li><li>2009年11月14日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm" title="常用扩展方法收集&#038;整理(置顶-不断更新)">常用扩展方法收集&#038;整理(置顶-不断更新)</a> (35)</li><li>2009年10月29日 -- <a href="http://www.xiaozhou.net/ittech/software/mobile_phone_rom_upgrade_to_wm_65_23502-2009-10-29.htm" title="手机刷机到WM 6.5-23502">手机刷机到WM 6.5-23502</a> (3)</li><li>2009年07月13日 -- <a href="http://www.xiaozhou.net/ittech/software/visual-studio-ide-color-scheme-2009-07-13.htm" title="Visual Studio IDE配色方案">Visual Studio IDE配色方案</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/c-ide-mobile-write-your-c-code-anywhere-2009-05-29.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(3) &#8212; 生命周期管理</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm#comments</comments>
		<pubDate>Tue, 28 Apr 2009 15:33:31 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[life-cycle]]></category>
		<category><![CDATA[management]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=220</guid>
		<description><![CDATA[Unity根据我们在注册类型的时候所指定的生命周期来管理注册类型的创建和解析。当我们在向容器中注册类型的时候，如果我们没有显式的指明该类型的生命周期管理器(下称:Lifetime Manager)，默认的情况下，容器会为我们注册的类型创建一个生命周期短暂的管理器。这样一来，当我们每次调用容器的Resolve方法或者ResolveAll方法，或者采用依赖机制注入实例到其他的类中的时候，容器都会为我们创建新的实例，并且容器不会保存对实例的引用。 容器的RegisterType函数包含多个支持泛型的重载，同时还包含了一一对应的非泛型重载。其中的重载函数，我们可以看到类似下面的声明： 1: RegisterType&#60;TFrom, TTo&#62;(LifetimeManager lifetime) 参数中的LifetimeManager类型，就是用来控制注册类型生命周期的。Unity中提供了几个继承自LifetimeManager的类作为注册类型的生命周期管理器。在目前的Unity 1.2版本中，共提供了3个LifetimeManager供我们直接在代码中调用。此外，我们也可以实现自己的LifetimeManager，不过必须实现LifetimeManager所必须的一些方法。 1.ContainerControlledLifetimeManager: 容器负责管理注册类型的生命周期，并且注册类型的生命周期和容器一致。当离开容器的作用域范围时，容器会被销毁，同时其中的注册类型也会被销毁。或者，当容器被显式销毁时，其中的注册类型也同样被销毁。但是在容器有效的作用域范围中，当我们使用Resolve方法，或者使用ResolveAll方法获取我们的注册类型的时候，容器会在第一次调用时，创建实例，但是在后面的调用中，我们始终只会得到相同的实例。我们可以利用这种Manager来实现Singleton模式。 2.ExternallyControlledLifetimeManager: 和上一种方式类似，不过容器在不会保留对注册类型的强引用，而只是保留弱引用。也就是说，如果这个注册类型没有在其他地方被强引用的时候，那么这个注册类型可能会被GC给干掉。 3.PerThreadLifetimeManager: 容器保证在每个线程中返回同一个对象实例，那么在不同的线程中，得到的实例是不同的。 下面我们可以试验一下不同的LifetimeManager的效果 a. 默认的情况，不显示的指明LifetimeManager 代码： 1: namespace UnityDemo 2: { 3: class Program 4: { 5: static void Main(string[] args) 6: { 7: IUnityContainer container = new UnityContainer(); 8: container.RegisterType&#60;INotify, EmailNotify&#62;(); 9: 10: INotify notify1 = container.Resolve&#60;INotify&#62;(); 11: 12: INotify notify2 [...]]]></description>
			<content:encoded><![CDATA[<p>Unity根据我们在注册类型的时候所指定的生命周期来管理注册类型的创建和解析。当我们在向容器中注册类型的时候，如果我们没有显式的指明该类型的生命周期管理器(下称:Lifetime Manager)，默认的情况下，容器会为我们注册的类型创建一个生命周期短暂的管理器。这样一来，当我们每次调用容器的Resolve方法或者ResolveAll方法，或者采用依赖机制注入实例到其他的类中的时候，容器都会为我们创建新的实例，并且容器不会保存对实例的引用。</p>
<p>容器的RegisterType函数包含多个支持泛型的重载，同时还包含了一一对应的非泛型重载。其中的重载函数，我们可以看到类似下面的声明：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>RegisterType&lt;TFrom, TTo&gt;(LifetimeManager lifetime)</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>参数中的LifetimeManager类型，就是用来控制注册类型生命周期的。Unity中提供了几个继承自LifetimeManager的类作为注册类型的生命周期管理器。在目前的Unity 1.2版本中，共提供了3个LifetimeManager供我们直接在代码中调用。此外，我们也可以实现自己的LifetimeManager，不过必须实现LifetimeManager所必须的一些方法。</p>
<p>1.ContainerControlledLifetimeManager:</p>
<p>容器负责管理注册类型的生命周期，并且注册类型的生命周期和容器一致。当离开容器的作用域范围时，容器会被销毁，同时其中的注册类型也会被销毁。或者，当容器被显式销毁时，其中的注册类型也同样被销毁。但是在容器有效的作用域范围中，当我们使用Resolve方法，或者使用ResolveAll方法获取我们的注册类型的时候，容器会在第一次调用时，创建实例，但是在后面的调用中，我们始终只会得到相同的实例。我们可以利用这种Manager来实现Singleton模式。</p>
<p>2.ExternallyControlledLifetimeManager:</p>
<p>和上一种方式类似，不过容器在不会保留对注册类型的强引用，而只是保留弱引用。也就是说，如果这个注册类型没有在其他地方被强引用的时候，那么这个注册类型可能会被GC给干掉。</p>
<p>3.PerThreadLifetimeManager:</p>
<p>容器保证在每个线程中返回同一个对象实例，那么在不同的线程中，得到的实例是不同的。</p>
<p>下面我们可以试验一下不同的LifetimeManager的效果</p>
<p>a. 默认的情况，不显示的指明LifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            INotify notify1 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  13:  </span></pre>
<pre><span class="lnum">  14:  </span>            Console.WriteLine(<span class="str">"notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">  18:  </span>        }</pre>
<pre class="alt"><span class="lnum">  19:  </span>    }</pre>
<pre><span class="lnum">  20:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行结果：</p>
<p><a href="/pics/Unity3_9C33/4.jpg"><img class="alignnone" style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="4" src="/pics/Unity3_9C33/4_thumb.jpg" border="0" alt="4" width="457" height="134" /><br />
</a></p>
<p>从结果我们可以看到，默认情况下不指定LifetimeManager的时候，每次我们获得的Instance其实不是同一个Instance.</p>
<p>b.使用ContainerControlledLifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="kwrd">new</span> ContainerControlledLifetimeManager());</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            INotify notify1 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  13:  </span></pre>
<pre><span class="lnum">  14:  </span>            Console.WriteLine(<span class="str">"notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  15:  </span>            Console.WriteLine(<span class="str">"notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            Console.ReadLine();</pre>
<pre><span class="lnum">  18:  </span>        }</pre>
<pre class="alt"><span class="lnum">  19:  </span>    }</pre>
<pre><span class="lnum">  20:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行结果:</p>
<p><a href="/pics/Unity3_9C33/5.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="5" src="/pics/Unity3_9C33/5_thumb.jpg" border="0" alt="5" width="488" height="134" /></a><br />
使用ContainerControlledLifetimeManager，在Container生命中期内，我们得到的Instance是同一个。</p>
<p>c.使用PerThreadLifetimeManager</p>
<p>代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   6:  </span>        {</pre>
<pre class="alt"><span class="lnum">   7:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   8:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="kwrd">new</span> PerThreadLifetimeManager());</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            Thread thread1 = <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ParameterizedThreadStart(ThreadProc1));</pre>
<pre class="alt"><span class="lnum">  11:  </span>            Thread thread2 = <span class="kwrd">new</span> Thread(<span class="kwrd">new</span> ParameterizedThreadStart(ThreadProc2));</pre>
<pre><span class="lnum">  12:  </span></pre>
<pre class="alt"><span class="lnum">  13:  </span>            thread1.Start(container);</pre>
<pre><span class="lnum">  14:  </span>            thread2.Start(container);</pre>
<pre class="alt"><span class="lnum">  15:  </span></pre>
<pre><span class="lnum">  16:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  17:  </span>        }</pre>
<pre><span class="lnum">  18:  </span></pre>
<pre class="alt"><span class="lnum">  19:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> ThreadProc1(<span class="kwrd">object</span> obj)</pre>
<pre><span class="lnum">  20:  </span>        {</pre>
<pre class="alt"><span class="lnum">  21:  </span>            INotify notify1 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre><span class="lnum">  22:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  23:  </span></pre>
<pre><span class="lnum">  24:  </span>            Console.WriteLine(<span class="str">"ThreadProc1 --- notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  25:  </span>            Console.WriteLine(<span class="str">"ThreadProc1 --- notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  26:  </span></pre>
<pre class="alt"><span class="lnum">  27:  </span>        }</pre>
<pre><span class="lnum">  28:  </span></pre>
<pre class="alt"><span class="lnum">  29:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> ThreadProc2(<span class="kwrd">object</span> obj)</pre>
<pre><span class="lnum">  30:  </span>        {</pre>
<pre class="alt"><span class="lnum">  31:  </span>            INotify notify1 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre><span class="lnum">  32:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve&lt;INotify&gt;();</pre>
<pre class="alt"><span class="lnum">  33:  </span></pre>
<pre><span class="lnum">  34:  </span>            Console.WriteLine(<span class="str">"ThreadProc2 --- notify1:"</span> + notify1.GetHashCode());</pre>
<pre class="alt"><span class="lnum">  35:  </span>            Console.WriteLine(<span class="str">"ThreadProc2 --- notify2:"</span> + notify2.GetHashCode());</pre>
<pre><span class="lnum">  36:  </span>        }</pre>
<pre class="alt"><span class="lnum">  37:  </span>    }</pre>
<pre><span class="lnum">  38:  </span>}</pre>
</div>
<pre>运行结果：</pre>
<pre><a href="/pics/Unity3_9C33/6.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="6" src="/pics/Unity3_9C33/6_thumb.jpg" border="0" alt="6" width="493" height="132" /></a></pre>
<pre> 在结果中可以看到，同一个线程中连续两次获取到的是同一个Instance，而不同的线程中获取到的Instance不一样。</pre>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月25日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm" title="Unity 学习笔记(2) &#8212; 配置文件的使用">Unity 学习笔记(2) &#8212; 配置文件的使用</a> (4)</li><li>2009年04月23日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm" title="Unity 学习笔记(1) &#8212; Unity简介及简单使用">Unity 学习笔记(1) &#8212; Unity简介及简单使用</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(2) &#8212; 配置文件的使用</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm#comments</comments>
		<pubDate>Sat, 25 Apr 2009 12:24:01 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[configuration]]></category>
		<category><![CDATA[file]]></category>
		<category><![CDATA[unity]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=218</guid>
		<description><![CDATA[在Unity的配置中，使用配置文件也是一种非常灵活的方式，毕竟能够通过修改配置文件的文本就能达到改动的目的，而不需要对源码进行改动、重新编译。使用配置文件对Unity进行配置，需要增加两个程序集的引用：System.Configuration和Microsoft.Practices.Unity.Configration，并且在代码中用相应的两个命名空间： 1: using System.Configuration; 2: using Microsoft.Practices.Unity.Configuration; 此外，需要修改应用程序的配置文件： 在configSections节点中，加入Unity的section配置信息 &#60;configSections&#62; ... &#60;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&#62; &#60;/configSections&#62; &#60;configSections&#62; ... &#60;section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&#62; &#60;/configSections&#62; 其中name是section的名称，type就是处理该section的程序类型，Unity提供了UnityConfigurationSection，负责处理配置文件信息，它包含在程序集Microsoft.Practices.Unity.Configuration中 接下来，需要在configuration节点中增加Unity配置节点，格式如下： 1: &#60;unity&#62; 2: &#60;typeAliases&#62; 3: &#60;typeAlias alias="" type="" /&#62; 4: &#60;typeAliases /&#62; 5: &#60;containers &#62; 6: &#60;container&#62; 7: &#60;types&#62; 8: &#60;type type="" mapTo="" /&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>在Unity的配置中，使用配置文件也是一种非常灵活的方式，毕竟能够通过修改配置文件的文本就能达到改动的目的，而不需要对源码进行改动、重新编译。使用配置文件对Unity进行配置，需要增加两个程序集的引用：System.Configuration和Microsoft.Practices.Unity.Configration，并且在代码中用相应的两个命名空间：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">using</span> System.Configuration;</pre>
<pre><span class="lnum">   2:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity.Configuration;</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>此外，需要修改应用程序的配置文件：</p>
<p>在configSections节点中，加入Unity的section配置信息</p>
<div class="csharpcode">
<pre><span style="font-family: Simsun; white-space: normal; font-size: small;">
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;configSections&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">...</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;section name="unity"</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">&lt;/configSections&gt;</div>
<pre>&lt;<span style="font-family: Simsun;"><span style="white-space: normal;">configSections&gt;</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">...</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">&lt;section name="unity"</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/&gt;</span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;">&lt;/configSections&gt;</span></span></pre>
<p></span></pre>
<pre><span style="font-family: Simsun; white-space: normal; font-size: small;">其中name是section的名称，type就是处理该section的程序类型，Unity提供了UnityConfigurationSection，负责处理配置文件信息，它包含在程序集Microsoft.Practices.Unity.Configuration中</span></pre>
</div>
<p>接下来，需要在configuration节点中增加Unity配置节点，格式如下：</p>
<div class="csharpcode">
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;unity&gt;</pre>
<pre><span class="lnum">   2:  </span>    &lt;typeAliases&gt;</pre>
<pre class="alt"><span class="lnum">   3:  </span>      &lt;typeAlias alias=<span class="str">""</span> type=<span class="str">""</span> /&gt;</pre>
<pre><span class="lnum">   4:  </span>    &lt;typeAliases /&gt;</pre>
<pre class="alt"><span class="lnum">   5:  </span>    &lt;containers  &gt;</pre>
<pre><span class="lnum">   6:  </span>      &lt;container&gt;</pre>
<pre class="alt"><span class="lnum">   7:  </span>         &lt;types&gt;</pre>
<pre><span class="lnum">   8:  </span>           &lt;type type=<span class="str">""</span> mapTo=<span class="str">""</span> /&gt;</pre>
<pre class="alt"><span class="lnum">   9:  </span>         &lt;/types&gt;</pre>
<pre><span class="lnum">  10:  </span>         &lt;instances&gt;</pre>
<pre class="alt"><span class="lnum">  11:  </span>           &lt;add name=<span class="str">""</span> type=<span class="str">""</span> <span class="kwrd">value</span>=<span class="str">""</span> /&gt;</pre>
<pre><span class="lnum">  12:  </span>         &lt;/instances&gt;</pre>
<pre class="alt"><span class="lnum">  13:  </span>      &lt;/container&gt;</pre>
<pre><span class="lnum">  14:  </span>    &lt;/containers&gt;</pre>
<pre><span class="lnum">  16:  </span>&lt;/unity&gt;</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>unity的子元素，包含节点大致如上，其宗typeAliases是type别名，能够简化下面types中type的配置。containers节点中可以包含多个container的配置。container主要包含的子元素有types元素，instance元素，types元素可以包含多个type元素，用以添加注册类型，instance主要用来添加实例到容器中。type元素，主要包含四个属性：</p>
<p>name：表示注册类型的名称，此属性在配置中可选。</p>
<p>type:注册的源类型</p>
<p>mapto:注册的目标类型</p>
<p>lifetime:设置注册类型的生命周期</p>
<p>此外，还有instances元素，包括name,type,value,typeConverter四个属性。value表示注册实例的初始值，typeConverter是用以转换提供的值到实例的匹配类型的类型转换器。</p>
<p>具体的元素含义，可以参考Unity的帮助文档。</p>
<p>下面我们还是采用Monitor的例子，来实现用配置文件注册类型，配置文件示例：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>&lt;?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span> ?&gt;</pre>
<pre><span class="lnum">   2:  </span>&lt;configuration&gt;</pre>
<pre class="alt"><span class="lnum">   3:  </span>  &lt;configSections&gt;</pre>
<pre><span class="lnum">   4:  </span>    &lt;section name=<span class="str">"unity"</span> type=<span class="str">"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"</span> /&gt;</pre>
<pre class="alt"><span class="lnum">   5:  </span>  &lt;/configSections&gt;</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span>  &lt;unity&gt;</pre>
<pre><span class="lnum">   8:  </span>    &lt;containers&gt;</pre>
<pre class="alt"><span class="lnum">   9:  </span>      &lt;container&gt;</pre>
<pre><span class="lnum">  10:  </span>        &lt;types&gt;</pre>
<pre class="alt"><span class="lnum">  11:  </span>          &lt;type type=<span class="str">"UnityDemo.IMonitor,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.Monitor,UnityDemo"</span> /&gt;</pre>
<pre><span class="lnum">  12:  </span>          &lt;type type=<span class="str">"UnityDemo.INotify,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.EmailNotify,UnityDemo"</span> /&gt;</pre>
<pre class="alt"><span class="lnum">  13:  </span>        &lt;/types&gt;</pre>
<pre><span class="lnum">  14:  </span>      &lt;/container&gt;</pre>
<pre class="alt"><span class="lnum">  15:  </span>    &lt;/containers&gt;</pre>
<pre><span class="lnum">  16:  </span>  &lt;/unity&gt;</pre>
<pre class="alt"><span class="lnum">  17:  </span></pre>
<pre><span class="lnum">  18:  </span>&lt;/configuration&gt;</pre>
</div>
<p><!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>程序代码修改如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">using</span> System;</pre>
<pre><span class="lnum">   2:  </span></pre>
<pre class="alt"><span class="lnum">   3:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity;</pre>
<pre><span class="lnum">   4:  </span><span class="kwrd">using</span> Microsoft.Practices.Unity.Configuration;</pre>
<pre class="alt"><span class="lnum">   5:  </span><span class="kwrd">using</span> System.Configuration;</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">namespace</span> UnityDemo</pre>
<pre><span class="lnum">   8:  </span>{</pre>
<pre class="alt"><span class="lnum">   9:  </span>    <span class="kwrd">class</span> Program</pre>
<pre><span class="lnum">  10:  </span>    {</pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">  12:  </span>        {</pre>
<pre class="alt"><span class="lnum">  13:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">  14:  </span>            UnityConfigurationSection section = (UnityConfigurationSection)ConfigurationManager.GetSection(<span class="str">"unity"</span>);</pre>
<pre class="alt"><span class="lnum">  15:  </span>            section.Containers.Default.Configure(container);</pre>
<pre><span class="lnum">  16:  </span></pre>
<pre class="alt"><span class="lnum">  17:  </span>            IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre><span class="lnum">  18:  </span>            monitor.Alarm();</pre>
<pre class="alt"><span class="lnum">  19:  </span></pre>
<pre><span class="lnum">  20:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  21:  </span>        }</pre>
<pre><span class="lnum">  22:  </span>    }</pre>
<pre class="alt"><span class="lnum">  23:  </span>}</pre>
</div>
<p><!-- .csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>编译运行结果：<br />
<img class="alignnone" style="display: block; margin-left: auto; margin-right: auto;" src="/pics/unity/3.jpg" alt="" width="424" height="99" /></p>
<p>使用配置文件，还有许多方便的地方，比如对于程序的扩展而言，新增的模块不再需要修改已编译好的程序，而只需要修改配置文件就可以方便的实现新模块的注册，对于系统的稳定性和可维护性都非常有好处。</p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm" title="Unity 学习笔记(3) &#8212; 生命周期管理">Unity 学习笔记(3) &#8212; 生命周期管理</a> (0)</li><li>2009年04月23日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm" title="Unity 学习笔记(1) &#8212; Unity简介及简单使用">Unity 学习笔记(1) &#8212; Unity简介及简单使用</a> (0)</li><li>2004年12月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/information-to-be-specified-file-2004-12-26.htm" title="得到指定文件的信息">得到指定文件的信息</a> (2)</li><li>2004年11月29日 -- <a href="http://www.xiaozhou.net/vcdevelopment/to-determine-whether-a-folder-or-file-2004-11-29.htm" title="判断是否为文件夹或者文件">判断是否为文件夹或者文件</a> (0)</li><li>2004年10月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/load-images-from-the-file-2004-10-26.htm" title="从文件装载图象">从文件装载图象</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(1) &#8212; Unity简介及简单使用</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm#comments</comments>
		<pubDate>Thu, 23 Apr 2009 21:02:31 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[unity]]></category>
		<category><![CDATA[学习]]></category>
		<category><![CDATA[笔记]]></category>
		<category><![CDATA[简介]]></category>
		<category><![CDATA[简单使用]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=215</guid>
		<description><![CDATA[Unity是微软Patterns &#38; Practices团队所开发的一个轻量级的，并且可扩展的依赖注入(Dependency Injection)容器，它支持常用的三种依赖注入方式：构造器注入(Constructor Injection)、属性注入(Property Injection)，以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版，可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity，我们能轻松构建松耦合结构的程序，从而让整个程序框架变得清晰和易于维护。 在平常的软件编码过程中，程序的逻辑往往很复杂，尤其是大型项目的开发中，一个模块常常会去引用其他的模块，假设我们有一个监控器类，用来监控CPU的温度，当温度达到预警的范围时，监控器有一个报警的方法，方法里面通过短信提醒器，以发送短信的方式通知维护人员。于是就出现了下面这样一段最为常见的代码： 1: public class Monitor 2: { 3: public void Alarm() 4: { 5: SMSNotify notify = new SMSNotify(); 6: notify.Send(); 7: } 8: } 在Monitor类中，直接引用到了一个短信提醒器的类，这是最为不灵活和最不易于扩展的一种方式。或许我们想到了面向接口编程，利用多态的好处，可以提供灵活的不同子类的实现，增加代码扩展性等等。但是说到底，接口一定是需要实现的，也就是如下语句迟早要执行： 1: public void Alarm() 2: { 3: INotify notify = new SMSNotify(); 4: notify.Send(); 5: } 这样看来，在实现INotify这个接口的时候，仍然需要具体的类来实现，而这样的代码在程序编译的时候就已经固定下来，如果以后需要使用新的提醒器，仍旧需要修改源代码并重新编译。并且在我们的Monitor类中，明显依赖SMSNotify类，二者之间的耦合度非常紧密。因此Ioc(控制反转)模式被提出用来解决这种问题，也即把接口的具体实现延缓到运行时，接口的实现类是在运行时被装载的。这样，就算有了新的实现类，也不需要更改调用者的代码(可以在Unity中使用配置文件的方式实现)。这种Ioc模式可以被形象的比喻为：接口就像一个空壳，而在具体实现时，向这个空壳注入内容，而让它成为一个真正的实体。这种模式也被形象的称为：依赖注入。通过使用Unity，我们能构建松耦合的软件，并且对象之间相互关联的细节，我们也不必关心，可以交由依赖注入容器全权负责。 前面也提到了依赖注入常用的三种形式：构造器注入、属性注入和方法调用注入，我们可以通过例子来实现这三种形式的注入。还是以上面的场景为例，我们的几个类和接口如下图： 1.Constructor Injection IMonitor接口定义： [...]]]></description>
			<content:encoded><![CDATA[<p>Unity是微软Patterns &amp; Practices团队所开发的一个轻量级的，并且可扩展的依赖注入(Dependency Injection)容器，它支持常用的三种依赖注入方式：构造器注入(Constructor Injection)、属性注入(Property Injection)，以及方法调用注入(Method Call Injection).现在Unity最新的版本的1.2版，可以在微软的开源站点http://unity.codeplex.com下载最新的发布版本和文档。通过使用Unity，我们能轻松构建松耦合结构的程序，从而让整个程序框架变得清晰和易于维护。</p>
<p>在平常的软件编码过程中，程序的逻辑往往很复杂，尤其是大型项目的开发中，一个模块常常会去引用其他的模块，假设我们有一个监控器类，用来监控CPU的温度，当温度达到预警的范围时，监控器有一个报警的方法，方法里面通过短信提醒器，以发送短信的方式通知维护人员。于是就出现了下面这样一段最为常见的代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>       <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">   4:  </span>       {</pre>
<pre class="alt"><span class="lnum">   5:  </span>               SMSNotify notify = <span class="kwrd">new</span> SMSNotify();</pre>
<pre><span class="lnum">   6:  </span>               notify.Send();</pre>
<pre class="alt"><span class="lnum">   7:  </span>        }</pre>
<pre><span class="lnum">   8:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --> <!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>在Monitor类中，直接引用到了一个短信提醒器的类，这是最为不灵活和最不易于扩展的一种方式。或许我们想到了面向接口编程，利用多态的好处，可以提供灵活的不同子类的实现，增加代码扩展性等等。但是说到底，接口一定是需要实现的，也就是如下语句迟早要执行：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>       INotify notify = <span class="kwrd">new</span> SMSNotify();</pre>
<pre><span class="lnum">   4:  </span>       notify.Send();</pre>
<pre class="alt"><span class="lnum">   5:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>这样看来，在实现INotify这个接口的时候，仍然需要具体的类来实现，而这样的代码在程序编译的时候就已经固定下来，如果以后需要使用新的提醒器，仍旧需要修改源代码并重新编译。并且在我们的Monitor类中，明显依赖SMSNotify类，二者之间的耦合度非常紧密。因此Ioc(控制反转)模式被提出用来解决这种问题，也即把接口的具体实现延缓到运行时，接口的实现类是在运行时被装载的。这样，就算有了新的实现类，也不需要更改调用者的代码(可以在Unity中使用配置文件的方式实现)。这种Ioc模式可以被形象的比喻为：接口就像一个空壳，而在具体实现时，向这个空壳注入内容，而让它成为一个真正的实体。这种模式也被形象的称为：依赖注入。通过使用Unity，我们能构建松耦合的软件，并且对象之间相互关联的细节，我们也不必关心，可以交由依赖注入容器全权负责。</p>
<p>前面也提到了依赖注入常用的三种形式：构造器注入、属性注入和方法调用注入，我们可以通过例子来实现这三种形式的注入。还是以上面的场景为例，我们的几个类和接口如下图：</p>
<p><a href="/pics/unity/1.jpg"><img style="display: block; float: none; margin-left: auto; margin-right: auto; border-width: 0px;" title="1" src="/pics/unity/1.jpg" border="0" alt="1" width="551" height="334" /></a></p>
<p>1.Constructor Injection</p>
<p>IMonitor接口定义：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">void</span> Alarm();</pre>
<pre><span class="lnum">   4:  </span>}</pre>
</div>
<p>Monitor类：</p>
<div class="csharpcode">
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">private</span> INotify notify;</pre>
<pre><span class="lnum">   4:  </span></pre>
<pre class="alt"><span class="lnum">   5:  </span>    <span class="kwrd">public</span> Monitor(INotify n)</pre>
<pre><span class="lnum">   6:  </span>    {</pre>
<pre class="alt"><span class="lnum">   7:  </span>        notify = n;</pre>
<pre><span class="lnum">   8:  </span>    }</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">  11:  </span>    {</pre>
<pre><span class="lnum">  12:  </span>        notify.Send();</pre>
<pre class="alt"><span class="lnum">  13:  </span>    }</pre>
<pre><span class="lnum">  14:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>INotify接口定义：</p>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">interface</span> INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">void</span> Send();</pre>
<pre><span class="lnum">   4:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>EmailNotify类：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> EmailNotify : INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send Email Notify..."</span>);</pre>
<pre><span class="lnum">   6:  </span>    }</pre>
<pre class="alt"><span class="lnum">   7:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>SMSNotify类：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> SMSNotify : INotify</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Send()</pre>
<pre><span class="lnum">   4:  </span>    {</pre>
<pre class="alt"><span class="lnum">   5:  </span>        Console.WriteLine(<span class="str">"Send SMS Notify..."</span>);</pre>
<pre><span class="lnum">   6:  </span>    }</pre>
<pre class="alt"><span class="lnum">   7:  </span>}</pre>
</div>
<p><!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>可以看到，在Monitor类的构造函数里面，传入的参数是一个INotify接口类型，Alarm方法，调用了实现类的Send方法，但具体调用哪一个实现类的Send方法，只有在注入实体后才知道。Unity容器中，通常使用RegisterType和Resolve方法来分别注册和获取实例，并且这两个方法有很多泛型和非泛型的重载，具体的类型和参数，可以参考Unity的官方帮助文档。</p>
<p>现在我们向Monitor的构造函数注入实现INotify接口的实例:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   4:  </span>    container.RegisterType&lt;IMonitor, Monitor&gt;().RegisterType&lt;INotify, SMSNotify&gt;();</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>    IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre class="alt"><span class="lnum">   7:  </span>    monitor.Alarm();</pre>
<pre><span class="lnum">   8:  </span></pre>
<pre class="alt"><span class="lnum">   9:  </span>    Console.ReadLine();</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>代码中我们注入的INotify实例是SMSNotify类的实例，然后调用monitor.Alrarm()，里面会调用notify.Send().<br />
运行查看结果：<br />
<a href="/pics/unity/2.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="2" src="/pics/unity/2.jpg" border="0" alt="2" width="421" height="98" /></a><br />
上面是针对单个构造函数的情况，如果有多个构造函数，需要指明哪个构造函数是需要被注入的,也即需要在指定被注入的构造函数加上attribute:InjectionConstructor</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> Monitor(INotify n, <span class="kwrd">string</span> name)</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    notify = n;</pre>
<pre><span class="lnum">   4:  </span>}</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>[InjectionConstructor]</pre>
<pre class="alt"><span class="lnum">   7:  </span><span class="kwrd">public</span> Monitor(INotify n)</pre>
<pre><span class="lnum">   8:  </span>{</pre>
<pre class="alt"><span class="lnum">   9:  </span>    notify = n;</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行后可得到一样的结果.</p>
<p>2.Property Injection</p>
<p>通过属性注入，我们需要加上attribute: Dependency，使得Unity容器在获取类对象实例时，自动实例化该属性所依赖的对象，并注入到属性中。</p>
<p>修改Monitor类,实现下面的代码：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span><span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>{</pre>
<pre class="alt"><span class="lnum">   3:  </span>    [Dependency]</pre>
<pre><span class="lnum">   4:  </span>    <span class="kwrd">public</span> INotify Notify { get; set; }</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>    <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">   7:  </span>    {</pre>
<pre><span class="lnum">   8:  </span>        Notify.Send();</pre>
<pre class="alt"><span class="lnum">   9:  </span>    }</pre>
<pre><span class="lnum">  10:  </span>}</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --> <!--.csharpcode { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	background-color: #ffffff; font-family: consolas, "Courier New", courier, monospace; color: black; font-size: small } .csharpcode pre { 	margin: 0em } .csharpcode .rem { 	color: #008000 } .csharpcode .kwrd { 	color: #0000ff } .csharpcode .str { 	color: #006080 } .csharpcode .op { 	color: #0000c0 } .csharpcode .preproc { 	color: #cc6633 } .csharpcode .asp { 	background-color: #ffff00 } .csharpcode .html { 	color: #800000 } .csharpcode .attr { 	color: #ff0000 } .csharpcode .alt { 	background-color: #f4f4f4; margin: 0em; width: 100% } .csharpcode .lnum { 	color: #606060 } --></p>
<p>再在Main函数里面，修改原有的代码，这次我们让容器注入EmailNotify实例：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：<br />
<a href="/pics/unity/3.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="3" src="/pics/unity/3.jpg" border="0" alt="3" width="424" height="99" /></a> 还有一个比较方便的地方，可以为Dependency特性指定名称，这样，在注入时，会将RegisterType所指定的对应名称的实体进行注入，例如：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        [Dependency(<span class="str">"SMS"</span>)]</pre>
<pre><span class="lnum">   4:  </span>        <span class="kwrd">public</span> INotify Notify { get; set; }</pre>
<pre class="alt"><span class="lnum">   5:  </span></pre>
<pre><span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre class="alt"><span class="lnum">   7:  </span>        {</pre>
<pre><span class="lnum">   8:  </span>            Notify.Send();</pre>
<pre class="alt"><span class="lnum">   9:  </span>        }</pre>
<pre><span class="lnum">  10:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>修改Main函数，在RegisterType函数中指定注入名称:</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;(<span class="str">"Email"</span>);</pre>
<pre><span class="lnum">   2:  </span>            container.RegisterType&lt;INotify, SMSNotify&gt;(<span class="str">"SMS"</span>);</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：<br />
<a href="/pics/unity/2.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="2" src="/pics/unity/2.jpg" border="0" alt="2" width="421" height="98" /></a></p>
<p>3.Method Call Injection</p>
<p>Method Call Injection注入的时机和Constructor Injection有一定的区别，构造函数注入，是在容器创建实例的时候，而方法调用注入，是在方法被调用的时候。实现方法调用注入，需要在指定注入的方法前加上attribute: InjectionMethod</p>
<p>修改Monitor类的代码如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>    <span class="kwrd">public</span> <span class="kwrd">class</span> Monitor : IMonitor</pre>
<pre><span class="lnum">   2:  </span>    {</pre>
<pre class="alt"><span class="lnum">   3:  </span>        <span class="kwrd">private</span> INotify notify;</pre>
<pre><span class="lnum">   4:  </span></pre>
<pre class="alt"><span class="lnum">   5:  </span>        [InjectionMethod]</pre>
<pre><span class="lnum">   6:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> GetNotify(INotify n)</pre>
<pre class="alt"><span class="lnum">   7:  </span>        {</pre>
<pre><span class="lnum">   8:  </span>            notify = n;</pre>
<pre class="alt"><span class="lnum">   9:  </span>        }</pre>
<pre><span class="lnum">  10:  </span></pre>
<pre class="alt"><span class="lnum">  11:  </span>        <span class="kwrd">public</span> <span class="kwrd">void</span> Alarm()</pre>
<pre><span class="lnum">  12:  </span>        {</pre>
<pre class="alt"><span class="lnum">  13:  </span>            notify.Send();</pre>
<pre><span class="lnum">  14:  </span>        }</pre>
<pre class="alt"><span class="lnum">  15:  </span>    }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>在程序运行时，容器会自动实例化GetNotify方法所依赖的对象，并自动调用该方法，将其注入到方法中。</p>
<p>Main函数如下：</p>
<div class="csharpcode">
<pre class="alt"><span class="lnum">   1:  </span>        <span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)</pre>
<pre><span class="lnum">   2:  </span>        {</pre>
<pre class="alt"><span class="lnum">   3:  </span>            IUnityContainer container = <span class="kwrd">new</span> UnityContainer();</pre>
<pre><span class="lnum">   4:  </span>            container.RegisterType&lt;IMonitor, Monitor&gt;();</pre>
<pre class="alt"><span class="lnum">   5:  </span>            container.RegisterType&lt;INotify, EmailNotify&gt;();</pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span>            IMonitor monitor = container.Resolve&lt;IMonitor&gt;();</pre>
<pre><span class="lnum">   8:  </span>            monitor.Alarm();</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            Console.ReadLine();</pre>
<pre class="alt"><span class="lnum">  11:  </span>        }</pre>
</div>
<p><!--.csharpcode, .csharpcode pre { 	font-size: small; 	color: black; 	font-family: consolas, "Courier New", courier, monospace; 	background-color: #ffffff; 	/*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { 	background-color: #f4f4f4; 	width: 100%; 	margin: 0em; } .csharpcode .lnum { color: #606060; } --></p>
<p>运行查看结果：</p>
<p><a href="/pics/unity/3.jpg"><img style="display: block; margin-left: auto; margin-right: auto; border: 0px initial initial;" title="3" src="/pics/unity/3.jpg" border="0" alt="3" width="424" height="99" /></a></p>
<h3  class="related_post_title">你可能也对下列文章感兴趣</h3><ul class="related_post"><li>2009年04月28日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-3-life-cycle-management-2009-04-28.htm" title="Unity 学习笔记(3) &#8212; 生命周期管理">Unity 学习笔记(3) &#8212; 生命周期管理</a> (0)</li><li>2009年04月25日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-2-the-configuration-file-to-use-2009-04-25.htm" title="Unity 学习笔记(2) &#8212; 配置文件的使用">Unity 学习笔记(2) &#8212; 配置文件的使用</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/unity-study-notes-1-unity-introduction-and-easy-to-use-2009-04-23.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SQL中的日期计算</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/sql-in-date-calculations-2009-02-22.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/sql-in-date-calculations-2009-02-22.htm#comments</comments>
		<pubDate>Sun, 22 Feb 2009 17:29:01 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=205</guid>
		<description><![CDATA[这两天写一个和统计数据有关的存储过程，里面要利用日期进行一些计算和判断，也自然要利用SQL的一些日期相关的函数。这里略记一下，当是复习一下SQL。 利用SQL脚本内置的几个函数，我们能灵活的对日期进行计算和比较。常用的几个函数：GETDATE(),DATEDIFF(),DATEADD() GETDATE() 当然顾名思义，得到当前的日期，返回类型是DateTime类型。 DATEDIFF ( datepart , startdate , enddate ) 用于判断在两个日期之间存在的指定时间间隔的数目。 第一个参数是指定时间间隔的类型,例如mm(月),dd(天)，yy(年),ms(毫秒）,ss(秒），不同的间隔类型，返回的结果也不一样。 DATEADD (datepart , number, date ) 用于日期运算的函数，将传入的日期，加上指定时间间隔数目的日期。 &#160; 例如，计算得到本年的第一天： Sel&#101;ct DATEADD(yy, DATEDIFF(yy,0,getdate()), 0) 我们来分析下这个SQL语句就可以知道，首先从最里面的getdate()开始，getdate()得到当前日期和时间，外层的datediff，计算当前日期和1900-01-01 00:00:00之间的时间间隔，返回单位是以年来统计的，如果我们分开看DATEDIFF(yy,0,getdate()),0)的结果，返回就是:109。返回的109，传递给最外层的DATEADD函数，将1900-01-01 00：00：00加上109年，得到的结果，自然就是2009-01-01 00:00:00了，也即本年的第一天。 &#160; 同样，灵活的利用这几个函数的组合，我们可以得到不同的结果： 得到当月的第一天：Sel&#101;ct DATEADD(mm, DATEDIFF(mm,0,getdate()), 0) 得到当前季度的第一天：Sel&#101;ct DATEADD(qq, DATEDIFF(qq,0,getdate()), 0) 得到当天的起始时间： Sel&#101;ct DATEADD(dd, DATEDIFF(dd,0,getdate()), 0) 得到上个月最后一天： Sel&#101;ct DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)) 得到上个月的第一天： Sel&#101;ct DATEADD(m,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), [...]]]></description>
			<content:encoded><![CDATA[<p>这两天写一个和统计数据有关的存储过程，里面要利用日期进行一些计算和判断，也自然要利用SQL的一些日期相关的函数。这里略记一下，当是复习一下SQL。</p>
<p>利用SQL脚本内置的几个函数，我们能灵活的对日期进行计算和比较。常用的几个函数：GETDATE(),DATEDIFF(),DATEADD()</p>
<p>GETDATE() 当然顾名思义，得到当前的日期，返回类型是DateTime类型。</p>
<p>DATEDIFF ( datepart , startdate , enddate ) 用于判断在两个日期之间存在的指定时间间隔的数目。</p>
<p>第一个参数是指定时间间隔的类型,例如mm(月),dd(天)，yy(年),ms(毫秒）,ss(秒），不同的间隔类型，返回的结果也不一样。</p>
<p>DATEADD (datepart , number, date ) 用于日期运算的函数，将传入的日期，加上指定时间间隔数目的日期。</p>
<p>&#160;</p>
<p>例如，计算得到本年的第一天：</p>
<p>Sel&#101;ct DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)</p>
<p>我们来分析下这个SQL语句就可以知道，首先从最里面的getdate()开始，getdate()得到当前日期和时间，外层的datediff，计算当前日期和1900-01-01 00:00:00之间的时间间隔，返回单位是以年来统计的，如果我们分开看DATEDIFF(yy,0,getdate()),0)的结果，返回就是:109。返回的109，传递给最外层的DATEADD函数，将1900-01-01 00：00：00加上109年，得到的结果，自然就是2009-01-01 00:00:00了，也即本年的第一天。</p>
<p>&#160;</p>
<p>同样，灵活的利用这几个函数的组合，我们可以得到不同的结果：</p>
<p>得到当月的第一天：Sel&#101;ct DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)</p>
<p>得到当前季度的第一天：Sel&#101;ct DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)</p>
<p>得到当天的起始时间： Sel&#101;ct DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)</p>
<p>得到上个月最后一天： Sel&#101;ct DATEADD(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))</p>
<p>得到上个月的第一天： Sel&#101;ct DATEADD(m,-1,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))</p>
<p>其原理就是得到当月第一天，再减去三毫秒(SQL的时间以3毫秒为一个单位)，这样以当前为2月，得到的结果就是：2009-01-31 23:59:59.997</p>
<p>得到去年的最后一天： Sel&#101;ct DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))</p>
<p>得到本月的最后一天： Sel&#101;ct DATEADD(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))</p>
<p>得到本年的最后一天： Sel&#101;ct DATEADD(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))</p>
<p>得到本月的第一个星期一： Sel&#101;ct DATEADD(wk, DATEDIFF(wk,0,DATEADD(dd,6-datepart(day,getdate()),getdate())), 0) </p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2005年01月11日 -- <a href="http://www.xiaozhou.net/vcdevelopment/customize-your-own-exe-file-2005-01-11.htm" title="定制自己的EXE文件">定制自己的EXE文件</a> (0)</li><li>2004年12月29日 -- <a href="http://www.xiaozhou.net/vcdevelopment/the-difference-between-heap-and-stack-2004-12-29.htm" title="堆和栈的区别">堆和栈的区别</a> (0)</li><li>2006年07月16日 -- <a href="http://www.xiaozhou.net/aboutsite/sitelog/today-the-blog-interface-updates-2006-07-16.htm" title="今天把Blog界面更新了">今天把Blog界面更新了</a> (0)</li><li>2009年10月25日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/first_article_on_wordpress-2009-10-25.htm" title="WordPress下的第一篇日志 :-)">WordPress下的第一篇日志 :-)</a> (7)</li><li>2006年07月17日 -- <a href="http://www.xiaozhou.net/myworks/vc-insignificant-skills-analog-msn-splash-screen-effect-2006-07-17.htm" title="VC雕虫小技：模拟MSN闪屏效果">VC雕虫小技：模拟MSN闪屏效果</a> (1)</li><li>2009年04月21日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/wap-access-is-available-2009-04-21.htm" title="WAP Access is available!">WAP Access is available!</a> (0)</li><li>2010年05月2日 -- <a href="http://www.xiaozhou.net/ittech/linux-ittech/ubuntu_10_04_lts_installation_and_experience-2010-05-02.htm" title="Ubuntu 10.04 LTS 安装手记及体验">Ubuntu 10.04 LTS 安装手记及体验</a> (14)</li><li>2007年09月23日 -- <a href="http://www.xiaozhou.net/ittech/hardware/books-disassemble-gong-lue-2007-09-23.htm" title="本本拆机攻略">本本拆机攻略</a> (1)</li><li>2007年07月18日 -- <a href="http://www.xiaozhou.net/essay/book-promotion-2007-07-18.htm" title="新书推介">新书推介</a> (0)</li><li>2005年06月21日 -- <a href="http://www.xiaozhou.net/myworks/mydetective-v1-0-2005-06-21.htm" title="MyDetective V1.0">MyDetective V1.0</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/sql-in-date-calculations-2009-02-22.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Host WCF Service in WAS</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/host-wcf-service-in-was-2008-11-24.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/host-wcf-service-in-was-2008-11-24.htm#comments</comments>
		<pubDate>Mon, 24 Nov 2008 23:15:36 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=202</guid>
		<description><![CDATA[WAS 是 Windows (Process) Activation Service 的缩写,是Windows Vista中所新增的一种进程宿主模型。WAS作为 IIS7.0 特有的新增功能，和以前IIS 6.0的功能相比更加强大，因为它提供并支持除HTTP之外的更多协议，比如TCP方式和Pipe(管道)方式。以下的文中，都把Windows (Process) Activation Service简称为WAS。利用WAS作为WCF(Windows Communication Foundation)的宿主，我们能充分利用WAS的很多优点，因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点，也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。本文也简单向大家分享一下怎样使用WAS来作为WCF Service的宿主。 以往的部署WCF Service的方式，大家一般会想到以下几种： 1. 使用WinForm或者控制台程序作为宿主 2. 使用Windows Service作为宿主 不管我们用怎样的方式来作为WCF Service的宿主，少不了的麻烦，都是需要单独编写Host程序，除此之外，就该轮到WAS了。WAS在Vista中，其实是由一个单独的Windows Service来实现的，如果我们仔细找找，就能找到，Windows Service的名称，就叫做&#34;Windows Process Activation Service&#34;。由此看来，WAS的进程和IIS进程在物理上是隔离开的，能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制，大致和ASMX WebService类似。 简单了解了WAS的特性，下面我们用一个netTcpBinding的WCF示例来演示怎样利用WAS来Host WCF Service: 首先，我们需要查看Vista的组件中，是否打开了WAS的功能，打开控制面板，打开“程序和功能”对话框，在&#34;打开/关闭 Windows功能&#34;对话框中，确保下面图中的功能项被打开： 其实在这一部操作之后，windows会自动帮我们在IIS中做好配置，不过为了放心，我们还是打开IIS确认一下设置是否正确。 首先是检查IIS站点中的绑定： 确保net.tcp方式，绑定到808端口 打开站点的高级设置，确认&#34;已启用的协议&#34;中，填有&#34;net.tcp&#34;，没有的话，可以补上。 然后是建立应用程序目录，这个目录等下会用来部署WCF的Service端程序。建立好目录后，也在&#34;高级设置&#8211;已启用的协议&#34;中，填上net.tcp 到这里，基本的host环境我们已经设置好了。下面来实现我们的服务端和客户端。 建立Contract [code] [ServiceContract] public interface IService1 { [OperationContract] string [...]]]></description>
			<content:encoded><![CDATA[<p>WAS 是 Windows (Process) Activation Service 的缩写,是Windows Vista中所新增的一种进程宿主模型。WAS作为 IIS7.0 特有的新增功能，和以前IIS 6.0的功能相比更加强大，因为它提供并支持除HTTP之外的更多协议，比如TCP方式和Pipe(管道)方式。以下的文中，都把Windows (Process) Activation Service简称为WAS。利用WAS作为WCF(Windows Communication Foundation)的宿主，我们能充分利用WAS的很多优点，因为我们再也不用为非HTTP方式的WCF Service单独编写宿主程序了。而WAS本身的特点，也让我们的服务端程序能享受到只有以往的HTTP方式的WCF Service才能拥有的很多特性。本文也简单向大家分享一下怎样使用WAS来作为WCF Service的宿主。</p>
<p>以往的部署WCF Service的方式，大家一般会想到以下几种：<br />
	1. 使用WinForm或者控制台程序作为宿主<br />
	2. 使用Windows Service作为宿主<br />
不管我们用怎样的方式来作为WCF Service的宿主，少不了的麻烦，都是需要单独编写Host程序，除此之外，就该轮到WAS了。WAS在Vista中，其实是由一个单独的Windows Service来实现的，如果我们仔细找找，就能找到，Windows Service的名称，就叫做&#34;Windows Process Activation Service&#34;。由此看来，WAS的进程和IIS进程在物理上是隔离开的，能为我们提供一个灵活、稳定的WCF Service宿主环境。WAS内部的工作机制，大致和ASMX WebService类似。</p>
<p>简单了解了WAS的特性，下面我们用一个netTcpBinding的WCF示例来演示怎样利用WAS来Host WCF Service:</p>
<p>首先，我们需要查看Vista的组件中，是否打开了WAS的功能，打开控制面板，打开“程序和功能”对话框，在&#34;打开/关闭 Windows功能&#34;对话框中，确保下面图中的功能项被打开：</p>
<p><img src="/pics/wcf1.jpg" border="0" alt=""/></p>
<p>其实在这一部操作之后，windows会自动帮我们在IIS中做好配置，不过为了放心，我们还是打开IIS确认一下设置是否正确。</p>
<p>首先是检查IIS站点中的绑定：</p>
<p><img src="/pics/wcf2.jpg" border="0" alt=""/></p>
<p>确保net.tcp方式，绑定到808端口</p>
<p>打开站点的高级设置，确认&#34;已启用的协议&#34;中，填有&#34;net.tcp&#34;，没有的话，可以补上。</p>
<p><img src="/pics/wcf3.jpg" border="0" alt=""/></p>
<p>然后是建立应用程序目录，这个目录等下会用来部署WCF的Service端程序。建立好目录后，也在&#34;高级设置&#8211;已启用的协议&#34;中，填上net.tcp</p>
<p>到这里，基本的host环境我们已经设置好了。下面来实现我们的服务端和客户端。</p>
<p>建立Contract<br />
[code]<br />
         [ServiceContract]<br />
    public interface IService1<br />
    {<br />
        [OperationContract]<br />
        string SayHello(string value);<br />
    }<br />
[/code]</p>
<p>实现简单的Service类<br />
[code]<br />
    public class Service1 : IService1<br />
    {<br />
        public string SayHello(string value)<br />
        {<br />
            return string.Format(&#34;Hello,{0}&#34;, value);<br />
        }<br />
    }<br />
[/code]</p>
<p>建立svc文件<br />
[code]<br />
<%@ ServiceHost Language=&#34;C#&#34; Debug=&#34;true&#34; Service=&#34;WCFLibrary.Service1&#34; CodeBehind=&#34;./App_Data/Service1.cs&#34; %><br />
[/code]</p>
<p>服务端的WCF配置<br />
[code]<br />
<system.serviceModel><br />
    <bindings><br />
      <netTcpBinding><br />
        <binding name=&#34;NetTcpBinding&#34;><br />
          <security mode=&#34;None&#34; /><br />
        </binding><br />
      </netTcpBinding><br />
    </bindings><br />
    <services><br />
      <service behaviorConfiguration=&#34;WCFLibrary.Service1Behavior&#34; name=&#34;WCFLibrary.Service1&#34;><br />
        <endpoint binding=&#34;netTcpBinding&#34;<br />
          bindingConfiguration=&#34;NetTcpBinding&#34; contract=&#34;WCFLibrary.IService1&#34;><br />
          <identity><br />
            <dns value=&#34;localhost&#34; /><br />
          </identity><br />
        </endpoint><br />
        <endpoint contract=&#34;IMetadataExchange&#34; binding=&#34;mexTcpBinding&#34; address=&#34;mex&#34; /><br />
        <host><br />
          <baseAddresses><br />
            <add baseAddress=&#34;net.tcp://Timothy-T61/WCFService/HelloService.svc&#34; /><br />
          </baseAddresses><br />
        </host><br />
      </service><br />
    </services><br />
    <behaviors><br />
      <serviceBehaviors><br />
        <behavior name=&#34;WCFLibrary.Service1Behavior&#34;><br />
          <serviceMetadata httpGetEnabled=&#34;false&#34; /><br />
          <serviceDebug includeExceptionDetailInFaults=&#34;false&#34; /><br />
        </behavior><br />
      </serviceBehaviors><br />
    </behaviors><br />
  </system.serviceModel><br />
</configuration><br />
[/code]</p>
<p>其实endpoint只需要一个即可，为了方便通过svcutil.exe生成客户端代理，需要通过另外一个endpoint的mexTcpBinding来暴露元数据。这样当服务在发布好的时候，我们可以通过<br />
Svcutil.exe net.tcp://Timothy-T61/WCFService/HelloService.svc/mex 来生成客户端代理了。</p>
<p>完成服务端的编写，直接将服务端程序，部署到刚才在IIS中添加的应用程序目录中。</p>
<p>客户端的wcf配置如下：<br />
[code]<br />
    <system.serviceModel><br />
        <bindings><br />
            <netTcpBinding><br />
                <binding name=&#34;ClientBinding&#34;><br />
                    <security mode=&#34;None&#34; /><br />
                </binding><br />
            </netTcpBinding><br />
        </bindings><br />
        <client><br />
            <endpoint address=&#34;net.tcp://timothy-t61/WCFService/HelloService.svc&#34; binding=&#34;netTcpBinding&#34;<br />
                bindingConfiguration=&#34;ClientBinding&#34; contract=&#34;WCFLibrary.IService1&#34; /><br />
        </client><br />
    </system.serviceModel></p>
<p>[/code]</p>
<p>客户端拖放一个按钮，添加如下代码:<br />
[code]<br />
 private void button1_Click(object sender, EventArgs e)<br />
        {<br />
            ClientProxy client = new ClientProxy();<br />
            MessageBox.Show(client.SayHello(&#34;Timothy!&#34;));<br />
        }<br />
[/code]</p>
<p>一切就绪，运行程序，点击按钮:</p>
<p><img src="/pics/wcf4.jpg" border="0" alt=""/></p>
<p>没有单独编写host程序，通过WAS，我们的服务端正常运行了。</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2010年06月23日 -- <a href="http://www.xiaozhou.net/ittech/iphone-tips/iphone_upgrade_to_os_4_0-2010-06-23.htm" title="iPhone更新至OS 4.0">iPhone更新至OS 4.0</a> (4)</li><li>2009年02月22日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/sql-in-date-calculations-2009-02-22.htm" title="SQL中的日期计算">SQL中的日期计算</a> (0)</li><li>2007年09月22日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/net-development-frequently-asked-questions-2-2007-09-22.htm" title=".NET开发常见问题两则">.NET开发常见问题两则</a> (1)</li><li>2005年01月31日 -- <a href="http://www.xiaozhou.net/vcdevelopment/according-to-the-paper-handle-obtain-the-file-name-2005-01-31.htm" title="根据文件句柄，获取文件名">根据文件句柄，获取文件名</a> (2)</li><li>2008年07月3日 -- <a href="http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-update-and-management-of-conflict-2008-07-03.htm" title="Linq to SQL 的更新冲突与管理">Linq to SQL 的更新冲突与管理</a> (0)</li><li>2004年09月7日 -- <a href="http://www.xiaozhou.net/vcdevelopment/disassembly-operations-increment-analysis-2004-09-07.htm" title="自增操作的反汇编分析">自增操作的反汇编分析</a> (0)</li><li>2005年10月31日 -- <a href="http://www.xiaozhou.net/essay/thoughts-on-mvp-2005-10-31.htm" title="MVP有感">MVP有感</a> (0)</li><li>2004年10月16日 -- <a href="http://www.xiaozhou.net/vcdevelopment/shielding-win-alt-tab-ctrl-esc-key-low-level-keyboard-hook-2004-10-16.htm" title="屏蔽WIN、ALT+TAB、CTRL+ESC键的低级键盘钩子">屏蔽WIN、ALT+TAB、CTRL+ESC键的低级键盘钩子</a> (0)</li><li>2010年07月3日 -- <a href="http://www.xiaozhou.net/blackberry/blackberry_rom_update_to_os5_0_0_681-2010-07-03.htm" title="BlackBerry 系统刷至OS5.0.0.681">BlackBerry 系统刷至OS5.0.0.681</a> (2)</li><li>2005年11月11日 -- <a href="http://www.xiaozhou.net/vcdevelopment/gradient-translucent-window-effect-of-2005-11-11.htm" title="半透明渐变的窗口效果">半透明渐变的窗口效果</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/host-wcf-service-in-was-2008-11-24.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Linq to SQL 的更新冲突与管理</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-update-and-management-of-conflict-2008-07-03.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-update-and-management-of-conflict-2008-07-03.htm#comments</comments>
		<pubDate>Thu, 03 Jul 2008 01:37:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=193</guid>
		<description><![CDATA[前段时间工作中的一个新需求，有机会用到了Linq to SQL。使用后的第一感觉，就是方便很多，也为整个项目节约了一大把的开发时间，甚至代码量也少了很多。不过在程序的实际运行中，始终会遇到一些莫名其妙的异常，最令人不解的，就是“System.Data.Linq.ChangeConflictException: Row not found o&#114; changed.” 。当初凭自己和同事的判断，可能是数据库的数据异常所导致，后来发觉这个异常出现得越来越频繁，于是上MSDN查了查，原来是Linq中一个常见的问题：更新冲突。 这个词说起来比较玄乎，其实再平常不过了。下面可以通过一个简单的例子，来重现这个异常。 建立一个普通的测试表：LinqTest(如图) 在测试表中，插入一条测试数据(如图) 测试代码如下： [code] namespace LinqTest { class Program { static void Main(string[] args) { TestDataContext db = new TestDataContext(); db.Log = Console.Out; var result = from p in db.LinqTests wh&#101;re p.ID == 1 sel&#101;ct p; var info = result.FirstOrDefault(); if(info != null) //插入断点 { [...]]]></description>
			<content:encoded><![CDATA[<p>前段时间工作中的一个新需求，有机会用到了Linq to SQL。使用后的第一感觉，就是方便很多，也为整个项目节约了一大把的开发时间，甚至代码量也少了很多。不过在程序的实际运行中，始终会遇到一些莫名其妙的异常，最令人不解的，就是“System.Data.Linq.ChangeConflictException: Row not found o&#114; changed.” 。当初凭自己和同事的判断，可能是数据库的数据异常所导致，后来发觉这个异常出现得越来越频繁，于是上MSDN查了查，原来是Linq中一个常见的问题：更新冲突。<br />
   这个词说起来比较玄乎，其实再平常不过了。下面可以通过一个简单的例子，来重现这个异常。<br />
   建立一个普通的测试表：LinqTest(如图)</p>
<p>   <img src="/pics/linq1.jpg" border="0" alt=""/></p>
<p>     在测试表中，插入一条测试数据(如图)</p>
<p>    <img src="/pics/linq2.jpg" border="0" alt=""/></p>
<p>     测试代码如下：</p>
<p>   [code]<br />
namespace LinqTest<br />
{<br />
    class Program<br />
    {<br />
        static void Main(string[] args)<br />
        {</p>
<p>            TestDataContext db = new TestDataContext();</p>
<p>            db.Log = Console.Out;<br />
            var result = from p in db.LinqTests<br />
                         wh&#101;re p.ID == 1<br />
                         sel&#101;ct p;</p>
<p>            var info = result.FirstOrDefault();</p>
<p>            if(info != null)     //插入断点<br />
            {<br />
                info.Age = 25;<br />
                db.SubmitChanges();<br />
            }</p>
<p>            Console.ReadLine();</p>
<p>        }</p>
<p>    }</p>
<p>}<br />
    [/code]</p>
<p>    在测试代码中，将DataContext的日志定向到Console的输出部分，这样方便我们观察Linq实际执行的SQL语句是什么。重现的时候，我们需要在注释的地方，插入断点进行测试。对于示例中的代码，在正常情况下，是不会有错误的。执行过后，我们可以在Console的输出中，看到实际执行的SQL语句(如图)</p>
<p><img src="/pics/linq4.jpg" border="0" alt=""/></p>
<p>   再进行第二次调试，首先，恢复Age的数据到以前的样子。下面我们运行到断点处，然后偷偷去SQL Server Management Studio中，手动修改数据，将原始数据中的Age，由24，改为22。然后回到VS2008的IDE，按F5继续运行程序，这个时候，你会发现异常出现了(如图)</p>
<p><img src="/pics/linq3.jpg" border="0" alt=""/></p>
<p>    再回到Console的输出，查看，执行的SQL语句和刚才的一样。这就是问题的所在，在正常运行状态下，Linq在运行时，会把数据库的数据缓存到实体对象中，这是一种理想化的情况，并且在更新时，Linq会默认把除更新字段外的所有字段，作为Up&#100;ate语句中的Wh&#101;re条件。但是，如果此时有另外的程序，在访问数据库，并修改数据库数据的时候，比如刚才把Age改为22。此时Linq缓存起来的数据和实际数据库中的数据产生了不一致的情况。Linq此时仍然把被修改过的字段，作为Up&#100;ate的Wh&#101;re条件，但是数据库中Age早就被我们改过了，不再是25，Wh&#101;re条件始终匹配不到原有的数据。这时，就会抛出所谓的：“System.Data.Linq.ChangeConflictException: Row not found o&#114; changed.”异常。</p>
<p>    产生此异常，主要是Linq缓存数据和实际数据库数据不一致的情况造成。解决次问题的情况，主要有几种：</p>
<p>    1.比较简单的方法，不使用Linq提供的SubmitChanges()方式提交更改，而直接执行SQL语句，例如：<br />
     db.ExecuteCommand(&#34;Up&#100;ate [dbo].[LinqTest] SET Age=25 Wh&#101;re ID = @p0&#34;, 1);<br />
    这样虽然比较方便，但是感觉又回到了直接写SQL的时代，毕竟Linq to SQL的目的，就是为了让我们看不见SQL，避免写复杂的SQL语句，而直接操作实体对象，这样也可以避免程序可读性差、不便于维护。所以除非万不得已，还是不太推荐使用此方法。</p>
<p>    2.参考MSDN的资料，采用Linq提供的解决更新冲突的方法，在异常中捕获冲突，然后手动解决冲突：<br />
 [code]<br />
try<br />
{<br />
    db.SubmitChanges(System.Data.Linq.ConflictMode.ContinueOnConflict);<br />
}<br />
catch (System.Data.Linq.ChangeConflictException ex)<br />
{<br />
    foreach (System.Data.Linq.ObjectChangeConflict occ in db.ChangeConflicts)<br />
    {<br />
         //以下是解决冲突的三种方法，选一种即可</p>
<p>        // 使用当前数据库中的值，覆盖Linq缓存中实体对象的值<br />
        occ.Resolve(System.Data.Linq.RefreshMode.OverwriteCurrentValues);</p>
<p>        // 使用Linq缓存中实体对象的值，覆盖当前数据库中的值<br />
        occ.Resolve(System.Data.Linq.RefreshMode.KeepCurrentValues);</p>
<p>        // 只更新实体对象中改变的字段的值，其他的保留不变<br />
        occ.Resolve(System.Data.Linq.RefreshMode.KeepChanges);<br />
    }</p>
<p>    // 这个地方要注意，Catch方法中，我们前面只是指明了怎样来解决冲突，这个地方还需要再次提交更新，这样的话，值    //才会提交到数据库。<br />
    db.SubmitChanges();<br />
}</p>
<p>[/code]</p>
<p>    3. 这个方法也比较简单，也即MSDN中所说的Pessimistic Concurrency Control  。 我们可以来设定哪些字段需要放入Wh&#101;re条件，哪些字段不需要，这样就可以控制更新时候的条件匹配尺度。具体做法，就是在Linq to SQL Designer中，把一些字段的Up&#100;ateCheck属性设置为Never，这样，这些字段在更新的时候，就不会再出现在Wh&#101;re条件中了。其实比较推荐的做法，就是在表中设立主键，因为更新的时候，只要把主键作为Wh&#101;re条件，就可以单独的确立一行数据了。把除主键外的字段属性中Up&#100;ateCheck设置为Never即可。</p>
<p>关于Linq to SQL中如何管理更改冲突的更多资料，可以在MSDN找到</p>
<p>http://msdn.microsoft.com/zh-cn/library/bb399389.aspx</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2010年07月22日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/modification_of_wp-reader-wall_to_fit_wordpress-3-0-2010-07-22.htm" title="WP-Reader-Wall 插件兼容 WordPress 3.0的修改">WP-Reader-Wall 插件兼容 WordPress 3.0的修改</a> (8)</li><li>2009年12月25日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/mobilepress_plugin_updated-2009-12-25.htm" title="手机版博客更新了插件">手机版博客更新了插件</a> (8)</li><li>2005年11月14日 -- <a href="http://www.xiaozhou.net/vcdevelopment/vc-using-flash-control-play-flash-2005-11-14.htm" title="VC中用Flash Control播放FLASH">VC中用Flash Control播放FLASH</a> (2)</li><li>2005年01月19日 -- <a href="http://www.xiaozhou.net/vcdevelopment/hotkey-program-implementation-2005-01-19.htm" title="程序热键的实现">程序热键的实现</a> (0)</li><li>2005年12月27日 -- <a href="http://www.xiaozhou.net/essay/psalm-23-2005-12-27.htm" title="诗篇23篇">诗篇23篇</a> (1)</li><li>2009年03月7日 -- <a href="http://www.xiaozhou.net/ittech/software/microsoft-my-phone-experience-2009-03-07.htm" title="Microsoft My Phone 体验">Microsoft My Phone 体验</a> (0)</li><li>2005年06月16日 -- <a href="http://www.xiaozhou.net/vcdevelopment/set-nic-can-receive-all-ip-data-promiscuous-mode-2005-06-16.htm" title="设置网卡可以接收所有IP的数据(混杂模式)">设置网卡可以接收所有IP的数据(混杂模式)</a> (0)</li><li>2007年02月8日 -- <a href="http://www.xiaozhou.net/myworks/vc-management-system-to-do-2007-02-08.htm" title="VC做的管理系统">VC做的管理系统</a> (0)</li><li>2007年06月30日 -- <a href="http://www.xiaozhou.net/essay/small-fu-is-very-hurt-2007-06-30.htm" title="小福很受伤">小福很受伤</a> (2)</li><li>2006年05月18日 -- <a href="http://www.xiaozhou.net/myworks/mysnake-my-snake-2006-05-18.htm" title="MySnake 我的贪吃蛇">MySnake 我的贪吃蛇</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/linq-to-sql-update-and-management-of-conflict-2008-07-03.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.net 2.0中水晶报表迁移部署问题</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/asp-net-2-0-deployment-in-crystal-reports-migration-2007-10-14.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/asp-net-2-0-deployment-in-crystal-reports-migration-2007-10-14.htm#comments</comments>
		<pubDate>Sun, 14 Oct 2007 14:44:46 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=179</guid>
		<description><![CDATA[asp.net 2.0的水晶报表，在迁移机器的时候，如果目标机器没有相应的程序集，在IIS中会报错。 错误描述： Parser Error Description: An error occurred during the parsing of a resource required to service this request. Please review the following specific parse error details and modify your source file appropriately. Parser Error Message: Could not load file o&#114; assembly &#39;Microsoft.ReportViewer.WebForms, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&#39; o&#114; one of its dependencies. The system cannot [...]]]></description>
			<content:encoded><![CDATA[<p>asp.net 2.0的水晶报表，在迁移机器的时候，如果目标机器没有相应的程序集，在IIS中会报错。<br />
错误描述：</p>
<p>Parser Error<br />
Description: An error occurred during the parsing of a resource required to service this<br />
request. Please review the following specific parse error details and modify your source file<br />
 appropriately.</p>
<p>Parser Error Message: Could not load file o&#114; assembly &#39;Microsoft.ReportViewer.WebForms,<br />
 Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&#39; o&#114; one of its<br />
 dependencies. The system cannot find the file specified.</p>
<p>【解决方法】</p>
<p>进入你的开发使用机器的c:\windows\assembly目录查看，是否有以下程序集安装在GAC中（如图）：</p>
<p><img src="/pics/report1.jpg" border="0" alt=""/></p>
<p>由于资源管理器是使用了shell扩展来查看GAC中安装的程序集，所以我们无法看到这些程序集当前部署的真实目录在什么地方。我们可以直接在命令行模式中进行查看，进入X:\windows\assembly目录，然后查找和水晶报表相关的程序目录（如图）：</p>
<p><img src="/pics/report2.jpg" border="0" alt=""/></p>
<p>我们可以大致看到GAC的部署结构了。我们在浏览器中所看到的一个一个的assembly名称，其实对应于assembly目录下面的每一个目录命名。进入具体的目录，还有一级子目录，这个目录的命名，是根据发布到GAC的程序集的版本号加上后面的公钥标记组成。（见上图的下面的红色标记部分）</p>
<p>再进入子目录，我们就可以看到公有部署的程序集，所存在的真正位置了。（如图）：</p>
<p><img src="/pics/report3.jpg" border="0" alt=""/></p>
<p>接下来的工作就好办了，拷贝程序集到目标机器上，然后运行gacutil /i filename，将程序集安装到GAC即可。需要拷贝的程序集如下：</p>
<p>1) Microsoft.ReportViewer.Common.dll</p>
<p>2) Microsoft.ReportViewer.ProcessingObjectModel.dll</p>
<p>3) Microsoft.ReportViewer.WebForms.dll</p>
<h3  class="related_post_title">随机日志</h3><ul class="related_post"><li>2004年12月21日 -- <a href="http://www.xiaozhou.net/vcdevelopment/simplified-traditional-use-api-to-achieve-the-conversion-2004-12-21.htm" title="用API实现繁体简体的转换">用API实现繁体简体的转换</a> (0)</li><li>2007年12月23日 -- <a href="http://www.xiaozhou.net/essay/accident-2007-12-23.htm" title="意外">意外</a> (0)</li><li>2008年03月29日 -- <a href="http://www.xiaozhou.net/myworks/dynamic-plugins-manager-2-configuration-and-implementation-of-analysis-2008-03-29.htm" title="Dynamic Plugins Manager (二) 配置及实现分析">Dynamic Plugins Manager (二) 配置及实现分析</a> (0)</li><li>2006年07月16日 -- <a href="http://www.xiaozhou.net/aboutsite/sitelog/today-the-blog-interface-updates-2006-07-16.htm" title="今天把Blog界面更新了">今天把Blog界面更新了</a> (0)</li><li>2006年01月27日 -- <a href="http://www.xiaozhou.net/ittech/hardware/testing-wireless-desktop-elite-package-2006-01-27.htm" title="测试 Wireless Desktop Elite套件">测试 Wireless Desktop Elite套件</a> (0)</li><li>2004年10月26日 -- <a href="http://www.xiaozhou.net/vcdevelopment/dynamically-loaded-dll-2004-10-26.htm" title="动态加载DLL">动态加载DLL</a> (0)</li><li>2009年04月21日 -- <a href="http://www.xiaozhou.net/aboutsite/wordpress/wap-access-is-available-2009-04-21.htm" title="WAP Access is available!">WAP Access is available!</a> (0)</li><li>2009年11月17日 -- <a href="http://www.xiaozhou.net/ittech/software/problem_of_win7_gadget_weather_plugin-2009-11-17.htm" title="关于Win7 天气插件的问题">关于Win7 天气插件的问题</a> (4)</li><li>2010年07月6日 -- <a href="http://www.xiaozhou.net/ittech/vps-ittech/album_moved_into_linode-2010-07-06.htm" title="相册搬迁到Linode">相册搬迁到Linode</a> (10)</li><li>2005年04月2日 -- <a href="http://www.xiaozhou.net/vcdevelopment/browse-dialog-box-call-to-achieve-2005-04-02.htm" title="浏览对话框的调用实现">浏览对话框的调用实现</a> (2)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/asp-net-2-0-deployment-in-crystal-reports-migration-2007-10-14.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
