﻿<?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>Fri, 03 Feb 2012 17:24:38 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>WCF service host 崩溃退出的异常</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/crash_issue_of_wcf_service_host-2011-11-08.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/crash_issue_of_wcf_service_host-2011-11-08.htm#comments</comments>
		<pubDate>Tue, 08 Nov 2011 14:19:21 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[host]]></category>
		<category><![CDATA[issue]]></category>
		<category><![CDATA[service]]></category>
		<category><![CDATA[wcf]]></category>
		<category><![CDATA[崩溃]]></category>
		<category><![CDATA[异常]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/?p=1297</guid>
		<description><![CDATA[最近在公司项目中，遇到莫名其妙的异常，就是当使用Windows Service作为WCF服务端宿主程序，并且使用netTcpBinding的时候，Windows服务会时不时的Crash掉。通过分析处理UnHandledException记录下的日志，异常信息大致如下： [10/26/11 10:10:16.011],[35],ERROR,&#8221;Encountered an unhandled thread exception: System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was &#8217;10675199.02:48:05.4775807&#8242;. &#8212;> System.IO.IOException: The read operation failed, see inner exception. &#8212;> [...]]]></description>
			<content:encoded><![CDATA[<p>最近在公司项目中，遇到莫名其妙的异常，就是当使用Windows Service作为WCF服务端宿主程序，并且使用netTcpBinding的时候，Windows服务会时不时的Crash掉。通过分析处理UnHandledException记录下的日志，异常信息大致如下：</p>
<p>[10/26/11 10:10:16.011],[35],ERROR,&#8221;Encountered an unhandled thread exception: System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was &#8217;10675199.02:48:05.4775807&#8242;. &#8212;> System.IO.IOException: The read operation failed, see inner exception. &#8212;> System.ServiceModel.CommunicationException: The socket connection was aborted. This could be caused by an error processing your message or a receive timeout being exceeded by the remote host, or an underlying network resource issue. Local socket timeout was &#8217;10675199.02:48:05.4775807&#8242;. &#8212;> System.Net.Sockets.SocketException: An existing connection was forcibly closed by the remote host <span id="more-1297"></span></p>
<p>这个issue比较怪异，网上google了一大圈，遇到此类问题的童鞋还真不少。不过解决方法，提到的是放弃使用netTcpBinding，采用HttpBinding或者其他方式的binding即可解决。也没说具体是啥原因，不过，最后终于在Microsoft的网站上找到了答案，原来Microsoft承认这是.NET Framework的bug。并且提供了一个hot  fix供下载，hot fix是针对.NET 3.5的，而这个bug貌似在.NET Framework 4.0中也会遇到。因为我们公司的项目就是.NET 4.0的⋯⋯</p>
<p>有人在微软的网站反馈了此问题，帖子在这里：http://connect.microsoft.com/wcf/feedback/details/622164/wcf-servicehost-crashes-when-usernamepasswordvalidator-takes-too-long-to-process</p>
<p>微软提供的hot fix地址：http://support.microsoft.com/kb/2600907</p>
<p>不过针对.NET 4.0的hot fix，不知道是微软没出，还是仍旧在解决中⋯⋯ 反正帖子里面的答复，是说会在下一个版本的.NET Framework中解决，难道是.NET 5.0中么？ 汗⋯⋯</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/crash_issue_of_wcf_service_host-2011-11-08.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>WCF进行大数据传输时的相关配置</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/transfer_large_objects_between_server_and_client_using_wcf-2011-07-14.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/transfer_large_objects_between_server_and_client_using_wcf-2011-07-14.htm#comments</comments>
		<pubDate>Thu, 14 Jul 2011 14:33:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[wcf]]></category>
		<category><![CDATA[传输]]></category>
		<category><![CDATA[大数据]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/wcf%e8%bf%9b%e8%a1%8c%e5%a4%a7%e6%95%b0%e6%8d%ae%e4%bc%a0%e8%be%93%e6%97%b6%e7%9a%84%e7%9b%b8%e5%85%b3%e9%85%8d%e7%bd%ae-2011-07-14.htm</guid>
		<description><![CDATA[最近一直在公司用WCF做server端，后来在做性能测试时，发现一个问题，当客户端从服务端取回一个实体对象列表时，触发了channel is faulted status的异常。 仔细分析了下这个异常，应该是传递大数据造成的，因为在回传一个包含有100多个实体对象的列表时，客户端表现正常，而当回传的实体对象列表数目达到500+时，异常就出现了。 其实WCF还是做得比较灵活的，基本所有的配置项都放在程序的app.config文件里面，改动相应参数时，不需要重新编译程序。而WCF设计的初衷，为了避免DOS一类的攻击，默认在生成配置文件时，对传输的buffer数值有一定的限制，默认是65535，也就是64KB。然而在一些特定的应用场景中，区区64KB的buffer是不能满足我们需要的。这就需要我们手动在配置文件中调整buffer的size。 在配置文件中需要调整的一些参数，大致有下面几种： WCF binding中的maxBufferSize, maxReceivedMessageSize WCF binding ReaderQuotas中的maxArrayLength, maxBytesPerRead, maxDepth等 在一些比较极端的场景中，我们可以把它设到最大2147483647，也就是约等于2GB大小的buffer。嗯，我想，除非你是用WCF来传输1080P的高清电影，否则2GB的大小能满足绝大多数情况的需求了。 后来，我在更改相关参数大小后，发现异常依然存在，这个问题还郁闷了我很久，知道第二天，才在网上找到答案。原来，WCF的服务端和客户端，如果传递的是实体对象(Entitiy Model)一类的数据，在传输中会涉及到序列化的问题，WCF中还有个针对EndPoint的配置项，里面可以设定需要序列化的对象的最大size。后来我更改了dataContractSerializer 的maxItemsInObjectGraph属性后，这个问题，才得到了圆满的解决。修改配置文件，可以参考下面的例子： Client配置： ?View Code XML1 2 3 4 5 &#60;endpointBehaviors&#62; &#60;behavior name=&#34;ClientBehavior&#34;&#62; &#60;dataContractSerializer maxItemsInObjectGraph=&#34;10000000&#34;/&#62; &#60;/behavior&#62; &#60;/endpointBehaviors&#62; Server配置： ?View Code XML1 2 3 4 5 &#60;serviceBehaviors&#62; &#60;behavior name=&#34;HostBehavior&#34;&#62; &#60;dataContractSerializer maxItemsInObjectGraph=&#34;10000000&#34;/&#62; &#60;/behavior&#62; &#60;serviceBehaviors&#62; 修改后的客户端，支持和服务端传输1000+的实体对象列表，我想远远不止这个数量，上1w的对象估计都没问题。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 [...]]]></description>
			<content:encoded><![CDATA[<p>最近一直在公司用WCF做server端，后来在做性能测试时，发现一个问题，当客户端从服务端取回一个实体对象列表时，触发了channel is faulted status的异常。</p>
<p>仔细分析了下这个异常，应该是传递大数据造成的，因为在回传一个包含有100多个实体对象的列表时，客户端表现正常，而当回传的实体对象列表数目达到500+时，异常就出现了。</p>
<p>其实WCF还是做得比较灵活的，基本所有的配置项都放在程序的app.config文件里面，改动相应参数时，不需要重新编译程序。而WCF设计的初衷，为了避免DOS一类的攻击，默认在生成配置文件时，对传输的buffer数值有一定的限制，默认是65535，也就是64KB。然而在一些特定的应用场景中，区区64KB的buffer是不能满足我们需要的。这就需要我们手动在配置文件中调整buffer的size。<span id="more-1214"></span></p>
<p>在配置文件中需要调整的一些参数，大致有下面几种：</p>
<p>WCF binding中的maxBufferSize, maxReceivedMessageSize<br />
WCF binding ReaderQuotas中的maxArrayLength, maxBytesPerRead, maxDepth等</p>
<p>在一些比较极端的场景中，我们可以把它设到最大2147483647，也就是约等于2GB大小的buffer。嗯，我想，除非你是用WCF来传输1080P的高清电影，否则2GB的大小能满足绝大多数情况的需求了。</p>
<p>后来，我在更改相关参数大小后，发现异常依然存在，这个问题还郁闷了我很久，知道第二天，才在网上找到答案。原来，WCF的服务端和客户端，如果传递的是实体对象(Entitiy Model)一类的数据，在传输中会涉及到序列化的问题，WCF中还有个针对EndPoint的配置项，里面可以设定需要序列化的对象的最大size。后来我更改了<em>dataContractSerializer </em>的<em>maxItemsInObjectGraph</em>属性后，这个问题，才得到了圆满的解决。修改配置文件，可以参考下面的例子：</p>
<p>Client配置：</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('p1214code3'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12143"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1214code3"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;endpointBehaviors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;behavior</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;ClientBehavior&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span> 
            <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataContractSerializer</span> <span style="color: #000066;">maxItemsInObjectGraph</span>=<span style="color: #ff0000;">&quot;10000000&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/behavior<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/endpointBehaviors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>Server配置：</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('p1214code4'); return false;">View Code</a> XML</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p12144"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1214code4"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;serviceBehaviors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;behavior</span> <span style="color: #000066;">name</span>=<span style="color: #ff0000;">&quot;HostBehavior&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span> 
          <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;dataContractSerializer</span> <span style="color: #000066;">maxItemsInObjectGraph</span>=<span style="color: #ff0000;">&quot;10000000&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span></span> 
        <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/behavior<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
      <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;serviceBehaviors<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>修改后的客户端，支持和服务端传输1000+的实体对象列表，我想远远不止这个数量，上1w的对象估计都没问题。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/transfer_large_objects_between_server_and_client_using_wcf-2011-07-14.htm/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>小试Emit</title>
		<link>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm</link>
		<comments>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm#comments</comments>
		<pubDate>Thu, 25 Nov 2010 15:18:00 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[dynamic]]></category>
		<category><![CDATA[Emit]]></category>
		<category><![CDATA[Reflection]]></category>
		<category><![CDATA[动态]]></category>
		<category><![CDATA[反射]]></category>
		<category><![CDATA[程序集]]></category>

		<guid isPermaLink="false">http://www.xiaozhou.net/dotnetdevelopment/%e5%b0%8f%e8%af%95emit-2010-11-25.htm</guid>
		<description><![CDATA[.NET中的Emit，其实是个很强大的东东，它允许你在你的程序运行时，动态的生成代码。看到这里，也许大家会联想到Reflection，的确，Reflection也是我们平时用得比较多的一种技术，通过Reflection，我们能通过程序集中的元数据，动态的生成目标程序集的Instance，并执行它。而Emit的功能，恰恰和Reflection遥相呼应，前者允许我们动态的生成代码，后者允许我们动态的“查看”和运行代码。Emit和Reflection合在一起，简直就是双剑合璧，简直就是幸福的一家……难怪，微软也很邪恶的把Emit放在了System.Reflection.Emit。 其实哥平时的开发中，用得比较多的，还是Reflection(反射)了，不过早已久仰Emit的大名，又没闲暇时间来窥探一把，最近总算比较闲了，决心研究研究强大的Emit。 话不多说，代码是最有力的说明，先献上一个通过Emit动态创建并生成程序集的例子： ?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 using System; using System.Reflection; using System.Reflection.Emit; &#160; namespace Emit_Learn &#123; class Program &#123; static void Main&#40;string&#91;&#93; args&#41; &#123; var name = new AssemblyName&#40;&#34;HelloEmit&#34;&#41;; [...]]]></description>
			<content:encoded><![CDATA[<p>.NET中的Emit，其实是个很强大的东东，它允许你在你的程序运行时，动态的生成代码。看到这里，也许大家会联想到Reflection，的确，Reflection也是我们平时用得比较多的一种技术，通过Reflection，我们能通过程序集中的元数据，动态的生成目标程序集的Instance，并执行它。而Emit的功能，恰恰和Reflection遥相呼应，前者允许我们动态的生成代码，后者允许我们动态的“查看”和运行代码。Emit和Reflection合在一起，简直就是双剑合璧，简直就是幸福的一家……难怪，微软也很邪恶的把Emit放在了System.Reflection.Emit。</p>
<p>其实哥平时的开发中，用得比较多的，还是Reflection(反射)了，不过早已久仰Emit的大名，又没闲暇时间来窥探一把，最近总算比较闲了，决心研究研究强大的Emit。</p>
<p>话不多说，代码是最有力的说明，先献上一个通过Emit动态创建并生成程序集的例子：</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('p892code7'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8927"><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
</pre></td><td class="code" id="p892code7"><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.Reflection</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.Reflection.Emit</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> Emit_Learn
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            var name <span style="color: #008000;">=</span> <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> AssemblyName<span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            var assemblyBuilder <span style="color: #008000;">=</span>
            AppDomain<span style="color: #008000;">.</span><span style="color: #0000FF;">CurrentDomain</span><span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicAssembly</span><span style="color: #008000;">&#40;</span>name,
            AssemblyBuilderAccess<span style="color: #008000;">.</span><span style="color: #0000FF;">RunAndSave</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建程序集</span>
              var modelBuilder <span style="color: #008000;">=</span> assemblyBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineDynamicModule</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span>,             <span style="color: #666666;">&quot;HelloEmit.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建模块</span>
              var typeBuilder <span style="color: #008000;">=</span> modelBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineType</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//定义类型</span>
              var methodBuilder <span style="color: #008000;">=</span> typeBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">DefineMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;Execute&quot;</span>,                                 MethodAttributes<span style="color: #008000;">.</span><span style="color: #0600FF; font-weight: bold;">Public</span>,                                 <span style="color: #0600FF; font-weight: bold;">null</span>,                                 <span style="color: #0600FF; font-weight: bold;">null</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//创建MethodBuilder</span>
            var il <span style="color: #008000;">=</span> methodBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">GetILGenerator</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;">//获取ILGenerator，用于生成方法的IL</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ldstr</span>, <span style="color: #666666;">&quot;Hello, Emit&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Call</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>Console<span style="color: #008000;">&#41;</span><span style="color: #008000;">.</span><span style="color: #0000FF;">GetMethod</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;WriteLine&quot;</span>,                     <a href="http://www.google.com/search?q=new+msdn.microsoft.com"><span style="color: #008000;">new</span></a> Type<span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> <span style="color: #008000;">&#123;</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><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#41;</span> <span style="color: #008000;">&#125;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            il<span style="color: #008000;">.</span><span style="color: #0000FF;">Emit</span><span style="color: #008000;">&#40;</span>OpCodes<span style="color: #008000;">.</span><span style="color: #0000FF;">Ret</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            typeBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">CreateType</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            assemblyBuilder<span style="color: #008000;">.</span><span style="color: #0000FF;">Save</span><span style="color: #008000;">&#40;</span><span style="color: #666666;">&quot;HelloEmit.dll&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//保存动态生成的程序集到磁盘文件</span>
&nbsp;
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

<p>在IDE中输入以上代码，F5运行，你会发现，在你的程序的Debug目录，会生成一个HelloEmit.dll。没错，这就是我们的程序动态生成的程序集，并且它是可执行的。以上的代码，动态生成的程序集，包含一个叫HelloEmit的类，类中有一个public属性的Execute方法。方法中调用Console输出字符串：Hello,Emit</p>
<p>这个类，等价于如下的C#代码：</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('p892code8'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p8928"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p892code8"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">internal</span> <span style="color: #6666cc; font-weight: bold;">class</span> HelloEmit
<span style="color: #008000;">&#123;</span>
    <span style="color: #008080; font-style: italic;">// Methods</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><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;Hello, Emit&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></pre></td></tr></table></div>

<p>我们也可以使用.NET Reflector一类的工具，打开生成的Dll查看，顺便验证一下。</p>
<p>Emit适用的场景：适用于对业务灵活性要求很高的系统，可以在运行时动态更改业务逻辑，并动态生成代码。</p>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/try_emit-2010-11-25.htm/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<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>
		<category><![CDATA[尝鲜]]></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从机器中清理掉，嘿嘿…… 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 本站文章均采用 知识共享署名-相同方式共享3.0 协议进行授权，除非注明，本站文章均为原创，转载请注明转自 Timothy&#039;s Space [...]]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/a_taste_of_visual_studio_2010-2010-04-13.htm/feed</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>扩展方法收集–实体验证</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>
		<category><![CDATA[实体]]></category>
		<category><![CDATA[扩展方法]]></category>
		<category><![CDATA[收集]]></category>
		<category><![CDATA[验证]]></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('p498code11'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p49811"><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="p498code11"><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;">&gt;</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('p498code12'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p49812"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p498code12"><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;">=&gt;</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;">=&gt;</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;">=&gt;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Age</span> <span style="color: #008000;">&gt;=</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;">=&gt;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&lt;=</span> <span style="color: #FF0000;">200</span> <span style="color: #008000;">&amp;&amp;</span> c<span style="color: #008000;">.</span><span style="color: #0000FF;">Height</span> <span style="color: #008000;">&gt;=</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;">=&gt;</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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
		<category><![CDATA[延迟加载]]></category>
		<category><![CDATA[立即加载]]></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 =&#62; p.OrderID == 10251&#41;; &#160; foreach &#40;var t in result&#41; &#123; Console.WriteLine&#40;&#34;OrderID:&#34; + t.OrderID + &#34;-&#34; + &#34;OrderDate:&#34; + t.OrderDate.Value.ToString&#40;&#34;yyyy-MM-dd&#34;&#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('p454code20'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45420"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p454code20"><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;">=&gt;</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: #666666;">&quot;OrderID:&quot;</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: #666666;">&quot;-&quot;</span> 
		<span style="color: #008000;">+</span> <span style="color: #666666;">&quot;OrderDate:&quot;</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: #666666;">&quot;yyyy-MM-dd&quot;</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('p454code21'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45421"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p454code21"><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('p454code22'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45422"><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="p454code22"><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: #666666;">&quot;OrderID:&quot;</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: #666666;">&quot;-OrderDate:&quot;</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: #666666;">&quot;yyyy-MM-dd&quot;</span><span style="color: #008000;">&#41;</span> 
		<span style="color: #008000;">+</span><span style="color: #666666;">&quot;-CustomerName:&quot;</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: #666666;">&quot;ProductID:&quot;</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: #666666;">&quot;-Price:&quot;</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: #666666;">&quot;-Amount:&quot;</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('p454code23'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45423"><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="p454code23"><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('p454code24'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45424"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p454code24"><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('p454code25'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45425"><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="p454code25"><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;">=&gt;</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;">=&gt;</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;">=&gt;</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: #666666;">&quot;OrderID:&quot;</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: #666666;">&quot;-OrderDate:&quot;</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: #666666;">&quot;yyyy-MM-dd&quot;</span><span style="color: #008000;">&#41;</span> 
		<span style="color: #008000;">+</span><span style="color: #666666;">&quot;-CustomerName:&quot;</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: #666666;">&quot;ProductID:&quot;</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: #666666;">&quot;-Price:&quot;</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: #666666;">&quot;-Amount:&quot;</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('p454code26'); return false;">View Code</a> SQL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p45426"><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="p454code26"><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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
		<category><![CDATA[作业]]></category>
		<category><![CDATA[开源]]></category>
		<category><![CDATA[框架]]></category>
		<category><![CDATA[调度]]></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('p431code30'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43130"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p431code30"><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('p431code31'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43131"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p431code31"><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('p431code32'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p43132"><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="p431code32"><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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
		<category><![CDATA[扩展方法]]></category>
		<category><![CDATA[收集]]></category>
		<category><![CDATA[整理]]></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('p389code33'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38933"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code33"><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('p389code34'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38934"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p389code34"><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('p389code35'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38935"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p389code35"><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;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> IEnumerable source, Action 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('p389code36'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38936"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p389code36"><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('p389code37'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38937"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code37"><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('p389code38'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38938"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p389code38"><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;">&#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('p389code39'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38939"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p389code39"><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 GetControls<span style="color: #008000;">&#40;</span><span style="color: #0600FF; font-weight: bold;">this</span> Control control, Func 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;">&#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('p389code40'); return false;">View Code</a> CSHARP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p38940"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p389code40"><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>
<span style="color: #008000;">&lt;/</span>button<span style="color: #008000;">&gt;</span></pre></td></tr></table></div>

<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></content:encoded>
			<wfw:commentRss>http://www.xiaozhou.net/dotnetdevelopment/common_used_extention_method-2009-11-14.htm/feed</wfw:commentRss>
		<slash:comments>38</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>
		<category><![CDATA[使用]]></category>
		<category><![CDATA[扩展方法]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
		<category><![CDATA[宿主]]></category>
		<category><![CDATA[问题]]></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. &#160; 这种错误应该是.svc文件没有映射到相关的handler上，因此IIS不知道怎么处理该请求。带着错误信息，在网上搜索了一把，终于找到了解决方法，看来搜索引擎很强大。 解决方法如下： 1.用管理员身份运行cmd命令行 2.切换到目录C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation 3.运行命令： servicemodelreg –i 这样，工具会自动把WCF相关的注册项安装到IIS7中，再打开浏览器访问WCF Service，一切正常。 细想了一下自己的装机过程，先装了VSTS和.net framework，后来发现IIS7没有在windows7里面默认安装，要到部署WCF的时候，才装好IIS7。这样在安装.net framework 3.0的时候，因为没有安装IIS7，所以一些注册项就没有起到作用。此方法可以将WCF的配置项重新配置到IIS7中，供同学们参考。 声明: 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 [...]]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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: } &#160; [...]]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>2</slash:comments>
		</item>
		<item>
		<title>Unity 学习笔记(3) — 生命周期管理</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>
		<category><![CDATA[周期]]></category>
		<category><![CDATA[生命]]></category>
		<category><![CDATA[管理]]></category>

		<guid isPermaLink="false">http://localhost/wordpress/?p=220</guid>
		<description><![CDATA[Unity根据我们在注册类型的时候所指定的生命周期来管理注册类型的创建和解析。当我们在向容器中注册类型的时候，如果我们没有显式的指明该类型的生命周期管理器(下称:Lifetime Manager)，默认的情况下，容器会为我们注册的类型创建一个生命周期短暂的管理器。这样一来，当我们每次调用容器的Resolve方法或者ResolveAll方法，或者采用依赖机制注入实例到其他的类中的时候，容器都会为我们创建新的实例，并且容器不会保存对实例的引用。 容器的RegisterType函数包含多个支持泛型的重载，同时还包含了一一对应的非泛型重载。其中的重载函数，我们可以看到类似下面的声明： 1: RegisterType(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(); 9: 10: INotify notify1 = container.Resolve(); 11: 12: INotify notify2 = container.Resolve(); [...]]]></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<TFrom, TTo>(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<INotify, EmailNotify>();</pre>
<pre class="alt"><span class="lnum">   9:  </span></pre>
<pre><span class="lnum">  10:  </span>            INotify notify1 = container.Resolve<INotify>();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve<INotify>();</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<INotify, EmailNotify>(<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<INotify>();</pre>
<pre class="alt"><span class="lnum">  11:  </span></pre>
<pre><span class="lnum">  12:  </span>            INotify notify2 = container.Resolve<INotify>();</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<INotify, EmailNotify>(<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<INotify>();</pre>
<pre><span class="lnum">  22:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve<INotify>();</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<INotify>();</pre>
<pre><span class="lnum">  32:  </span>            INotify notify2 = (obj <span class="kwrd">as</span> IUnityContainer).Resolve<INotify>();</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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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) — 配置文件的使用</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>
		<category><![CDATA[配置文件]]></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配置信息 ... ... 其中name是section的名称，type就是处理该section的程序类型，Unity提供了UnityConfigurationSection，负责处理配置文件信息，它包含在程序集Microsoft.Practices.Unity.Configuration中 接下来，需要在configuration节点中增加Unity配置节点，格式如下： 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 16: unity的子元素，包含节点大致如上，其宗typeAliases是type别名，能够简化下面types中type的配置。containers节点中可以包含多个container的配置。container主要包含的子元素有types元素，instance元素，types元素可以包含多个type元素，用以添加注册类型，instance主要用来添加实例到容器中。type元素，主要包含四个属性： name：表示注册类型的名称，此属性在配置中可选。 type:注册的源类型 mapto:注册的目标类型 lifetime:设置注册类型的生命周期 此外，还有instances元素，包括name,type,value,typeConverter四个属性。value表示注册实例的初始值，typeConverter是用以转换提供的值到实例的匹配类型的类型转换器。 具体的元素含义，可以参考Unity的帮助文档。 下面我们还是采用Monitor的例子，来实现用配置文件注册类型，配置文件示例： 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 程序代码修改如下： [...]]]></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;"><configSections></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;">
<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"/></div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 105px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;"></configSections></div>
<pre><<span style="font-family: Simsun;"><span style="white-space: normal;">configSections></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;">
<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"/></span></span></pre>
<pre><span style="font-family: Simsun;"><span style="white-space: normal;"></configSections></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><unity></pre>
<pre><span class="lnum">   2:  </span>    <typeAliases></pre>
<pre class="alt"><span class="lnum">   3:  </span>      <typeAlias alias=<span class="str">""</span> type=<span class="str">""</span> /></pre>
<pre><span class="lnum">   4:  </span>    <typeAliases /></pre>
<pre class="alt"><span class="lnum">   5:  </span>    <containers  ></pre>
<pre><span class="lnum">   6:  </span>      <container></pre>
<pre class="alt"><span class="lnum">   7:  </span>         <types></pre>
<pre><span class="lnum">   8:  </span>           <type type=<span class="str">""</span> mapTo=<span class="str">""</span> /></pre>
<pre class="alt"><span class="lnum">   9:  </span>         </types></pre>
<pre><span class="lnum">  10:  </span>         <instances></pre>
<pre class="alt"><span class="lnum">  11:  </span>           <add name=<span class="str">""</span> type=<span class="str">""</span> <span class="kwrd">value</span>=<span class="str">""</span> /></pre>
<pre><span class="lnum">  12:  </span>         </instances></pre>
<pre class="alt"><span class="lnum">  13:  </span>      </container></pre>
<pre><span class="lnum">  14:  </span>    </containers></pre>
<pre><span class="lnum">  16:  </span></unity></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><?xml version=<span class="str">"1.0"</span> encoding=<span class="str">"utf-8"</span> ?></pre>
<pre><span class="lnum">   2:  </span><configuration></pre>
<pre class="alt"><span class="lnum">   3:  </span>  <configSections></pre>
<pre><span class="lnum">   4:  </span>
<section name=<span class="str">"unity"</span> type=<span class="str">"Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"</span> /></pre>
<pre class="alt"><span class="lnum">   5:  </span>  </configSections></pre>
<pre><span class="lnum">   6:  </span></pre>
<pre class="alt"><span class="lnum">   7:  </span>  <unity></pre>
<pre><span class="lnum">   8:  </span>    <containers></pre>
<pre class="alt"><span class="lnum">   9:  </span>      <container></pre>
<pre><span class="lnum">  10:  </span>        <types></pre>
<pre class="alt"><span class="lnum">  11:  </span>          <type type=<span class="str">"UnityDemo.IMonitor,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.Monitor,UnityDemo"</span> /></pre>
<pre><span class="lnum">  12:  </span>          <type type=<span class="str">"UnityDemo.INotify,UnityDemo"</span> mapTo=<span class="str">"UnityDemo.EmailNotify,UnityDemo"</span> /></pre>
<pre class="alt"><span class="lnum">  13:  </span>        </types></pre>
<pre><span class="lnum">  14:  </span>      </container></pre>
<pre class="alt"><span class="lnum">  15:  </span>    </containers></pre>
<pre><span class="lnum">  16:  </span>  </unity></pre>
<pre class="alt"><span class="lnum">  17:  </span></pre>
<pre><span class="lnum">  18:  </span></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>
<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<IMonitor>();</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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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 09:29:01 +0000</pubDate>
		<dc:creator>Timothy</dc:creator>
				<category><![CDATA[.NET开发]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[日期]]></category>
		<category><![CDATA[计算]]></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>
<p class="announce"><span style="font-weight:bold;text-shadow:0 1px 0 #ddd;">声明:</span> 此Blog中的文章和随笔仅代表作者在某一特定时间内的观点和结论，对其完全的正确不做任何担保或假设 <br /> 本站文章均采用 <a rel="nofollow" href="http://creativecommons.org/licenses/by-nc-sa/3.0/" title="署名-非商业性使用-相同方式共享">知识共享署名-相同方式共享3.0</a> 协议进行授权，除非注明，本站文章均为原创，转载请注明转自  <a href="http://www.xiaozhou.net">Timothy&#039;s Space</a> 并应以链接形式标明本文地址!</p>]]></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>
	</channel>
</rss>

