﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-ipointer</title><link>http://www.cnblogs.com/ipointer/</link><description>给我最爱的宝宝</description><language>zh-cn</language><lastBuildDate>Sat, 04 Jul 2009 00:32:01 GMT</lastBuildDate><pubDate>Sat, 04 Jul 2009 00:32:01 GMT</pubDate><ttl>60</ttl><item><title>误人子弟的面试题答案</title><link>http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 18 Nov 2008 14:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1336268.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/11/18/1336268.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1336268.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1336268.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;看到一道.net的面试题，下面附上题目和网上的答案（注意答案是错误的）</p>
<p><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;根据线程安全的相关知识，分析以下代码，当调用<span lang="EN-US">test</span>方法时<span lang="EN-US">i&gt;10</span>时是否会引起死锁<span lang="EN-US">?</span>并简要说明理由。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;public void test(int i)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lock (this)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (i &gt; 10)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i--;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; test(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;网上的答案：<span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">不会发生死锁，（但有一点<span lang="EN-US">int</span>是按值传递的，所以每次改变的都只是一个副本，因此不会出现死锁。但如果把<span lang="EN-US">int</span>换做一个<span lang="EN-US">object</span>，那么死锁会发生）</span>。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;答案确实是不会发生死锁，但理由是错的，看看MSDN上的解释：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Lock确保当一个线程位于代码的临界区时，另一个线程不进入临界区。如果其他线程试图进入锁定的代码，则它将一直等待（即被阻止），直到该对象被释放。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 原来的递归明明在一个线程中，哪来的阻塞呢。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1336268.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47965/" target="_blank">Google App Engine宕机6小时——云的安全在哪里？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>.Net中的安全机制</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 15 Oct 2008 09:12:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1311979.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/15/1311979.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1311979.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1311979.html</trackback:ping><description><![CDATA[这部分内容由于工作中接触的不多，所以理解起来用了不少时间，下面只是作简单的说明：
<p>&nbsp;&nbsp;&nbsp;&nbsp; Windows中的安全机制主要是这几个概念：我是谁（身份）、我要做什么（操作）、我要访问什么（资源）。而.Net中将其修改为我从哪里来（位置）、我要做什么（操作）、我要访问什么（资源）。由此.Net的安全机制中有这几个概念：代码组、程序集、权限、权限集。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 代码组是对程序集在安全方面的一个分类，它是一个树状结构，程序集可以属于代码组中的某个节点。这个隶属关系不需要用户去指定，每个代码有且仅有一个代表自身的条件，如zone、site、strong name、url等，程序集自动的会属于代码树状结构中的一条分支。下面是典型的本机代码组的设置：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://c8zgfw.blu.livefilestore.com/y1p9Sq3XXQU7VMIWjpDuDcykO2WgDyJYnojCY_jialKPTx-V02HdWzc9-gQC7-OOlgDIQgZ5UsRucQGzUjHyjb_SA?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="341" alt="image" src="http://c8zgfw.blu.livefilestore.com/y1pAPoNhsTDKn-3p3kToAZdtWBLce5ChoXhIChv-pK40WspmG68yuTRg88XNj7v9o0jn5Fvt1IgGctiOw6e8KFJmg?PARTNER=WRITER" width="644" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我们就可以看几个例子，如：本机上的一个程序集，自然会属于代码组1.1. Zone - MyComputer（这个代码组的条件就是zone为本机）；而我们从某台服务器的共享目录中访问的程序集就会属于1.3. Zone - Internet。当然如果有其他更细条件的代码组，而程序集也符合这样的条件，他就会隶属于更明细的代码组。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 权限在.Net Framework中的体现就是自带的权限类，.Net Framework中实现了很多权限实例类，如FileIOPermission、UIPermission、FileDialogPermission（都继承自CodeAccessPermission），每个权限实体类还定义了对此权限的操作，如FileIOPermission中有Read、Write等。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 权限集，顾名思义就是权限的集合，定义这个集合是为了方便给代码组分配权限，一个代码组对应着一个权限集。这个权限集使用xml来表示，明确表达了这个集合所拥有的权限。下面是名为Internet的权限集的详细描述：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blufiles.storage.msn.com/y1pu30qejcecZtB8wWAFuOdQYkRO4uN5GRdaS7GM_rdsJejnz7pqDt2qcSQKB81RZJ7Hpp3DnMilP0?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="484" alt="image" src="http://blufiles.storage.msn.com/y1p84PdD-JUMZbaA6geV8-3PzIFN6CbJbJJ684mKEfuh44Qgcbw315n5wfSDGZ5QIAXgyB7Ua4X03c?PARTNER=WRITER" width="593" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 可以看到每一条都代表着一个权限，也明确对应着一个权限实体类，在运行时这个xml会被反射成权限对象以供使用。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下图就是安全机制中元素的关系图：
<p>&nbsp;&nbsp;&nbsp;&nbsp; <a href="http://blufiles.storage.msn.com/y1p8dWjba7a10W9IViIiCGNXUA0xjB9xWu8Go0yNtqjw3aa0M7AGTu4OHTXlD7jTvW12ReRX9idxQQ?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="199" alt="image" src="http://blufiles.storage.msn.com/y1p2jipv1tBXkmg01uhG48_Kg7_s2dmmyq_oi_Wn2UiSwQRJxuvJHQG2AQyaolfC86XA9ApeLLxfXw?PARTNER=WRITER" width="325" border="0" /></a>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 一个程序集隶属于某个代码组，而代码组被分配了一个权限集，这样一个程序集就知道了自己在运行时所拥有的权限的集合。当程序集中的代码在运行时进行某个操作时，.Net Framework就会去检查这个程序集所拥有的权限，如果没有权限则抛出SecurityException，下面就是创建StreamReader实例时的调用堆栈，从中可以看到.Net Framework进行了权限检查。
<p>at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark&amp; stackMark, Boolean isPermSet)<br />
at System.Security.CodeAccessPermission.Demand()<br />
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)<br />
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize, FileOptions options)<br />
at System.IO.StreamReader..ctor(String path, Encoding encoding, Boolean detectEncodingFromByteOrderMarks, Int32 bufferSize)<br />
at System.IO.StreamReader..ctor(String path)
<p>&nbsp;&nbsp;&nbsp;&nbsp; 而对于自己编写的权限，就可以在自己的代码中做类似的检查。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还可以更细的定义程序集的权限，现在的程序集的权限主要是根据其所属的代码组，程序集本身也可以拥有自身的权限定义。如：要求一个必须的权限，如果代码组中没有此权限，则程序不能启动；如可以否定某个权限，则即使在代码组中有此权限，程序集以及其调用的其他程序集也没有这个权限。程序集权限可以在Security选项卡中指定，也可以在代码中通过代码或者是特性来指定。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 还有值得注意的，对权限的检查不光是对本程序集的权限检查，还包括对调用堆栈上的较高的位置的程序集权限的检查。像这样的场景：有一个服务器端的组件可以操作本机的某个Windows Service，这个组件在服务器本机上有Full Trust的权限集合，因此从服务器端启动它来访问某个Windows Service是没有问题的。但如果想从客户端通过WebService来调用此组件，则是不行的，因为权限检查在调用堆栈中从这个组件开始一直检查到这个调用的起始处，发现这个程序集来自Internet，因此就使用Internet权限组，而这个权限组没有操作Windows Service的权限。要使这个调用成功，就需要改服务器上的代码组权限，最好的是新增一个条件比较明确的代码组，否则就将带来安全问题。 </p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1311979.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47961/" target="_blank">微软新推社交网站Windows Live Planet</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>用定制特性规范构件调用</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 10 Oct 2008 08:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1308239.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/10/1308239.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1308239.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1308239.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在GSP平台中，构件扮演着让平台更灵活，让用户需求更容易变化的重要角色，.net方法的调用，用户自定义窗体的展现等等都是最常见的应用场景。但由于我们的构件平台能力较弱，长久以来构件平台只是起着通用反射调用器的作用。让构件标准化，是我们发展构件平台的必经之路。这篇文章只是从使用定制特性这个角度来增强构件的标准化程度。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;定制特性从我的角度理解，就是给程序集、类型、方法、属性等等元素加上的辅助信息，我们可以告诉调用者调用前要做什么，调用后再做什么，或者是要让编译器做什么等等。我们经常使用的是.net framework中已经存在的特性，而自己定制特性的场景还很少。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下面我描述一下我们在构件使用过程中的两个问题，并说明如何使用特性来解决：</p>
<blockquote>
<p>1、在工作流的人工活动节点上，我们需要用户定义一个单据，作为人工执行工作的一个数据参考。这里需要传入一些参数（权限、取数条件、单据分类等等），我们的构件平台将窗体描述为构件，描述信息中包含了如何调用这个窗体的信息。但在实现时却有小小的限制，对于web窗体使用URL后跟参数的方式就可以很好的实现，而对于winform窗体，就必须要求与参数匹配的构造函数。但是很多单据的作者却更喜欢将这些参数实现为属性，而非构造函数中的参数。这样的情况我们除了强识别形参名称，并与窗体属性一致，就没有太好的办法。</p>
<p>2、与1中类似的情况，我们给这些构件的形参定义实参是，一般情况下是使用单据数据Schema中的字段，但这个过程也是把我们最终用户晕头转向，除非我们约定形参名称必须与Schema中的字段匹配，不然我们也不好解决这个问题。</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上两个问题都可以用定制特性的方式，稍微优雅一些的解决。我们设计下面的特性：</p>
<blockquote>
<p>[AttributeUsage(AttributeTargets.Property,AllowMultiple=false,Inherited=false)]<br />
class GspParamsAttribute:Attribute<br />
{<br />
&nbsp;&nbsp;&nbsp; private string paramName;
<p>&nbsp;&nbsp;&nbsp; public string ParamName<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return paramName; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { paramName = value; }<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private string actualParamName;
<p>&nbsp;&nbsp;&nbsp; public string ActualParamName<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return actualParamName; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { actualParamName = value; }<br />
&nbsp;&nbsp;&nbsp; }
<p>&nbsp;&nbsp;&nbsp; private string actualParamPath;
<p>&nbsp;&nbsp;&nbsp; public string ActualParamPath<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return actualParamPath; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { actualParamPath = value; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}
<p>[AttributeUsage(AttributeTargets.Class)]<br />
class GspSupportParamSpecifyAttribute : Attribute<br />
{ <br />
}</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 对于单据的作者，就可以这样标记他的单据：
<blockquote>
<p>[GspSupportParamSpecify()]<br />
class MyForm:Form<br />
{<br />
&nbsp;&nbsp;&nbsp; private string someProperty;
<p>&nbsp;&nbsp;&nbsp; [GspParams(ParamName="SomeProperty",ActualParamName="OtherProPerty")]<br />
&nbsp;&nbsp;&nbsp; public string SomProperty<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return someProperty; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; set { someProperty = value; }<br />
&nbsp;&nbsp;&nbsp; }<br />
}</p>
</blockquote>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 对于我们的构件设计器，就发现了一个需要在GSP平台中作为参数的属性SomProperty；对于流程设计在引用这个构件配参数时，就发现需要在Schema中找OtherProPerty字段作为实参来配置这个形参；对于构件调用的运行时，在发现GspSupportParamSpecify特性时，就知道这个类型中的某些属性需要被赋值，进而又从SomProperty属性上发现了GspParams特性，就知道使用哪个参数来给这个属性赋值了。
<p>&nbsp;&nbsp;&nbsp;&nbsp; 而发现特性，需要使用反射，Type类型为我们提够了足够的信息，使用Attribute.GetCustomAttribute（）的多个重载，可以方便我们运用于多个场景。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1308239.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47960/" target="_blank">火狐3.5版被指推出太匆忙：存在50多个漏洞</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>用重载操作符实现用户数据类型的转换</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Sat, 04 Oct 2008 08:29:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1303832.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/04/1303832.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1303832.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1303832.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message233">
<div id="ad_thread3_1"></div>
<div id="firstpost">本文所提的类型转换是指两个类型之间没有继承关系，但其本意上又是很大的相似关系的，再某些场景下需要转换，因为不是C#的预置类型，所以语言本身不能提供这样的转化，需要我们自己实现。<br />
举一个我们开发中的场景，工作项的实体类有两个版本BasicWorkItem和GSPWorkItem，两个在不同的程序集中，部署位置也不同，BasicWorkItem的程序集可以在服务器和客户端都部署，而GSPWorkItem的程序集只能在服务器上部署。BasicWorkItem是GSPWorkItem的简化版本，只包含成员字段，GSPWorkItem中包含的成员函数可以做很多服务器端的操作。<br />
在工作流引擎的运行时都是使用的GSPWorkItem，但查询工作项的操作需要将工作项返回到客户端，因此才诞生了BasicWorkItem，在过webService的时候将GSPWorkItem转换为BasicWorkItem。<br />
有人说可以将BasicWorkItem作为GSPWorkItem的基类呀，这样就可以隐式转换了呀。但是BasicWorkItem引用指向的对象其实是GSPWorkItem类型的，在WebServiceClient端反序列化对象时，就是因为缺少GSPWorkItem的程序集而出错。<br />
这里只能新建BasicWorkItem对象，将其一个个字段的赋值。现在代码里的写法是在过webService的一层上加一个Convert方法，但这样代码就很零散了，不好维护。但如果我们在BasicWorkItem类中重载显示类型转换的操作符，这个过程就会很优雅，而且代码集中，易于管理。<br />
这里就写个示例。<br />
BasicWorkItem.cs<br />
<br />
//ect.<br />
public static explicit operator BasicWorkItem(GspWorkItem gspWorkItem)<br />
{<br />
BasicWorkItem result = new BasicWorkItem();<br />
result.WorkItemId = gspWorkItem.WorkItemId;<br />
return result;<br />
}<br />
//ect.<br />
<br />
这样在调用时就可以像预置类型一样转换了。<br />
BasicWorkItem basicWorkItem = (BasicWorkItem)gspWorkItem; </div>
</div>
<script type="text/javascript">
						function forumhottag_callback(data)
						{
							tags = data;
						}
					</script><script src="cache/hottags_forum_cache_jsonp.txt" type="text/javascript"></script>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1303832.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47959/" target="_blank">Google对手机搜索进行优化升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>搞不清楚的云计算</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 03 Oct 2008 09:41:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1303534.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303534.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1303534.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1303534.html</trackback:ping><description><![CDATA[<p>对云计算的概念有很多疑问，想请各位参与讨论一下。</p>
<p>在网上看到如下的帖子：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #3366ff">伴随云计算的概念的出现，SAAS、DAAS、PAAS⋯纷繁众多的技术名称和定义在IT创新领域层出不穷。实际上，这些概念很多都存在相当大的交集、模糊或者重复命名，比如SAAS就只是早先失败的ASP的新瓶装旧酒。而云计算的概念刚由Google提出，Amazon便声称自己早已向客户提供云服务，戴尔和FaceBook甚至宣称已经着手&#8220;下一代云计算&#8221;，国内的一些软件开发商也号称自己进入了云时代。在我看来，种种迹象表明，即使不能简单地把云计算看成是旧有技术的一种新鲜说辞，它也只是一种营销比重很大、技术比重很小的&#8220;创新&#8221;概念。<br />
　　我们都知道，罗马的马车轮距决定了现代火车的铁轨间距，而为解决卡键问题设计的QWERTY低效键盘决定了现代计算机的键盘布局。争取路径依赖，是迈克尔&#183;波特竞争优势理论以外的第四种竞争战略。技术提供商和开发商们深谙其中的道理，云计算的争夺并非真正的技术创新使然，这只是一场争取路径依赖的激烈博弈。<br />
　　但如果云计算不是一种真正的技术创新，那么它是否是一种能够有效地改变用户结构和用户使用方式的创新呢？<br />
　　云计算的目标是&#8220;象使用水电一样地使用计算&#8221;，这与之前业界著名的ASP和当下流行的SAAS有着&#8220;同一个梦想&#8221;。在我看来，计算永远不会像水电一样地被使用。原因不在于不能，而在于不需要。不是每一种产品或者服务，都以水电化为终极目标。确实如Google所说，我们&#8220;不需要在家里安装一台发电机&#8221;，但千家万户有哪一个没有自己的炉灶呢？哪怕快餐店再快捷再美味，我们也还是会选择大部分时候在家做饭。问题恰恰在于饮食不是一个可以标准化的需要，美食的变化和人们对美食的要求永远没有止境。云计算并非用户的真正需求——超级计算也许是一些发烧友的梦想，但对于大多数用户，互联网只是看看新闻和花边消息的媒体，只是聊聊天拉拉家常的工具。<br />
　　如此看来，云计算就只是时下流行的又一次营销创新而已。而营销过度创新的危害甚至比创新不足更令人担忧，并且意味着忽略风险。<br />
　　健康的营销创新体现为对市场竞争格局的结构性改革，现有市场的各种压力在营销创新的过程中得到释放。如果营销创新会对企业竞争力产生持久的影响，那么它们之间必须是相互协调的，并且必须与战略目标相符以适应新生的竞争格局。否则，无论推行的营销创新多么令人眼花缭乱，终将成为一现的昙花。<br />
　　从18世纪产业革命以来，企业的创新一直都有实干的传统；但受所谓&#8220;金融创新&#8221;的传染，现代企业的创新有越来越务虚的趋势。我们看看所谓&#8220;金融创新&#8221;的危害：次债问题造成的金融危机短时间内根本得不到解决，不仅给美国，也给与美国相关的金融体系造成不可估量和难以恢复的破坏性影响。如同传销的华丽说辞不能提升传销产品本身与传销价格严重背离的低价值一样，次贷的高收益外衣也并不会提升贷款人的偿贷能力，不能改变其中蕴藏的巨大风险。<br />
　　回到我们关于云计算的反思，一个分不清是技术创新还是营销创新、务虚远胜于务实的概念，究竟能给我们造成什么影响呢？</span></p>
<p><span style="color: #3366ff">&nbsp;</span>我最初理解的云计算是：用整个互联网的运算能力来代替超级主机，连接上互联网的用户与计算提供商签订个协议，我的本地PC可以为其提供计算能力。当计算提供商接到大型的计算任务时，将计算分解为很多的小块，分发给很多的终端PC，最后将所有的计算结果汇总，以此来提供强大的计算能力。<br />
而如上文所提到的云计算，确实仅仅是常见的应用软件的互联网版本而已，这就没有特别大的创新意义。<br />
当然如果用户体验是上文提到的，而底层实现技术是我所描述的，还是有很多意义的。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1303534.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>override和new关键词的差别</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 03 Oct 2008 09:14:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1303527.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/03/1303527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1303527.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1303527.html</trackback:ping><description><![CDATA[继承和多态是我们常用的面向对象的特性，其中override和new关键词是我们最经常用到的，用下面的例子解释其用法。<br />
假设我们我们有基类BaseClass和ChildClass，都有方法DoSomething。<br />
在调用端使用下面的测试代码:<br />
ChildClass cc = new ChildClass();<br />
BaseClass bs = cc;<br />
Console.Write(bs.DoSomething());<br />
<br />
在基类和子类的DoSomething方法上的不同标记会对执行产生不同的影响。<br />
override一般翻译成&#8220;覆盖&#8221;或&#8220;重写&#8221;，其完整的说法应该是子类中的方法覆盖基类中的方法；<br />
new翻译成&#8220;隐藏&#8221;，其完整的说法应该是基类的方法隐藏子类中的方法。<br />
下面描述标记不同，调用效果的不同。<br />
a、如果基类和子类都没有特殊标记，按照&#8220;new&#8221;来处理，用基类引用指向子类对象，调用的是基类的方法；<br />
b、如果基类未标记，子类标记为new，效果同a；<br />
c、如果基类标记为virtual，子类未标记，效果还是同a；<br />
d、如果基类标记virtual，子类标记为override，即为&#8220;覆盖&#8221;处理，用基类引用指向子类，调用的是子类的方法；<br />
e、如果基类标记为virtual，子类标记为new，效果还是同a。<br />
<br />
需要注意的是a和c会出现警告，提醒程序员使用清晰的写法。d和e是推荐的写法，明确的表明了用意。<br />
对于b，即使基类中没有DoSomething方法，使用new标记也没有任何问题。但如果基类没有标记virtual，子类标记为override，则会出现编译时的错误。
<img src ="http://www.cnblogs.com/ipointer/aggbug/1303527.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47958/" target="_blank">风声又起 Windows 7 RTM版7月13日完成</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>你必须知道的值传递和引用传递</title><link>http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 02 Oct 2008 03:31:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1303083.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/10/02/1303083.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1303083.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1303083.html</trackback:ping><description><![CDATA[<div class="t_msgfont" id="message229">
<div id="ad_thread3_1"></div>
<div id="firstpost">C#中默认使用的是值传递，加ref关键词则标记为引用传递。两者的差别是值传递是传递标识符所代表的变量的副本，而引用传递是传递的本身。以此概念来推敲值类型和引用类型在两种不同传递方式下的区别，这可能是很多人都忽视的，下面的例子表达了这些区别。<br />
using System;<br />
<br />
namespace TestMethodParams<br />
{<br />
&nbsp; &nbsp; /// &lt;summary&gt;<br />
&nbsp; &nbsp; /// Class1 的摘要说明。<br />
&nbsp; &nbsp; /// &lt;/summary&gt;<br />
&nbsp; &nbsp; class Class1<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;summary&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// 应用程序的主入口点。<br />
&nbsp; &nbsp; &nbsp; &nbsp; /// &lt;/summary&gt;<br />
&nbsp; &nbsp; &nbsp; &nbsp; [STAThread]<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void Main(string[] args)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // TODO: 在此处添加代码以启动应用程序<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int i = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //值类型的值传递<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ValueTypeTransByVale(i);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("值类型的值传递:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(i);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //值类型的引用传递<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ValueTypeTransByRef(ref i);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("值类型的引用传递:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(i);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MyClass m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的值传递1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByValue1(m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的值传递1:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的值传递2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByValue2(m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的值传递2:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的引用传递1<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByRef1(ref m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的引用传递1:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //引用类型的引用传递2<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 0;<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; RefTypeTransByRef2(ref m);<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine("引用类型的引用传递2:");<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(m.X);<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Console.Read();<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void ValueTypeTransByVale(int i)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void ValueTypeTransByRef(ref int i)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByValue1(MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByValue2(MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByRef1(ref MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; static void RefTypeTransByRef2(ref MyClass m)<br />
&nbsp; &nbsp; &nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m = new MyClass();<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m.X = 100;<br />
&nbsp; &nbsp; &nbsp; &nbsp; }<br />
&nbsp; &nbsp; }<br />
<br />
&nbsp; &nbsp; public class MyClass<br />
&nbsp; &nbsp; {<br />
&nbsp; &nbsp; &nbsp; &nbsp; public int X;<br />
&nbsp; &nbsp; }<br />
} </div>
</div>
<script type="text/javascript">
						function forumhottag_callback(data)
						{
							tags = data;
						}
					</script><script src="cache/hottags_forum_cache_jsonp.txt" type="text/javascript"></script>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1303083.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47957/" target="_blank">乔布斯和埃利森</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>windows用户配置文件的复制</title><link>http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 22 Sep 2008 10:12:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1296099.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/09/22/1296099.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1296099.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1296099.html</trackback:ping><description><![CDATA[<p>本文的信息都来自互联网，并非本人原创，为了个人以后使用方便，在此标记一下。</p>
<p>本人快要离职，一个很重要的工作就是整理机器的环境。本人在公司一直使用域用户，但离职了公司的域就登不了了，以前很多的用户设置都用惯了，要用新的本地用户再配一次，不亚于重装一次系统。我很懒，才不愿意那么干呢，于是网上开始寻找解决办法，看到了一篇为了使本地用户的配置到域用户中继续使用的帖子，根据其中核心内容稍加改动就完成了本来觉得异常麻烦的事情。</p>
<p>核心思想就是使用windows系统信息中的用户配置文件复制功能，以前一直不知道干嘛的，呵呵，bs自己一下。</p>
<p>1、因为以后要使用本地帐户了，所以需要先建一个并加入管理员组，假设就叫localuser吧，下面的命令行建起来很方便。</p>
<p>net user localuser 123456a? /add </p>
<p>net localgroup administrators localuser /add</p>
<p>2、因为要在域用户和本地用户间复制，所以操作的过程必须使用第三方用户，否则必然会有文件被使用的提示。</p>
<p>重复1中的命令再建一个trans用户</p>
<p>3、将localuser登录一次，创建好本地目录</p>
<p>4、使用trans用户登录，我的电脑-&gt;属性-&gt;高级选项卡-&gt;用户配置文件区域点&#8220;设置&#8221;，弹出用户配置文件页面，选中复制源用户，即我的域用户，点复制到，在新弹出的界面上&#8220;浏览&#8221;，选要复制的目录，并点&#8220;更改&#8221;，因为域控上还有一些信息，而本地用户无法从域控上复制，所以需要你输入一下域登录信息，接着就开始等着复制吧。</p>
<p>5、复制结束后，使用localuser用户登录，呵呵，是不是很完美，和使用几年的用户设置几乎一模一样。检查一下visualstudio，重输了VSTFS的密码后，几乎所有的设置都没有变。还有邮箱，呵呵，重输了密码也都ok了，帐户设置，原来的邮件都在。</p>
<p>十几分钟搞定了很多事情，有一个疑问是，这个复制到操作到底做了什么，是不是我们都可以手工来做呢？</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1296099.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47956/" target="_blank">Xbox Live将投放Silverlight广告</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>求职：本人从事3年工作流引擎开发，熟悉XPDL，.net3.5中WF，Biztalk，开源工作流引擎OBE，期望工作地点上海</title><link>http://www.cnblogs.com/ipointer/archive/2008/09/10/1288509.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 10 Sep 2008 08:56:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/09/10/1288509.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1288509.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/09/10/1288509.html#Feedback</comments><slash:comments>11</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1288509.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1288509.html</trackback:ping><description><![CDATA[摘要:  基本信息 姓名： 朱金晨 性别： 男 出生日期： 1983.7.25 籍贯： 江苏常州 工作年限： 3年（1年实习） 政治面貌： 党员 毕业院校： 哈尔滨工业大学 学位： 学士 英语程度： CET6 目前年薪： 6.4万 电子邮件： ipointer@163.com 移动电话： 13864006065（济南） 自我评价 软件技术爱好者，对技术敏感性好，喜欢技术研究带来的乐趣。乐于将研究所得在博客&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2008/09/10/1288509.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/1288509.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47951/" target="_blank">Debian无视GNU创始人警告 接受Mono</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>对Activity副本的再理解</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 24 Jul 2008 04:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1250400.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/24/1250400.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1250400.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1250400.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在看本文之前，先看WF大牛WXWinter的博文：<a href="http://www.cnblogs.com/foundation/archive/2008/06/05/1214783.html">http://www.cnblogs.com/foundation/archive/2008/06/05/1214783.html</a>，本人在看他的博文后，觉得还有一些点没有讲透，想通后，写下此文。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;重提一下WXWinter的博文：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;While与Replicator可以重复执行其子Activity，While与Replicator在每次重复使用Activity时，并不是将其重置到初始状态。而是克隆原始Activity，每个克隆的Activity都单独进行管理。不会干扰其他克隆的Activity。这些克隆的Activity每一个都要有自身的 AEC 来管理状态。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这段描述没有问题，有两点还没说清楚：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1、克隆的Activity的可见性。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、在什么时候克隆Activity。</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们从WXWinter的例二入手，例二没有达到预期目的的根本原因就是克隆的Activity的可见性。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;例一中是在流程中给活动实例的MyProperty属性做++操作的，在流程中只能看到真正的Activity1的活动实例，是不可能看到活动的副本的，所以这里++操作就是针对真正的Activity1的活动实例的。而例二中，由于将给活动实例的MyProperty属性做++操作封到了ActivityLibrary里面，运行时++操作是针对活动的副本进行的，所以根本不会影响到真正的活动实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;我们经常要封ActivityLibrary的同志就要注意了，必须使用this.Parent.GetActivityByName(this.Name)才能取到真正的活动实例，GetActivityByName的作用是根据指定的类型名返回当前活动及其子运行活动的活动实例。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;问题二什么时候克隆Activity，在串行情况下，在每次执行序列之前克隆Activity，证据是在副本活动中用一下代码：</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;private void codeActivity1_ExecuteCode(object sender, EventArgs e)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Activity1 a1 = this.Parent.GetActivityByName(this.Name) as Activity1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a1.MyProperty++;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Console.WriteLine(MyProperty);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;可以发现副本的MyProperty值也是变化的。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;在并行情况下就是在最初全部克隆好了。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1250400.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47950/" target="_blank">iPhone 3GS首发日创AT&T多项纪录</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Windows Workflow Foundation中实现人工活动的demo，按照XPDL规范的实现</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 17 Jul 2008 11:04:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1245397.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245397.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1245397.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1245397.html</trackback:ping><description><![CDATA[在XPDL规范中，一个人工参与的活动有以下特性：活动任务的多实例（根据活动上指定的参与者，分配活动任务，活动任务我们称为工作项），工作项的分配策略（ALL所有参与者分配和Radom随机挑选分配，当然还有更多的资源模式，因为是是demo就不实现了），活动的完成策略（ALL所有工作项完成活动才完成和ANY任意工作项完成即完成），工作项执行模式（并行和串行）。<br />
开始我的描述，下图是封好的组合活动，整个组合活动暴露的属性有：参与者（是个集合，可以自己定义组织模型接口，用户、岗位、用户组、组织等）、分配策略、完成策略、执行模式、预警规则等。<br />
<img height="589" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/HumanActivity.JPG" width="421" border="0" /><br />
我们一一来看组合活动中的每个活动的作用：<br />
1、FindParticipant活动传入参与者列表和分配策略，经过对策略的不同处理（动态的参与者需要从上下文中获取），返回最终确定的参与者。<br />
2、ApprovalReplicator活动是ReplicatorActivity，这个是实现活动任务多实例的关键。将计算获得的参与者列表作为ReplicatorActivity的InitData，参与者列表的数量会决定整个ReplicatorActivity块的执行次数，每次会起单独的线程（通过观察ActivityExecutionContext的ID与父活动的不一样得知，异步线程的Context都是自己管理的），每个线程的初始数据即为具体的一个参与者。根据工作项执行模式是并行的还是串行的来设置ReplicatorActivity的ExecutionType属性。ReplicatorActivity的四个事件都很有用，为了初始数据和支持策略的实现，这里不赘述。再多说一句，WF设计器好像对IList类型的属性支持不好，实现中我都是手写代码绑定的这类参数，应该是个Bug。<br />
3、SingleApproval是封的组件活动，因为ReplicatorActivity里只能包含一个活动，所以必须封一下。<br />
4、CreateWorkItem根据线程拥有的参与者，在数据库中创建工作项。工作项概念在WF中没有，估计WF就不是为人工活动设计的。我们就将其设计为业务数据，可以在数据库部署上与WF默认提供的数据库分离。<br />
5、LintenForApproval+WaitComplete配合实现流程对用户完成工作项的等待。这里要注意的关键点是CorrelationToken的运用，目的是分清楚来自与宿主程序的完成工作项的事件到底要发给哪个线程。WF的这个设计还是与Biztalk一致的，需要有创建CorrelationToken的活动（本例中是CreateWorkItem），后续的活动（本例中是WaitComplete）标记为Follow这个CorrelationToken。CorrelationToken的OwnerActivityName的设置也是很关键的点，这种多线程的场景中，如果这个属性设置为SingleApproval就坏事了，这样每个线程的CorrelationToken还是区分不出来，这里的技巧是设为/Parent，由运行时指定为父活动，WF引擎是支持的。还有一点要提的是，需要使用CorrelationToken的这种活动引用的用户接口必须加上<font face="Verdana">CorrelationParameter</font>特性，这个Lab中都有，不赘述了。<br />
6、UserSolve活动就是根据用户完成工作项的执行情况（宿主程序在事件参数中传入用户执行结果）。<br />
7、DelayActivity根据传入的预警信息生成等待的时间，DefaultSolve即完成预警信息中指定的动作。<br />
8、还差一点就是完成策略还没有提到，这个是通过ReplicatorActivity的UntilCondition来实现的，只要这个条件计算的结果是true，那么整个ReplicatorActivity就结束，而丢弃其他未完成的线程，每个线程的结束都会触发这个条件计算的执行。剩下的策略规则就不难实现了，根据不同的场景堆代码吧。<br />
<br />
以上的组合活动来实现人工活动的要点有：<br />
1、处理好ReplicatorActivity活动<br />
2、Listen活动+HandlerExternalEvent活动的配合，CorrelationToken的设置<br />
完成这个demo后还觉得这样实现太过于啰嗦，真想用代码直接写个HumanActivity。对于上面的两个关键点的用代码实现的设想：<br />
1、ReplicatorActivity，我们用代码根据参与者列表起几个Thread的问题。<br />
2、Listen活动+HandlerExternalEvent活动，用WF的消息队列+书签的方式就可以搞定了，这个有疑问请看我前一篇博文。CorrelationToken我们写代码想这么搞怎么搞，哈哈！ 
 <img src ="http://www.cnblogs.com/ipointer/aggbug/1245397.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>WF消息队列的使用</title><link>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 17 Jul 2008 08:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1245297.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/07/17/1245297.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1245297.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1245297.html</trackback:ping><description><![CDATA[<div style="layout-grid:  15.6pt none">
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">工作流队列用于在宿主程序或工作流外部服务与工作流中的活动之间传递消息。</span></font><font face="Verdana"><span style="font-family: Verdana">WF</span></font><font face="宋体"><span style="font-family: 宋体">本质论里面写的很含糊，通过下面的例子可以很好的理解工作流队列的使用。</span></font></p>
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">例子主要功能是，一流程运行到</span></font><font face="Verdana"><span style="font-family: Verdana">ReadLine</span></font><font face="宋体"><span style="font-family: 宋体">活动处，等待用户在控制台的输入，如果用户没有输入，则流程会钝化，有一个书签（其实就是对事件的处理方法）会加到工作流队列的</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">QueueItemAvailable</span></font><font face="宋体"><span style="font-family: 宋体">事件上。</span></font></p>
<p><font face="宋体" size="2"><span style="font-size: 10.5pt; font-family: 宋体">下面首先看</span></font><font face="Arial"><span style="font-family: Arial">ReadLine</span></font><font face="宋体"><span style="font-family: 宋体">这个活动，解释看注释。</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System.Workflow.ComponentModel;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">using System.Workflow.Runtime;</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">namespace EssentialWF.Activities {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp; public class ReadLine : Activity {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; private string text;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; public string Text {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; get { return this.text; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p style="text-indent: 18pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">protected override void Initialize(IServiceProvider provider) {</span></font></p>
<p style="text-indent: 18pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">活动初始化时就用活动名字创建，不用担心多个实例间的重名情况，因为消息队列是跟着流程实例走的</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService =(WorkflowQueuingService)provider.GetService(typeof(WorkflowQueuingService));</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!qService.Exists(this.Name))</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qService.CreateWorkflowQueue(this.Name, true);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; protected override ActivityExecutionStatus Execute(ActivityExecutionContext context) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = context.GetService&lt;WorkflowQueuingService&gt;();</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">尝试执行获取用户输入，如果有用户输入，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">Dequeue</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">方法就能获取的到</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">并将活动的执行状态置为结束</span></font></p>
<p style="text-indent: 21pt"><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;WorkflowQueue queue = qService.GetWorkflowQueue(Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (queue.Count &gt; 0) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = (string)queue.Dequeue();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ActivityExecutionStatus.Closed;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">尝试执行没有成功，给队列的</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">QueueItemAvailable</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">事件（此事件会在消息入队列时触发）加上处理方法</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">并将活动的执行状态置为运行中</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; queue.QueueItemAvailable += this.ContinueAt;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return ActivityExecutionStatus.Executing;</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">下面都很好理解了，不说了</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; void ContinueAt(object sender, QueueEventArgs e) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActivityExecutionContext context = sender as ActivityExecutionContext;</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = context.GetService&lt;WorkflowQueuingService&gt;();</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueue queue = qService.GetWorkflowQueue(Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = (string)queue.Dequeue();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; context.CloseActivity();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; protected override void Uninitialize(IServiceProvider provider) {</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; WorkflowQueuingService qService = (WorkflowQueuingService)provider.GetService(typeof(WorkflowQueuingService));</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (qService.Exists(this.Name))</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; qService.DeleteWorkflowQueue(this.Name);</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp;&nbsp;&nbsp; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">&nbsp; }</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">}</span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体"><span style="font-size: 36pt; font-family: 宋体"><font style="font-family: " face="宋体" size="1"><span style="font-size: 9pt; font-family: ">再看我们的宿主程序怎么和</span></font><font style="font-family: " face="Arial" size="1"><span style="font-size: 9pt; font-family: ">ReadLine</span></font><font style="font-family: " face="宋体" size="1"><span style="font-size: 9pt; font-family: ">活动配合。</span></font></span></span></font></p>
<p><font face="Arial" size="1">&nbsp;</font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">string s = Console.ReadLine();</span></font></p>
<p><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">instance.EnqueueItem(&#8220;rl1&#8221;,s,null,null);//</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">这行代码就是向队列中加入消息，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">rl1</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">是活动的名称，</span></font><font face="Arial" size="1"><span style="font-size: 9pt; font-family: Arial">s</span></font><font face="宋体" size="1"><span style="font-size: 9pt; font-family: 宋体">是消息的数据信息，后两个参数是用于传递消息后接受反馈的通知。</span></font></p>
</div>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1245297.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47949/" target="_blank">Silverlight开发大赛奖金高达10000美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>查数据库死锁的实际例子</title><link>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 04 Jun 2008 16:23:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1214005.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/06/05/1214005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1214005.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1214005.html</trackback:ping><description><![CDATA[<p>一个项目上的数据库宕掉了，开始非说是我的工作流造成的。我也不是数据库的专家，只能硬着头皮边学边用的查了，怀疑是数据库死锁，就沿着这个方向前进。
<p>首先sa登录查询分析器，执行Dbcc traceon(1204, 3605, -1)，其中参数1204代表返回参与死锁的锁的类型以及当前受影响的命令，3605代表trace到的信息必须记录到日志中，-1代表返回当前所有打开的跟踪标记的状态。有几点要注意，1、事件探查器是跟不出死锁的sql的，因为它只是记录执行过的sql，而这些在事务里面死锁的sql都会被回滚的；2、只有在打开这些标记后数据库才会记录日志，打开这些标记会影响数据库性能，记得用完了使用Dbcc traceoff（标记号）关掉。
<p>接着就是再现这个死锁了，让实施人员在远程找5、6个人同时点这个功能，嘿嘿，不错，一下子就出来了。将数据库日志发过来，一般在Program Files\Microsoft SQL Server\MSSQL.4\MSSQL\LOG\ERRORLOG下。打开文件仔细看发现下面的日志。
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node:1
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RID: 5:1:6815:21&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CleanCnt:3 Mode:X Flags: 0x2<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Grant List 2:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Owner:0x3711E420 Mode: X&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flg:0x0 Ref:1 Life:02000000 SPID:59 ECID:0 XactLockInfo: 0x387A26FC<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPID: 59 ECID: 0 Statement Type: DELETE Line #: 133<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 1254295528]<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Requested By: <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x533EBC80 Mode: S SPID:67 BatchID:0 ECID:0 TaskProxy:(0x1F092374) Value:0x2962ae40 Cost:(0/0)<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node:2
<p>2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; KEY: 5:72057594056212480 (fc0199b9be7a) CleanCnt:2 Mode:S Flags: 0x0<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Grant List 2:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Owner:0x2028AD80 Mode: S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Flg:0x0 Ref:1 Life:00000000 SPID:67 ECID:0 XactLockInfo: 0x533EBCA4<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; SPID: 67 ECID: 0 Statement Type: SELECT Line #: 1<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Input Buf: RPC Event: Proc [Database Id = 5 Object Id = 484053356]<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Requested By: <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x387A26D8 Mode: X SPID:59 BatchID:0 ECID:0 TaskProxy:(0x576FE374) Value:0x1eb9ad20 Cost:(0/84)<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Victim Resource Owner:<br />
2008-05-31 10:10:46.20 spid5s&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ResType:LockOwner Stype:'OR'Xdes:0x533EBC80 Mode: S SPID:67 BatchID:0 ECID:0 TaskProxy:(0x1F092374) Value:0x2962ae40 Cost:(0/0)
<p>Node1（SPID：59）拥有了一个资源的排他锁Mode: X ，而需要申请另一个资源的共享锁Mode: S，Node2（SPID：67）拥有了后一个资源的共享锁，请求前一个资源的排他锁。根据学校里的零星知识，还是能明白这个道理的。照理说这种情况是不会死锁的，但是如果在事务里，共享锁也会在事务结束以后才释放。
<p>联机丛书上有一些信息可以利用来看这段日志。
<h6>类型列</h6>
<p>"类型"列显示当前锁定的资源类型。
<p>资源类型<br />
描述
<p>RID<br />
用于锁定表中的一行的行标识符。
<p>KEY<br />
索引中的行锁。用于保护可串行事务中的键范围。
<p>PAG<br />
数据或索引页。
<p>EXT<br />
相邻的八个数据页或索引页构成的一组。
<p>TAB<br />
包括所有数据和索引在内的整个表。
<p>DB<br />
数据库。
<h6>资源列</h6>
<p>"资源"列提供有关正被锁定资源的信息。
<p>资源类型<br />
描述
<p>RID<br />
表内已锁定行的行标识符。行由 fileid:page:rid 组合进行标识，其中，rid 是页中的行标识符。
<p>KEY<br />
SQL Server 内部使用的十六进制数字。
<p>PAG<br />
页码。页由 fileid:page 组合进行标识，其中，fileid 是 <strong>sysfiles</strong> 表中的 <strong>fileid</strong>，而 page 是该文件内的逻辑页码。
<p>EXT<br />
正被锁定的扩展盘区中的第一个页码。页由 fileid:page 组合进行标识。
<p>TAB<br />
由于 <strong>ObjId</strong> 列已包含表的对象 ID，所以没有提供任何信息。
<p>DB<br />
由于 <strong>dbid</strong> 列已包含数据库的数据库 ID，所以没有提供任何信息。
<p>在 <strong>sp_lock</strong> 的结果集内，锁定的 RID 资源类型中的资源描述为 1:1225:2。这表明在 fileid 1 内、页码为 1225 的页中、行标识符为 2 的行上应用了锁。
<p>最关键的信息我认为是
<p>[Database Id = 5 Object Id = 1254295528]和[Database Id = 5 Object Id = 484053356]<br />
指明了加锁的两个对象。
<p>select&nbsp; db_name(5)&nbsp; 结果为 cwbase_zclzj<br />
连接 cwbase_zclzj帐套，<br />
select object_name(484053356)&nbsp; 结果为&nbsp; ： erp_LS_BillCodeRule_GenerateNewBillCode<br />
select object_name(1254295528)&nbsp; 结果为： erp_LS_BillFlowNoRecords_NewRecordSave
<p>原来是两个存储过程搞得鬼，在生成单据编号的时候出现了死锁，因为两者是放在同一个事物中，也就验证了我们上面的猜想。简单的处理办法是不要放到同一个事物中，其他的办法就让负责维护的同事去管吧。
<p>就写到这里，其实日志里面的大部分咚咚还是看不懂，等待高人给予解释。如果分析中有什么不对的，也请各位回复指出，我也进一步学习一下。谢谢！</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1214005.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47947/" target="_blank">微软告攒机商第一案胜诉</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>喜欢使用VMware的.net程序员要注意呀（Visual Studio启动不了的问题）</title><link>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 27 May 2008 04:09:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1208276.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/05/27/1208276.html#Feedback</comments><slash:comments>24</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1208276.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1208276.html</trackback:ping><description><![CDATA[<font face="Verdana">VMware在安装的时候默认会在VS中装插件，VS启动时会去加载这些插件。<br />
VMware一共有四个服务，我们为了启动速度快一点，经常会停掉这些服务。而VS启动加载插件时如果这些服务是停止的，那么加载过程就会停在那里，就像我们看到的一直停留在启动画面的情况。<br />
解决方法：1、将这些服务的启动类型设为自动。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2、将注册表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\AddIns\VMDebugger.Connect目录下把LoadBehavior项改为0，反正我们基本不会去用到这些插件。<img src="http://www.cnblogs.com/Emoticons/msn/regular_smile.gif"  alt="" />&nbsp;&nbsp;</font>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1208276.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47946/" target="_blank">Mono这只猴子招惹了谁？</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>编译器错误信息: CS1595: 已在多处定义“ ”；一种可能出现的情况</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Sat, 29 Mar 2008 13:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1129218.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/29/1129218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1129218.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1129218.html</trackback:ping><description><![CDATA[先说一下网上经常能搜到的情况。<br />
<font face="Verdana"><a href="http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx">http://liubiqu.cnblogs.com/archive/2004/11/30/71025.aspx</a></font> 这个说了两种情况，方法 1：在 C# 编译器定义中包括 /nostdlib 选项；方法 2：为 ASPNET 帐户授予列出权限。可以参见一下。<br />
还有就是说把命名空间改掉，<font face="Verdana">http://www.cnblogs.com/zgqys1980/archive/2006/08/16/478414.html</font><br />
但对于我的情况都不适用。<br />
<br />
我的情况是运行时ieWebControl出现多处定义，并不是编译时。<br />
开始想不通，这个多处定义是怎么来的，做了一些尝试，如：重装这个控件，删除ASP.NET的临时文件，重启iis，都不管用。<br />
最后还是着眼于ASP.NET的查找dll的方式，大家都知道ASP.NET运行时的dll都是在临时文件夹（%Windir%\microsoft.net\framework\{<font face="Verdana">version</font>}）,而这里面的dll都是从GAC和Web应用程序根目录下Copy过来的。这样就想到是不是这两个地方都有这个dll呢，证实是这样的，而且版本还不一样，这就造成了运行时的多处定义。ps：Web程序和WinForm的加载dll的方式不一样，WinForm肯定是首先找GAC，再找运行目录或根据配置文件找，所以WinForm程序运行时不会出现这样的问题。结果就是删掉Web应用程序根目录下的这个dll，就正确的，也不知道哪个鸟人拷进去的。<img src="http://www.cnblogs.com/Emoticons/msn/confused_smile.gif"  alt="" />
<img src ="http://www.cnblogs.com/ipointer/aggbug/1129218.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47945/" target="_blank">Firefox 3.5本月晚些时候即首次升级</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>BPM业务场景分析（1）——内部交易合并开票</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 25 Mar 2008 07:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1121385.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/25/1121385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1121385.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1121385.html</trackback:ping><description><![CDATA[上篇的姊妹篇，上个系列是由工作流模式推业务场景，而本系列是由业务场景推运行时实现，都是头脑风暴的总结，不都是正确的，欢迎大家指正问题。<br />
<p>（1） 描述
<p>内部交易流程，完成了整个业务过程之后是集中开票的过程。开票操作是批操作，至于哪些放到一批里面，这个规则不确定，可能由人决定，可能是一个月开一次票。
<p>单纯的从业务发生发展角度来看，内部交易完成以后就应该是开票，以上的业务流程图很简单，如下：
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image002[3].gif"></a>&nbsp;<span lang="EN-US" style="font-size: 10.5pt; font-family: 'Times New Roman'; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA"><v:shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600">&nbsp;<img height="54" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM1.JPG" width="224" border="0" /></v:shapetype></span>
<p>展开来看，想要达到的运行效果类似于下图：
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image004[4].gif"></a><img height="164" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM2.JPG" width="368" border="0" />&nbsp;
<p>（2） 解决方案
<p>a、 将内部交易和集中开票分到不同的业务流程上，本来这者就没有太紧密的联系，因此分到两个业务流程上也很自然。实现方式上，内部交易流程实例正常结束，之后由人参与决定哪些数据集中到一张发票上，激活开票流程。为了流程回溯，在数据汇合的时候应该记录内部交易流程和开票流程之间的关系。这种方案适用于内部交易流程和开票之间没有固定规则，需要人参与的场景。
<p>b、 用多实例模式中的在运行时都不确定执行次数的方式来实现这个流程，内部交易流程是一个可重复执行的活动块，这个活动重复执行的次数是在运行时外部事件决定的，可能是时间，也可能是人参与产生的事件。如，在某些管理方法中是月结的，即是由时间作为外部事件，下图描述了这种情况。
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image006[4].gif"></a><img height="105" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM3.JPG" width="528" border="0" />&nbsp;
<p>上图的流程的启动条件是每月月初，并使能重复执行Scope块活动，每个内部交易开始激活一个执行线程，此内部交易流程结束后，整个Scope块活动仍然处于使能状态，直到结束条件&#8216;时间到月末&#8217;成立，整个Scope块活动结束，然后进行集中开票。
<p>（3） 含义引申
<p>从上面的两个解决方案引出了一个问题，什么样的流程环节应该画在一个流程里面，而什么样的应该分开，这个是不是有选择的标准？是根据实施人员的经验来进行判断？那么两个不同水平的实施人员所定制的流程的可用性将有天壤之别。目前总结的标准或者说是策略包括：
<p>a、 流程描述、展现的含义是不是清楚。在特定流程定制工具的约束下，是不是能表达出流程的本义。
<p>b、 数据转换存不存在问题。在一个流程中，这个肯定不是问题，而分开了可能就有问题。
<p>c、 流程回溯、数据跟踪的方便性，同上面一条的道理。
<p>除了上述的选择标准的问题，还有一个问题不得忽视。如何保持流程之间的串联性，说白了就是如果是自动激活了流程，如何通知这个流程启动，而如果是由人激活的流程，那么如果去通知这个人。自然的联想就是通过消息中间件，其特征必须具备传达的可靠性、大吞吐量和回馈的准确性。微软的建议是使用Biztalk，那么就在这种假设下构建了如下的业务流程图。
<p><a href="file:///C:/Documents%20and%20Settings/zhujch/Application%20Data/Windows%20Live%20Writer/PostSupportingFiles/2aab81c2-10d5-467d-874f-cba1bd3c7d0b/clip_image008[4].gif"></a><img height="176" alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/BPM4.JPG" width="375" border="0" />&nbsp;
<p>上图表达了粗粒度的业务流程图，图中每个方块代表的是一个模块内的流程，而模块间的流程的互操作性由Biztalk的能力提供，主要依赖强大的Mapping做数据转换、抓取数据的BAM用来做数据跟踪、消息中间件的能力。
<p>另一个问题是业务流程划分的力度不能过小，如果还是以一个功能点为一个业务流程的话，又回到了目前功能驱动的情况了。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1121385.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47944/" target="_blank">Google App Engine出现故障宕机6小时</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>高级工作流模式深入业务场景分析（1）——多路合并</title><link>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 24 Mar 2008 08:59:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/1119962.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2008/03/24/1119962.html#Feedback</comments><slash:comments>25</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/1119962.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/1119962.html</trackback:ping><description><![CDATA[<p>开篇之作
<p>（1） 描述
<p>两条或更多的分支合并到单一的一条后续路径中，每一条使能进入分支都激活后续路径的一次执行线程。虽然多条分支在图形上是合并的，但是这个多路合并并不对这些分支激活的后续线程进行任何的同步。
<p>（2） 抽象模型描述
<p><a href="http://www.workflowpatterns.com/patterns/control/advanced_branching/wcp8_animation.php">多路合并的Flash动画</a>
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyBlR6kDLzGkhlqVfvdRf4ueMMjUcHfH0q3N_xAhdih1tIkrxlhj9zLLdrSlQ-AALA?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="134" alt="clip_image002" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyacxbxNO1yYkNJ72nYCTAU1mWOw6okoa2mVSh8jRtbSZu0DqA2Gua-3raIl66_N1U?PARTNER=WRITER" width="456" border="0" /></a>
<p>上图中，B和C是多路选择后的分支，这样的分支可以超过两个，假设还有E、F&#8230;&#8230;，这样的分支在多路选择处不进行同步，每一个分支都会激活一次D的执行，即D（B）、D（C）、D（E）&#8230;&#8230;，并且这些D的线程互不干扰。
<p>（3） 业务场景举例
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzvOsfDCaZPoqlAj0xmOePmaUTzMmGifHzu8yFeTY0iOCv1T0WOz-eS-uVcAyhXgYE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="197" alt="clip_image004" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzUZsI8pqRT0e-WbVjcR21x7AwJBNdZrckmgHykXjhkh11z9kqO7o6oiI_ABFURUD0?PARTNER=WRITER" width="460" border="0" /></a>
<p>报销流程，假设分为三部分：住宿费、交通费、飞机票特殊报销。可能出现的情况有：住宿费+交通费；住宿费+交通费+飞机票特殊报销；交通费；交通费+飞机票特殊报销&#8230;&#8230;
<p>流程开始，首先填写报销申请（勾选报销的内容，三种费用中选择），之后流程根据勾选的内容激活后续的填写不同报销单的分支，最后每一张报销单都需要经过审批。
<p>如果流程引擎没有实现多路合并我们可以变相的实现上面的功能。如下图：
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hz61C3PIQSTYLd8ZnrWRotBQgg-wUbeSKhiw5QwUAw6Mh4sHHyGGh8cQt8K9-furFU?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="199" alt="clip_image006" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxIQmH5fpd6Q6ABK3WQOaYzeFlzr55WhQ4mMmRoeVk2u-hfDyU9JVfJRpkhFt9id8E?PARTNER=WRITER" width="528" border="0" /></a>
<p>但上述的实现有以下的不足：
<p>a、 重复工作量，审批分明是同一个活动，非要分多个来画；
<p>b、 无法进行统计，若要对审批这一活动的时间、数量等信息进行统计分析，那么分成了多个活动后就难于进行统计。
<p>c、 资源的分配，假设审批是由一个岗位来负责，且任务压力应该在这个岗位上负载均衡，那么分成了多个活动后这个资源的分配也无从着手。
<p>（4） 含义引申
<p>多路合并的后续路径，是一些相同行为的执行线程，这就类似于另外一种模式——多实例模式。这些线程终有一个需要同步的时候，在业务场景中，这个同步就非常的复杂，如后续步骤为制证，这种业务可以分为以下情况，我们一一举例说明：
<p>a、 强制一对一：一个审批后的单据生成一个财务凭证，那么这些多实例的线程暂时不同步，留到后续步骤。这种管理方式是比较常见的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hwPb46KdkOfLpjA9h6P4sq0wB368HCtLnFaKF_JaZCMBFu5lbf9UTba3kDEH3DanRQ?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image008" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxo6ts5qomkDxGR_7_BFEdzsyxAjia2g_Zduvp1pA34MfxD85zaUpJ93M5JCTBXSzY?PARTNER=WRITER" width="476" border="0" /></a>
<p>b、 强制多对一：同一个报销申请产生的报销单据，需要生成在一个财务凭证上。因此在制证前就需要同步。这种管理方式是比较常见的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxICm1Mkn0gEHMsEEtLNdIxcJH1phrCqJGJiKWnBjMlDR3e717efm0RSvpphuNCPoE?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image010" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hyUnCF_1GQjHWd2Fwr_yWOgcXPi5mTfF9XR_lSTYegCHTcuZnNWTRp4FxCzaK-DRfA?PARTNER=WRITER" width="477" border="0" /></a>
<p>c、 任意多对多：在本场景中，这个不太可能发生，但在一般的物流业务中却非常常见。假设飞机票的审批比较严格，拖得时间比较长，另外两个报销单早批了，那么先将这两个生成同一个财务凭证。这种任意性的规则，一般都是通过人来判断的。
<p><a href="http://tkfiles.storage.msn.com/y1pqjmKiMB65hxS4FUaqmpcci8Py_YWwnj5cEdgqk2O1RarItZtS23IXcB8eq71p_LhH2yQftgHBPo?PARTNER=WRITER"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="63" alt="clip_image012" src="http://tkfiles.storage.msn.com/y1pqjmKiMB65hzqh3Y8pnDFAl0d7ZvuwayI9nZuivDMUCtqez6iYlhNBr3dQelBWAlhaB2CVw3cJxE?PARTNER=WRITER" width="477" border="0" /></a></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/1119962.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47943/" target="_blank">消息称Facebook今年营收将达5.5亿美元</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>工作流系统中增加“业务活动”这一概念的想法</title><link>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 24 Oct 2007 19:06:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/936779.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/10/25/936779.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/936779.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/936779.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">什么是&#8220;业务活动&#8221;，我认为是对活动在业务层面上的更高的抽象，就好像我们提面向对象时将子类的公共方法提取到抽象类中一样，我们将活动在业务上的公共提取到&#8220;业务活动&#8221;上。&#8220;业务活动&#8221;建立在&#8220;业务流程&#8221;之下，是对流程更细一层的业务抽象。一个&#8220;业务活动&#8221;可以对应一个具体流程中的多个相同业务概念的活动，也可以对应在同一&#8220;业务流程&#8221;下的多个具体流程中同一业务环节的多个活动。</span>
<p style="text-indent: 21pt"><span style="font-family: 宋体">这样我们在为业务流程建模时，首先是定义&#8220;业务流程&#8221;，其次应该是识别流程中有哪些&#8220;业务活动&#8221;，并为&#8220;业务活动&#8221;定制一些属性，最后才是定义具体的流程。使用一套已经建立好了的&#8220;业务流程&#8221;来定制流程就变得非常的轻松，流程上关联业务流程，活动上关联业务活动，这样所有与业务相关的属性就都可以设置好。</span></p>
<p style="text-indent: 21pt"><span style="font-family: 宋体">先前版本的工作流将活动上不管是与业务相关的，还是与流程相关的属性一齐混杂在流程设计器上。这种实现方式有几大弊端：</span>1<span style="font-family: 宋体">、无法实现同一业务概念的复用，在一个活动上定的业务概念，需要在另一个相同业务意义的活动上原封不同的重定一遍。虽然我们实现了活动的复制，但我认为这种复制不是解决这种业务意义复用的很好方式。</span>2<span style="font-family: 宋体">、所有的与业务相关的实体都是独立于工作流系统之外的，在定义流程时将这些业务实体的设置记录在流程定义中。由于流程的版本控制，先前已经运行的流程定义是无法改变的，而业务实体又可能是会发生变化的，如单据的字段权限变化了（对于自定义表单这样生来就是为适应变化的，就更容易发生变化了），构件的参数又增加了一个等等，致使流程运行时业务上的改变得不到及时的体现，甚至运行不下去。</span>3<span style="font-family: 宋体">、流程运行结果，更通俗的讲可能是审批的结论、意见不能根据业务意义进行分类，明显的体现是审批结果打印时，所有的意见结论都罗列在一起（这个需求来源于</span>OA<span style="font-family: 宋体">项目组）。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">哪些活动属性应该放到&#8220;业务活动&#8221;上，我认为表单定义、表单权限设置（动作权限、字段权限），其他象外部工具、规则等也可以考虑放进来。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">工作流可以无区别的对待普通流程和</span>OA<span style="font-family: 宋体">使用的动态流程的权限设置，都包括表单参数设置、表单动作权限的设置、表单字段权限的设置。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">值得一提的是，像加签、会签、跳转等权限，我认为是纯粹的流程权限，不应该去表单的权限混为一谈，可以强制识别这些的流程引擎提供了的流程动态功能，并为其设置权限。</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 宋体">对特殊性、向下兼容的考虑，在流程定义上仍然保留这些在&#8220;业务活动&#8221;添加的属性，在使用时首先查找具体活动上的定义，再查找业务活动上的定义。这样的同一&#8220;业务活动&#8221;对应的活动也可以有完全不同的特性，而且对于老版本的流程定义，即使没有在活动上关联业务活动，仍可以正常运行。</span></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/936779.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47937/" target="_blank">微软8月25日开始通过WSUS推送IE8</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>回发或回调参数无效。在配置中使用...pages enableEventValidation="true"/&gt;</title><link>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 06 Jul 2007 01:21:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/807989.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/07/06/807989.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/807989.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/807989.html</trackback:ping><description><![CDATA[<p>今早给客户解决了个问题，问题<span>是回发或回调参数无效。在配置中使用&lt;pages enableEventValidation="true"/&gt;。<br>google了一下，网上有两种说法：<br>1、把&lt;pages enableEventValidation="true"/&gt;改成&lt;pages enableEventValidation="false"/&gt;就好了。<br>2、把web.config中的globalization元素的requestEncoding和responseEncoding属性都改成utf-8。<br><br>解决问题的时候两种方法都试过了，都没有用，最后发现是客户机器上装了.net framewoke2.0，如果装1.1的程序会将站点建成2.0的，把这里改过来就可以了。<img height=20 src="http://www.cnblogs.com/Emoticons/QQ/14.gif" width=20 border=0></span></p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/807989.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47935/" target="_blank">暴风称新旧版更换完毕 总计超4000万用户换装</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>转我们经理的一篇文章，业务流程实现的讨论，希望大家集思广议。</title><link>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 29 May 2007 07:53:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/764045.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/05/29/764045.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/764045.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/764045.html</trackback:ping><description><![CDATA[&nbsp;&nbsp; 现在搜一下业务流程管理，信息很多，也有很多产品号称是业务流程管理系统，但是在我看来，根本不是那么一回事，只能说某些产品只是实现了一个业务流中的某一个片段，如审批流、状态机、一个单据的流程。
<p>&nbsp;&nbsp; 想实现多个单据，如从申请、订单、发票、提货、出库、凭证一个完整的流程怎么办呢？怎么来用业务流管理起来。业务流系统的特点是根据规则系统自动分配任务，参与流程的人来完成任务。这个特点要求业务流的规则是可以定义和预见的。但是实际业务又要求，后续的业务只有在业务发生之时才能决定。这里面就存在一个矛盾，怎么解决这个矛盾呢。</p>
<p>&nbsp;&nbsp; 首先想到的是业务流的流程实例的拆分和合并，流程是跟业务对象实例一一对应的，业务流中的业务对象有很多种，每种业务对象的实例之间存在拆分和合并的可能。如果对象实例数据合并了，则流程实例也需要合并；如果对象实例数据拆分了，流程实例也需要拆分。</p>
<p>&nbsp;&nbsp; 第二个想到的办法是，将实例的明细数据启动一个流程实例，这里仍需要解决一个问题，那就是各个环节的处理是以一个业务实例为单位的，将明细数据对应一个流程实例，需要提供组处理的功能，即一组任务项合并为一个任务，处理这个任务就完成一批任务。</p>
<p>&nbsp;&nbsp; 第三个办法就是不使用业务流的原理来处理。即一个单据的完整流程使用业务流系统，几个单据之间使用的是集成流，利用集成的方式来处理几个单据之间的流转。</p>
<p>&nbsp; 虽然办法有很多，但是那种是最好的方式呢？</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/764045.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47934/" target="_blank">3.5版既出 Firefox面临新挑战</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>维护旧版本项目的一些方法</title><link>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 27 Mar 2007 16:45:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/690612.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/03/28/690612.html#Feedback</comments><slash:comments>13</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/690612.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/690612.html</trackback:ping><description><![CDATA[<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 今天碰到一个比较棘手的问题，一个做了2年多的项目上反映了一个问题，问题比较简单，但是涉及改动的dll引用的dll非常多，而且项目上的版本已经很旧了，这一处的改动会影响到几乎所有的dll的更新。单独更新这个dll是不可能了，也不能做完面的版本升级（公司的规定，可能升级是要花钱的，呵呵），而且vss中也清过了，没有留当时的代码。如果dll也能像asp页面一样直接修改，保存后就运行就好了。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 查了下资料，发现两种方法：（1）使用ildasm和ilasm两个自带的工具，加上IL（2）使用.NET Reflector插件FileDisassembler还原代码，重新编译。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先说一下第一种方法，使用ildasm打开项目上发过来的dll，在file下有dump菜单（如果是中文版就是文件下的转储菜单），弹出新窗口确定即可，生成后缀为.il的文件。下面就需要懂一点il语言，以前一直认为学习这个il语言没什么用，今天只能现学一把，因为问题比较小，4、5行就搞定了。保存之后，使用ilasm重新编译这个il文件。使用命令如ilasm.exe GSP_WorkflowEngine.il /dll /output=GSP_WorkflowEngine.dll，就OK了。不过在写il的时候还是碰到了很多问题，一直编译出错，还是il没有写好，看来学习il还是很多好处的。<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二种就是使用.NET Reflector插件FileDisassembler，先把这个插件下好挂上，菜单中就会出现FileDisassembler这个菜单项，打开要反编译的dll，就可以生成出源码，即使用了混淆器，要修改的问题也很容易找到，毕竟我们对自己的代码还是很熟悉的。重新建解决方案，添加需要引用的dll，重新编译就OK了。<br></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 写在最后，这两种方法本质上原理是一致的，我个人觉得，如果对il掌握的非常好的话，第一种方法是非常爽的，即使是在项目现场，对一些小问题修改都是相当轻易的。由此还想到.net的安全性，对于非强命名的dll来说，这种il级别的修改都是有效的，但对于软件的保护是相当不利的，我们是很容易从il中找到验证正版的代码信息，直接去掉，重新编译就破解了；对于入侵者来说，也是很容易修改系统上.net程序的运行方式的。</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/690612.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47930/" target="_blank">Bing首页将显示各国美景 顺推Silverlight</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>OutLook解析邮件头的问题</title><link>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 13 Mar 2007 15:33:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/673721.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2007/03/13/673721.html#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/673721.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/673721.html</trackback:ping><description><![CDATA[客户反映我们的邮件提醒中，显示的发送时间不对，而且相差的非常的大，如下图：<img src="http://www.cnblogs.com/images/cnblogs_com/ipointer/ee.JPG" border=0><br>左下角是用DateTime.Now打出来的正确时间，而右上角是OutLook解析邮件头显示出来的时间。<br>看到这个问题，觉得相当的奇怪，因为邮件头里我也是用WriteString(ns, "Date: " + DateTime.Now);往流里面写的呀，怎么会出来这么一个奇怪的时间呢？<br>开始是怀疑客户那里的应用服务器的时间出了问题，可几经确认，发现确实不是这个问题。<br>难道是邮件头里还隐藏着什么时间吗，可拿OutLook正常收到的邮件头和我们自己发的多次比较也没有发现什么问题，这个问题真是太奇怪了。<br>转而求助Google，也没有发现相关的文章；求助微软的老马，他只是指点可能时区出了问题。反复检查服务器上的时区，也没有问题。<br>郁闷之时，用FoxMail收了一下我们发的邮件，竟然正常，开始怀疑是微软小小的bug。<br>但还是定位不出问题，情急之下，胡搞乱搞，改了一下系统日期，调成了2006年，发现那个错误的日期也变成了2006-1-3。再观察邮件头，发现Date字段也变成了2006，于是问题还是出在了这个Data字段上。<br>再仔细比较我们的邮件头和正常的邮件头，发现了一点区别：<br>正常的是：Date: Tue, 13 Mar 2007 23:09:10 +0800<br>我们的是：Date: 2007-3-13 23:08:22<br>hoho，原来是OutLook解释不了这样的时间格式呀，于是修改代码成：<br>WriteString(ns, "Date: " + DateTime.Now.ToString("r"));<br>问题搞定！<br>这个被客户骂死的小问题拖了一两个月（嘻嘻，因为觉得不是大问题，也确实不知道怎么弄），终于找到原因了，庆祝一下。
<img src ="http://www.cnblogs.com/ipointer/aggbug/673721.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47929/" target="_blank">Gmail 的标签马上就会支持拖拽操作了</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>MS DTC简述</title><link>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 29 Sep 2006 09:38:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/518490.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/09/29/518490.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/518490.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/518490.html</trackback:ping><description><![CDATA[<p>刚刚看了关于MS DTC的文章，明白了一点。下面摘录一点。<br>MS DTC即为Microsoft Distributed Transaction Coordinator (MS&#174; DTC) 。</p>
<p><span class=90v>在 MS DTC 术语中，执行者被称为事务管理器。在执行事务保护资源的事务中，其参与者（如关系数据库）被称为资源管理器。<br><br><span class=90v>应用程序对每个资源管理器的第一次调用确定应用程序的当前事务。例如，如果应用程序在使用关系数据库，它会调用 ODBC 接口，此接口将事务对象与 ODBC 连接关联起来。在此之后，所有通过此连接的数据库调用都会代表该事务执行，直到该事务结束为止。<br></p>
<p><span class=90v>当某个资源管理器首先代表某个事务工作时，会通过调用事务管理器&#8220;登记&#8221;到该事务中。随着事务的发展，事务管理器会跟踪每个登记到该事务中的资源管理器。</span></p>
<p><span class=90v>通常，应用程序用 Commit 事务方法来完成事务。如果应用程序无法完成，则调用 Abort 事务方法，该方法可以撤消事务的操作。如果应用程序失败，MS DTC 就会放弃此事务。<br></p>
<p><span class=90v>当应用程序成功地完成事务的工作后，它会调用 MS DTC 来&#8220;提交&#8221;事务。然后 MS DTC 会仔细检查&#8220;两阶段&#8221; &#8220;提交协议&#8221;，使所有已登记的资源管理器都提交。两阶段提交协议可确保所有的资源管理器提交此事务，或全都放弃此事务。在第一阶段，MS DTC 询问每个资源管理器是否&#8220;准备&#8221;提交。如果所有参与者都回答&#8220;是&#8221;，那么在第二阶段 MS DTC 将向所有参与者广播提交信息。如果事务的任何部分失败，或资源管理器响应准备请求失败，或资源管理器响应&#8220;否&#8221;，那么 MS DTC 将通知所有资源管理器该事务已被放弃。</span></p>
</span></span></span>
<img src ="http://www.cnblogs.com/ipointer/aggbug/518490.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47928/" target="_blank">Windows 7 触摸功能是摆设 无厂商支持价值不大</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>图中跳转问题</title><link>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 03 Apr 2006 03:02:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/365394.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/04/03/365394.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/365394.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/365394.html</trackback:ping><description><![CDATA[<p>问题描述：在有向图中，有唯一的开始节点和结束节点。图中节点的分叉和汇合有两种类型AND和XOR，分叉的时候为AND时，流程会流入下面所有的分支，为XOR只留向其中一条分支；汇合的时候，AND表示所有汇入的分支都已汇入流程才能继续，XOR表示一条汇入流程就继续。如果能从开始节点出发，正确的到达结束节点，那么这个流程就是正确的。<br>现在的问题是流程的节点之间需要跳转，即流程不按正常的流向进行，而是跳向指定的节点，先如何通过算法算出有向图中从某节点可以向的节点集合。<br><img alt="" src="http://www.cnblogs.com/images/cnblogs_com/ipointer/jumptest.JPG" border=0><br>解决思路：<br>1、使用有向图的化简，有两种局部可以化简，从一个节点到另一个节点间没有分叉和汇合，那么这两个节点可以化简为直接连接；如果从一个节点到另一个节点间经过m个分叉和n个汇合，假设m&gt;n,那么局部可以化简为m-n个分叉和一条直接的连线。将图化到最简，最后比较容易判断节点间是否可跳。<br>2、通过模拟运行的方式，将要跳出的节点的迁移从图中去掉，加上从跳出节点到跳入节点的迁移，模拟让流程运行一下。看流程是否正确。<br>存在的问题：方法一碰到及其复杂的流程无法处理，不能判断是否能化简；方法二，无法判断流程没有运行下去的原因，是上面有节点未完成，还是流程确实存在问题，无法运行下去。<br>请教各位有没有更好的办法，或是成型的算法来解决这个问题。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<img src ="http://www.cnblogs.com/ipointer/aggbug/365394.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47927/" target="_blank">虚拟货币上了"紧箍咒" 新规将限制Q币发行</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>我们也要毕业了</title><link>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 05 Jan 2006 10:22:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/311769.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2006/01/05/311769.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/311769.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/311769.html</trackback:ping><description><![CDATA[<DIV>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">昨晚，</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">k</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">一本叫&#8220;理工大风流史&#8221;的校园小说到两点，终于</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">k</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">完。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">我不是一个矫情的人，但不由要写下下面一段矫情的文字。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">小说前面都是风平浪静，如同所有校园小说一样，笑料</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">爱情</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">暴力</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">+</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">边缘性描写，怀疑现在的大学校园怎么都在走&#8220;蛊惑仔&#8221;的路线。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">但最后毕业告别和无言的结局，还是在我心里搅和一下。&#8220;窗外，一张破旧的床单上几个大字，一起走过，在夏雨里浸开了墨迹&#8221;、&#8220;临行，为了逃避送站的痛苦，趁兄弟们熟睡时就悄悄地走了，只在美女墙画上留下，保重，和歪歪扭扭的签名&#8221;，联想到的就是网上颇为流行的毕业图组，此时，另一更强烈的念头滑过，&#8220;我们也要毕业了&#8221;，顿时酸楚。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">黑暗中，胡乱的从桌上抓起</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">zippo</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，让醇香的烟气走过喉咙，填补此刻的苍白。寂静的夜里，谁会在意一个大男孩的心声。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">思绪不由飘到了千里之外的丁香校园，那里恐怕已是白雪皑皑了，而哥们们已是散落在天涯，我的大学生活好像也是刚刚开场就荒诞的谢幕了。可爱的超超估计还在为考研忙得焦头烂额；婆婆妈妈的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">ken</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">还能在珠海沐浴和煦的海风；油光满面的睿睿在伟大首都孕育做官的美梦；老鼠估计还在骗人的中兴软件煎熬度日；红过脖子的</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">DKF</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，差不多能满足当上他外国新娘的愿望；当然不能忘怀的还有那份已经飘散的爱情。</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><FONT size=3><SPAN style="FONT-FAMILY: 宋体">小说自然是高于生活，我们的大学生活也可以拿出来试比高。我们的寝室翻不出</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">c cup</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">和</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">taotao</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">，却也有成堆的臭袜子和肥硕的小强；我们没有方桌上成宿的扑克麻将，却也有水房洗衣机上熬夜赶程序，贩卖机里驮来夜宵，兄弟们共饮；我们没有草丛树林的风流韵事，却也有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">99</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">多青涩的玫瑰；我们没有打架斗殴，却也有众志成城拿下篮球赛；我们没有网吧里数以月计的传奇奇迹，却也有</SPAN><SPAN lang=EN-US><FONT face="Times New Roman">KTV</FONT></SPAN><SPAN style="FONT-FAMILY: 宋体">里的烂醉如泥&#8230;&#8230;</SPAN><SPAN lang=EN-US></SPAN></FONT></P>
<P style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体"><FONT size=3>回首过去，我们一起走过，我小心翼翼的将记忆收起；而面对未来，没有了朝夕相处的兄弟，该往哪里去，我无言以对。</FONT></SPAN></P></DIV><img src ="http://www.cnblogs.com/ipointer/aggbug/311769.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47926/" target="_blank">魔兽世界审批期限有新说 - 80天才是正解</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>逻辑设计的例子</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 29 Dec 2005 06:24:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/307405.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/29/307405.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/307405.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/307405.html</trackback:ping><description><![CDATA[&nbsp; 
<P class=MsoBodyText2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">开发团队使用前期的使用场景定义对象和之间的关系、行为和属性（</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">attribute</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">）。团队要做以下的任务：</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"> <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<OL style="MARGIN-TOP: 0cm" type=1>
<LI class=MsoNormal style="COLOR: blue; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">定义场景中的用户、业务逻辑和数据对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></LI></OL>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<OL style="MARGIN-TOP: 0cm" type=1 start=2>
<LI class=MsoNormal style="COLOR: blue; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">定义对象的行为。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></LI></OL>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<OL style="MARGIN-TOP: 0cm" type=1 start=3>
<LI class=MsoNormal style="COLOR: blue; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">定义对象的属性（</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">attribute</SPAN><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">）或属性。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></LI></OL>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<OL style="MARGIN-TOP: 0cm" type=1 start=4>
<LI class=MsoNormal style="COLOR: blue; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt"><SPAN style="FONT-SIZE: 11pt; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">定义对象之间的逻辑关系。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></LI></OL>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoHeading8><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">统一建模语言</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoBodyText2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">统一建模语言</SPAN><SPAN lang=EN-US>(UML) </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">是阐述解决方案如何工作的工具。在图形化描述解决方案方面，它对于更完全分析解决方案非常有用。使用</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">UML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">是一种容易的方法来画出组件、交互、关系和更多其他信息。通常，</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">UML</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">被用来方便的分析逻辑设计。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoHeading8><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">对象</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">当分析使用场景的时候，首要的任务就是确定其中的对象。一个对象通常是出现在场景中的一个业务实体或过程。例如，在下面的一段话中，粗体字就是对象</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">:<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 36pt"><B style="mso-bidi-font-weight: normal"><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">用户</SPAN></B><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(User)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">选择一个<B style="mso-bidi-font-weight: normal">目录</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(Catalog)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">来浏览。<B style="mso-bidi-font-weight: normal">分类</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> (Categories)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">和<B style="mso-bidi-font-weight: normal">产品</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"> (Products)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">被展现在已选的根<B style="mso-bidi-font-weight: normal">目录</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(Catalog)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">中。<B style="mso-bidi-font-weight: normal">用户</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(User)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">之后选择一个<B style="mso-bidi-font-weight: normal">产品</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(Product)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">来查看它的细节或选择一个<B style="mso-bidi-font-weight: normal">分类</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(Categories)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">来查看其中的<B style="mso-bidi-font-weight: normal">产品</B></SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">(Product)</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">和子分类。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoBodyText2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">在这个场景中，下列对象被使用到：</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"> <o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<UL style="MARGIN-TOP: 0cm" type=disc>
<LI class=MsoNormal style="COLOR: blue; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt">User <o:p></o:p></SPAN>
<LI class=MsoNormal style="COLOR: blue; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt">Catalog <o:p></o:p></SPAN>
<LI class=MsoNormal style="COLOR: blue; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt">Categories <o:p></o:p></SPAN>
<LI class=MsoNormal style="COLOR: blue; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt">Product <o:p></o:p></SPAN>
<LI class=MsoNormal style="COLOR: blue; mso-list: l1 level1 lfo2; tab-stops: list 36.0pt"><SPAN lang=EN-US style="FONT-SIZE: 11pt; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt">Products <o:p></o:p></SPAN></LI></UL>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">下面的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">UML</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">图阐述了在本例中的对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;<IMG height=73 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/object.JPG" width=400></o:p></SPAN></P>
<P class=fig><SPAN lang=EN-US><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">在这个场景中有五个基础的对象；然而，为了实现场景的功能还可能需要一些附属的的对象，即使他们没有被特别的列入这个基础对象列表。你可以在检查动作的时候定义这些附属的对象。你首先要定义出动作，才能发现并定义这些附属的对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><I style="mso-bidi-font-style: normal"><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></I></P>
<P class=MsoHeading8><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">行为</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">在定义完明显的对象集合之后，下一步的工作就是定义他们各自的行为，以方法和服务的方式表现。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">为了定义对象的行为，你必须首先估计场景中要做什么。例如，在下面的一段话中，动作备用粗体标识：</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 36pt"><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">用户<B style="mso-bidi-font-weight: normal">选择</B>一个目录来浏览。分类和产品被<B style="mso-bidi-font-weight: normal">展现</B>在已选的根目录中。用户之后<B style="mso-bidi-font-weight: normal">选择</B>一个产品来<B style="mso-bidi-font-weight: normal">查看</B>它的细节或选择一个分类来<B style="mso-bidi-font-weight: normal">查看</B>其中的产品和子分类。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">发生的第一件事是用户选择了一个目录。下面的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">UML</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">图阐述了用户对象包含了一个选择目录的行为。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p><IMG height=88 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/activity.JPG" width=100>&nbsp;</o:p></SPAN></P>
<P class=fig><I style="mso-bidi-font-style: normal"><SPAN lang=EN-US><o:p></o:p></SPAN></I></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">不能关联到明显对象的行为必须从场景中派生。如下面的情况，用户要选择一个目录，那么必须有一些机制使得一个目录可以从一个目录列表中被选中。你可以从逻辑上假定一个目录集合对象，他管理目录的集合。因此，你就可以在对象的列表中添加一个新的对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">在定义完目录集合对象之后，你可以添加属于这个对象的第一个方法</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt; mso-bidi-font-style: italic">Select Catalog</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"> </SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">之后，你需要继续估计场景中的每一句话，直到你定义出所的对象和相关的行为。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoHeading8><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">属性</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">定义完行为之后的下一步工作是定义对象的属性（</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">attribute</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">，或称为</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">property</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">）。属性是解决方案需要跟踪的元素。它们是数据保存和持续化的位置。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoBodyText2><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">通过分析场景中的行为来定义属性（</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">attribute</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">），抽取出场景中需要跟踪或持续化的元素。例如，在前面一块中，场景指定用户需要查看产品。当产品被查看时，展现给用户的那些元素就是产品的属性（</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">attribute</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">）。例如，如果业务需要产品的描述和价格被展示给用户，这些元素就成为属性被添加到对象中去。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">下面的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">UML</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">图中阐述了包含</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">Name</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">属性的</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">User</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;<IMG height=100 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/attribute.JPG" width=100></o:p></SPAN></P>
<P class=fig><I style="mso-bidi-font-style: normal"><SPAN lang=EN-US><o:p></o:p></SPAN></I></P>
<P class=MsoToc1><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoHeading8><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN">关系</SPAN></P>
<P class=MsoNormal><B><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></B></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">在定义完对象、行为和属性（</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt">attribute</SPAN><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">）之后，下一步是定义关系。关系是对象间的逻辑关联。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial">为了定义关系，需要分析对象间是如何交互的。例如，目录集合对象跟目录对象有一个关系，因为目录集合对象管理目录对象。</SPAN><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: Arial; mso-bidi-font-size: 12.0pt"><o:p>&nbsp;</o:p></SPAN></P><SPAN style="FONT-SIZE: 11pt; COLOR: blue; FONT-FAMILY: 宋体; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-fareast-language: ZH-CN; mso-bidi-font-size: 12.0pt; mso-bidi-font-family: Arial; mso-ansi-language: EN-US; mso-bidi-language: AR-SA">另一个关系的类型是继承，处理一个对象定义另一个对象的特定情况。例如，解决方案中设计要卖出食物和书，但设计者向在逻辑上区分两者，结果是定义出一中关系书和食物对象都是产品类型的一类。它们都继承自产品对象。</SPAN> <img src ="http://www.cnblogs.com/ipointer/aggbug/307405.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47925/" target="_blank">“必应”出生满月 抢夺谷歌蛋糕</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>entlib2.0研究（五）--缓存组件的设计</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 13 Dec 2005 07:08:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/296289.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/296289.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/296289.html</trackback:ping><description><![CDATA[摘要:  3缓存组件的设计缓存组件被设计实现下面的目标：l 提供一定的APIsl 是开发者在不了解内部工作原理的情况下，使用组件。l 使用配制工具进行简单的配制l 提供性能的优化l 线程安全，l 如果异常发生，确保后端数据的完整l 确保内存数据和后端数据的同步3.1设计亮点当你使用CacheFactory初始化CacheManager实例时，他在内部创建CacheManagerFactory对象，接着创建&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/13/296289.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/296289.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47924/" target="_blank">Firefox 3.5正式版全球下载量突破500万次</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>entlib2.0的研究（四）--使用缓存组件开发应用程序</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 12 Dec 2005 03:54:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/295458.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/295458.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/295458.html</trackback:ping><description><![CDATA[摘要:  2使用缓存组件进行开发首先，解释如何配置，添加到你的解决方案中去，选择后端的存储器。接着，显示如何在特定场景中使用缓存组件。2.1添加配置信息注意: 这个版本的配制工具还没有发布，所以要改变配置，只能编辑XML文件，参考QuickStart和单元测试的配置文件。2.2添加程序代码完成由以下的几个步骤：l 添加Microsoft.Practices.EnterpriseLibrary.Cachin&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/12/295458.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/295458.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47923/" target="_blank">网易今日凌晨开放战网及魔兽官网</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>国际化组件的设计</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 09 Dec 2005 07:52:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/293874.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/09/293874.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/293874.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/293874.html</trackback:ping><description><![CDATA[&nbsp; 
<H3><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-language: ZH-CN">国际化组件</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></H3>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<TABLE style="MARGIN-LEFT: 5.25pt; WIDTH: 450pt; BORDER-COLLAPSE: collapse; mso-yfti-tbllook: 480; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellSpacing=0 cellPadding=0 width=600 border=0>
<TBODY>
<TR style="mso-yfti-irow: 0; mso-yfti-firstrow: yes">
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #00ccff; PADDING-BOTTOM: 0cm; WIDTH: 283pt; PADDING-TOP: 0cm" vAlign=top width=377>
<P class=MsoBodyText><SPAN class=BodyTextBold><SPAN lang=EN-US style="mso-bidi-font-family: 'Times New Roman'; mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN">Author<o:p></o:p></SPAN></SPAN></P></TD>
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; BACKGROUND: #00ccff; PADDING-BOTTOM: 0cm; WIDTH: 167pt; PADDING-TOP: 0cm" vAlign=top width=223>
<P class=MsoBodyText><SPAN class=BodyTextBold><SPAN lang=EN-US style="mso-bidi-font-family: 'Times New Roman'">Contact<o:p></o:p></SPAN></SPAN></P></TD></TR>
<TR style="mso-yfti-irow: 1; mso-yfti-lastrow: yes">
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 283pt; PADDING-TOP: 0cm" vAlign=top width=377>
<P class=MsoBodyText><SPAN lang=FR style="mso-fareast-font-family: 宋体; mso-fareast-language: ZH-CN; mso-ansi-language: FR">Jin-Chen Zhu,LangChao</SPAN><SPAN lang=FR style="mso-ansi-language: FR"><o:p></o:p></SPAN></P></TD>
<TD style="PADDING-RIGHT: 5.4pt; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; WIDTH: 167pt; PADDING-TOP: 0cm" vAlign=top width=223>
<P class=MsoBodyText><SPAN lang=EN-GB style="mso-fareast-language: ZH-CN; mso-ansi-language: EN-GB">zhujch@langchao.com</SPAN><SPAN lang=EN-GB style="mso-ansi-language: EN-GB"><o:p></o:p></SPAN></P></TD></TR></TBODY></TABLE>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.1<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Goal<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-fareast-language: ZH-CN">国际化组件可以将非特定语言的字符串转化成特定语言的字符串，还可以通过反射的方式将某一界面上控件的文字换成特定语言的文字。</SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.2<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Context<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><v:shapetype id=_x0000_t75 stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"></v:path><o:lock aspectratio="t" v:ext="edit"></o:lock></v:shapetype><o:p></o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore"><IMG height=357 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global1.JPG" width=505><BR>1.1.1.3<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Behavior View<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.4<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Structure View<BR><IMG height=344 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global2.JPG" width=637><BR><o:p></o:p></SPAN></H4>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -54pt; mso-char-indent-count: -5.4; mso-para-margin-left: -5.4gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -36pt; mso-char-indent-count: -3.6; mso-para-margin-left: -3.6gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 0cm; TEXT-INDENT: -36pt; mso-char-indent-count: -3.6; mso-para-margin-left: -3.6gd"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 72pt; mso-char-indent-count: 7.2"><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p></o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore"><IMG height=432 hspace=0 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/global3.JPG" width=401><BR>1.1.1.5<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Other Specification<o:p></o:p></SPAN></H4>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="mso-fareast-language: ZH-CN"><o:p>&nbsp;</o:p></SPAN></P>
<H4><SPAN lang=EN-US style="mso-bidi-font-family: Verdana; mso-fareast-font-family: Verdana; mso-fareast-language: ZH-CN"><SPAN style="mso-list: Ignore">1.1.1.6<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="mso-fareast-language: ZH-CN">Best Practice <o:p></o:p></SPAN></H4>
<P class=MsoNormal style="TEXT-INDENT: 54pt; mso-char-indent-count: 6.0; mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: teal; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">ResourceFactory</SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"> fa = <SPAN style="COLOR: teal">ResourceFactory</SPAN>.GetInstance();<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">GspRM</SPAN> resourceManager = <SPAN style="COLOR: blue">null</SPAN>;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">if</SPAN> (comboBox1.Text == <SPAN style="COLOR: maroon">"</SPAN></SPAN><SPAN style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; COLOR: maroon; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">中文<SPAN lang=EN-US>"</SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes">)<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>resourceManager = fa.GetRM(<SPAN style="COLOR: maroon">"formui"</SPAN>, <SPAN style="COLOR: maroon">"zh-cn"</SPAN>);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: green">//resourceManager = fa.GetRM("aa","zh-cn");<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN> change = <SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN>.Instance;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>change.ChangeLanguage(<SPAN style="COLOR: blue">this</SPAN>, <SPAN style="COLOR: blue">new</SPAN> System.Globalization.<SPAN style="COLOR: teal">CultureInfo</SPAN>(<SPAN style="COLOR: maroon">"zh-chs"</SPAN>));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: blue">else<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>{<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>resourceManager = fa.GetRM(<SPAN style="COLOR: maroon">"formui"</SPAN>, <SPAN style="COLOR: maroon">"en-us"</SPAN>);<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN> change = <SPAN style="COLOR: teal">FormLanguageSwitchSingleton</SPAN>.Instance;<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>change.ChangeLanguage(<SPAN style="COLOR: blue">this</SPAN>, <SPAN style="COLOR: blue">new</SPAN> System.Globalization.<SPAN style="COLOR: teal">CultureInfo</SPAN>(<SPAN style="COLOR: maroon">"en-us"</SPAN>));<o:p></o:p></SPAN></P>
<P class=MsoNormal style="mso-pagination: none; mso-layout-grid-align: none"><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 9pt; BACKGROUND: #d9d9d9; FONT-FAMILY: 宋体; mso-hansi-font-family: 'Times New Roman'; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto; mso-no-proof: yes"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="COLOR: teal">MessageBox</SPAN>.Show(resourceManager.GetLocalizeToken(<SPAN style="COLOR: maroon">"result"</SPAN>, <SPAN style="COLOR: maroon">"jane"</SPAN>));</SPAN><SPAN lang=EN-US style="BACKGROUND: #d9d9d9; mso-fareast-language: ZH-CN; mso-shading: white; mso-pattern: gray-15 auto"><o:p></o:p></SPAN></P><img src ="http://www.cnblogs.com/ipointer/aggbug/293874.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47919/" target="_blank">微软公布部分Windows 7中文版本零售价</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>entlib2.0研究（三）缓存组件的介绍</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 09 Dec 2005 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/293839.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/09/293839.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/293839.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/293839.html</trackback:ping><description><![CDATA[&nbsp; 
<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存组件</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">介绍</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存组件可以使开发者将本地的缓存机制加到应用程序中。它支持内存中缓存和可选的后端的存储（数据库方式和隔离存储方式）。缓存组件提供</SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">retrieve, add, and remove cached data</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">等功能。过期和自我清除策略也是给组件的一部分。<SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">缓存可以克服一些风险：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">性能。采用一种更为密切的方式，为数据的消费者存储相关的数据；以避免重复性的数据创建、处理和传输。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">可度量性。在缓存中存储信息可以节省资源，并随着应用程序的需求量增加，而增加可度量性<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l3 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">可用性。使用缓存，您的应用能够在网络的的延时、<SPAN lang=EN-US>WEB</SPAN>服务和硬件的问题中减小损失。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">常用场景<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">缓存组件适用于一下情况：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">你必须重复的访问静态的或是很少变动的数据<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">数据访问在创建、访问和传输上花费很大<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo2; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">即使数据源是不可用的，数据也必须是可用的<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt">你可以在下面的应用程序类型中使用缓存组件：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Windows Forms <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Console application <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Windows service <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">COM+ server <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 42pt; TEXT-INDENT: -21pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo3; tab-stops: list 42.0pt" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">ASP.NET Web application or Web service if you need features not included in the ASP.NET cache<o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你必须为每一个应用程序块部署一个缓存组件。每一个应用程序块可以由一个或多个缓存，可以有或没有后端存储。不支持，也不应该支持多个由多个</SPAN><SPAN lang=EN-US>Cache manager</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">共享存储或分区</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存组件在性能和线程、异常安全方面作了优化。你可以扩展你自己的过期策略和后端存储。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">缓存组件的特性</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">使用配制工具配制</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以配制持久存储位置，使用隔离存储器或数据访问组件，他们的状态与内存中的缓存保持同步。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">你可以扩展你自己的过期策略和后端存储。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">确保线程安全。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">系统依赖</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Microsoft.Practices.EnterpriseLibrary.Common.dll</SPAN></B></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Microsoft.Practices.ObjectBuilder.dl</SPAN></B></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l4 level1 lfo4; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-bidi-font-weight: bold">数据访问组件</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">推荐的修改配置的方式是使用配制管理工具。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">场景和目标</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">涵盖的场景有：</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l5 level1 lfo5; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">选择和配置缓存存储器</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l5 level1 lfo5; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">加一项到缓存中，设置它的过期数据</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l5 level1 lfo5; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">移出一项</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l5 level1 lfo5; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">取出一项</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l5 level1 lfo5; tab-stops: list 42.0pt"><SPAN lang=EN-US style="FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">刷新缓存</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">决定何时使用缓存组件</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo6; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">需要在不同的应用中有一致的缓存形式。例如，开发者可以写出相似的代码来实现缓存。在所有环境中的相同配置项。</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo6; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">当需要可配的持久的后端存储。创建附加的后端存储，使用配置项来添加到缓存组件中。在持久化到后端存储前，用对称加密算法进行加密。</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo6; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">不改变代码的情况下，改变缓存配置项。</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l2 level1 lfo6; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">需要下面的过期策略：绝对时间、变化的时间、扩展时间格式、文件依赖或永不过期。</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">安全性</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-size: 10.5pt">虽然你可以对后端的数据进行加密，但日志组件不提供对内存中的数据加密。所以如果安全性会威胁到你的程序，请不要将账户和密码等敏感信息放到缓存中。</SPAN><SPAN lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p>&nbsp;</o:p></SPAN></P><img src ="http://www.cnblogs.com/ipointer/aggbug/293839.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47919/" target="_blank">微软公布部分Windows 7中文版本零售价</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Enterprise Library2.0研究（二）日志组件的开发说明</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 06 Dec 2005 07:35:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/291825.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/291825.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/291825.html</trackback:ping><description><![CDATA[摘要:  2使用日志组件进行开发2.1添加配置信息 待添加2.2增加准备的工作 首先，是使用日志组件的准备。（1） 添加对Microsoft.Practices.EnterpriseLibrary.Logging.dll, Microsoft.Practices.EnterpriseLibrary.Common.dll 的引用。（2） 在代码中添加：using Microsoft.Practices.En&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/12/06/291825.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/291825.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47918/" target="_blank">Firefox 3.5：很快 但还是不够</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Enterprise Library2.0研究（一）日志组件的使用场景</title><link>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 05 Dec 2005 09:56:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/291116.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/12/05/291116.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/291116.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/291116.html</trackback:ping><description><![CDATA[<P class=MsoNormal><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><FONT face="Times New Roman">Enterprise Library2.0刚刚发布了December 2005的release，多了configuration的工具，真是及时，就不用自己做了。被安排看日志这一块，就开始翻译官方的doc，贴出来大家看看。翻得比较粗糙，大家包涵。<BR><BR><BR>1</FONT>日志组件的介绍</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">日志组件简化了日志功能的实现。开发者可以将日志记录到多个不同的</SPAN><SPAN lang=EN-US>sinks:</SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">An e-mail message <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">A database <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">A message queue <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">A text file <o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">A WMI event<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">The event log<o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">客户自定义的<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">日志组件提供了日志信息终端的一致界面。程序代码不用指定信息的目的地。配置设定决定是否写日志和日志写到何处。这意味着程序员不用修改改变程序就可以修改日志记录的行为。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.95pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.71" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">日志组件在下面几个方面有助于应用程序的开发：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">帮助维持一致的日志记录习惯<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">通过使用一致的体系模型简化开发者的学习曲线<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">提供通用日志记录的解决方案<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">它是可扩展的，支持客户订制<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 17.95pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 17.95pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">通用场景<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">开发者经常会写需要日志功能的应用程序。典型的，这些应用程序规格化和记录由事件产生的日志信息。例如，开发者经常编写代码来记录未预想情况的日志，如应用程序的异常，连接数据库的失败。还会编写代码来跟踪应用程序的执行轨迹。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">应用程序需要在本地和跨网络写消息。在一些情况下，不得不整理从多个源的事件到一个位置。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">日志组件通过封装大多数通用日志场景的类和方法的集合来简化应用程序的开发。这些场景包括：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">发布和日志化事件消息<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">包含事件的上下文信息<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">跟踪应用程序的活动<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">每个任务都以一致的行为来处理，从特定的程序中抽象出统一的部分。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">新特性的提纲<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">日志组件被修订来利用<SPAN lang=EN-US>.net2.0</SPAN>中<SPAN lang=EN-US>System.Diagnostics</SPAN>命名空间的优势。特别的，它严重依赖于<SPAN lang=EN-US>TraceListener</SPAN>，<SPAN lang=EN-US>TraceSource</SPAN>和<SPAN lang=EN-US>CorrelationManager</SPAN>类。在以下几个方面简化了体系模型：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">不再有分布策略。在你需要自定义分布策略的场景，可以订制特别的<SPAN lang=EN-US>TraceListener.<o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">LogEnter</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">对象可以属于两个以上的分类。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">你可以创建自己的过滤器。过滤事件在向<SPAN lang=EN-US>TraceListener</SPAN>发事件之前。有了过滤器可以基于分类和优先级来忽略不感兴趣的事件<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">可以通过自己的代码来查询过滤器，查看一个特别的事件是否被记录。这意味着可以避免那些没有被配置需记录的<SPAN lang=EN-US>log entry</SPAN>做了不好的行为，而无法查看的情况。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">需要移植的特性<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-INDENT: 17.85pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-char-indent-count: 1.7" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">下面是需要从老版本中移植的部分：<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">新版本中默认的存储位置是应用程序配置文件，老版本中是<SPAN lang=EN-US>loggingConfiguration.config</SPAN>。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">LogEntry</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">类的服务器属性现在是<SPAN lang=EN-US>TraceEventType</SPAN>枚举，而不是<SPAN lang=EN-US>Int32</SPAN>的整型。使用<SPAN lang=EN-US>TraceEventType</SPAN>枚举改善了与<SPAN lang=EN-US>System.Diagnostics</SPAN>的交互性。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果使用<SPAN lang=EN-US>Message Queuing</SPAN>分布策略，需要修改配置使用<SPAN lang=EN-US>MsmqTraceListener</SPAN>类。必须在客户端选择发送消息到哪个消息队列<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">为了使用<SPAN lang=EN-US>CorrelationManager</SPAN>类，<SPAN lang=EN-US>ActivetyID</SPAN>属性是一个<SPAN lang=EN-US>GUID,</SPAN>而且不再被保存在堆栈上。这意味着一个请求只有唯一的<SPAN lang=EN-US>ActivityID</SPAN>。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Log</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">接收器（<SPAN lang=EN-US>sinks</SPAN>）派生于<SPAN lang=EN-US>TraceListener</SPAN>类。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 18pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">日志组件的依赖<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Core library</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">功能。<SPAN lang=EN-US>Core</SPAN>中提供了<SPAN lang=EN-US>instrumentation</SPAN>和<SPAN lang=EN-US>configuration</SPAN>服务，被所有其他的组件共享。<SPAN lang=EN-US>Core</SPAN>包含于</SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Microsoft.Practices.EnterpriseLibrary.Common.dll</SPAN></B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-bidi-font-weight: bold">中。</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">ObjectBuilder</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">子系统。提供所有重复和必要的创建和销毁对象实例的任务，同时提供高度的可扩展性。<SPAN lang=EN-US>Enterprise library</SPAN>使用<SPAN lang=EN-US>objectBuilder</SPAN>子系统来提供如插入配置项到<SPAN lang=EN-US>block</SPAN>类和连接<SPAN lang=EN-US>instrumentation</SPAN>类。它包含在</SPAN><B><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">Microsoft.Practices.ObjectBuilder.dll</SPAN></B><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">中。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN: 0cm 0cm 2.25pt 24pt; TEXT-INDENT: -6pt; TEXT-ALIGN: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo2; tab-stops: list 30.0pt" align=left><SPAN lang=EN-US style="FONT-SIZE: 10pt; COLOR: black; FONT-FAMILY: Symbol; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">&#183;<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">如果使用<SPAN lang=EN-US>Database trace listener</SPAN>，就需要<SPAN lang=EN-US>Data Access Application Block</SPAN>；需要<SPAN lang=EN-US>exception handing application block</SPAN>来记录格式化的异常信息。<SPAN lang=EN-US><o:p></o:p></SPAN></SPAN></P>
<P class=MsoNormal style="MARGIN-BOTTOM: 2.25pt; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: 宋体; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US>1.1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">应用场景</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">日志组件致力于提供通用功能给需要日志功能的应用程序的开发者。这些功能涵盖了一些场景。每一个场景都给了一个现实情景的例子。例如从代码中产生事件；讨论特别的情景需求；给出实现这个功能的代码。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-spacerun: yes">&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">罗列这些任务的目的是提供代码的上下文。而不是仅仅给出一组孤立的方法，没有任何关于核处使用的最佳理解，日志组件使用场景来描述代码的使用场景，这些场景对于开发有日志特性的程序员来说是再熟悉不过了。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">这些场景包括：</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">从代码中触发事件</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">触发有附加上下文信息的日志消息</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">跟踪活动，传播上下文信息</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">在构建日志消息之前，检查过滤状态</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">配置侦听者的选项</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">引导不同的事件类型到不同的侦听者</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">配置日志过滤条件</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">配置日志从集中的位置产生</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 42pt; TEXT-INDENT: -21pt; mso-list: l1 level1 lfo1; tab-stops: list 42.0pt"><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Wingdings; mso-bidi-font-size: 10.5pt; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; mso-font-kerning: 0pt"><SPAN style="mso-list: Ignore">l<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt">创建客户订制的侦听者</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt"><o:p></o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">何时使用</SPAN><SPAN lang=EN-US>Logging Application Block</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt; mso-char-indent-count: 2.0"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">如果你的应用程序需要挟日志到</SPAN><SPAN lang=EN-US style="FONT-SIZE: 8.5pt; COLOR: black; FONT-FAMILY: Verdana">the event log, e-mail, a database, a message queue, Windows Management Instrumentation (WMI), or a file,</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt">你就应该考虑使用日志组件来提供这些功能，特别如果你需要基于分类和优先级来过滤日志消息，需要格式化消息，或者需要不改动代码的情况下改变消息的目的地。日志组件同时被设计成可扩展的，包括方便的创建客户订制的</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt">formatters</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt">和</SPAN><SPAN lang=EN-US style="COLOR: black; FONT-FAMILY: Verdana; mso-bidi-font-size: 10.5pt">traceListeners</SPAN><SPAN style="COLOR: black; FONT-FAMILY: 宋体; mso-ascii-font-family: Verdana; mso-hansi-font-family: Verdana; mso-bidi-font-size: 10.5pt">。</SPAN><SPAN lang=EN-US style="mso-bidi-font-size: 10.5pt"><o:p></o:p></SPAN></P><img src ="http://www.cnblogs.com/ipointer/aggbug/291116.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47913/" target="_blank">2009年7月中国微软最有价值专家(MVP)名单</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>dudu，求救，我进不了我的blog了</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 22 Nov 2005 08:11:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/282174.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/22/282174.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/282174.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/282174.html</trackback:ping><description><![CDATA[我输入我的blog的地址总是显示首页，是我的个别原因，还是博客园出问题了。<img src ="http://www.cnblogs.com/ipointer/aggbug/282174.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47912/" target="_blank">Oracle手中另一张对抗微软的王牌：Ubuntu</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>静态构造函数</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Mon, 21 Nov 2005 12:32:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/281596.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/21/281596.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/281596.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/281596.html</trackback:ping><description><![CDATA[<P>今天view代码的时候发现了一个类中有两个无参的构造函数，一个internal的，一个static的。我一时没反应过来，基础也打得不太好，于是写了个例子。发现两个都被调用了，而且static总是先被调用。下面是小例子。但其他静态的方法就不能出现同名同参数列表的情况。<BR>class Class1<BR>&nbsp;{<BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// 应用程序的主入口点。<BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;[STAThread]<BR>&nbsp;&nbsp;static void Main(string[] args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;TestConstructor test = new TestConstructor();<BR>//&nbsp;&nbsp;&nbsp;TestConstructor test;<BR>&nbsp;&nbsp;&nbsp;Console.ReadLine();<BR>&nbsp;&nbsp;}<BR><BR>public class TestConstructor<BR>&nbsp;{</P>
<P>&nbsp;&nbsp;static TestConstructor()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("static");<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;internal TestConstructor()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("internal");<BR>&nbsp;&nbsp;}</P>
<P>&nbsp;&nbsp;internal void test()<BR>&nbsp;&nbsp;{}</P>
<P>//&nbsp;&nbsp;static void test()<BR>//&nbsp;&nbsp;{}<BR>&nbsp;}<BR>&nbsp;}<BR><BR>一下的来自google搜索：<BR></P>
<P>　　静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数，不能有修饰符而且不能被调用，当类被加载时，类的静态构造函数自动被调用。如：</P>
<P>using System.Data;<BR>class Employee<BR>{<BR>　private static DataSet ds;<BR>　static Employee()<BR>　{<BR>　　ds = new DataSet(...);<BR>　}<BR>　...<BR>} </P>
<P>　　声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员进行初始化，而不能对非静态数据成员进行初始化。但是，非静态构造函数既可以对静态数据成员赋值，也可以对非静态数据成员进行初始化。</P>
<P>　　如果类仅包含静态成员，你可以创建一个private的构造函数：private TestClass() {&#8230;}，但是private意味着从类的外面不可能访问该构造函数。所以，它不能被调用，且没有对象可以被该类定义实例化。<BR><BR>对于上文的最后一点，我又试了一下。并发现,静态的构造函数在第一次对任意静态成员赋值时被调用。<BR>&nbsp;class Class1<BR>&nbsp;{<BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// 应用程序的主入口点。<BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;[STAThread]<BR>&nbsp;&nbsp;static void Main(string[] args)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("Will give A value");<BR>&nbsp;&nbsp;&nbsp;TestPrivateStatic.a = 3;<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("Done");<BR>&nbsp;&nbsp;&nbsp;TestPrivateStatic.a = 4;<BR>&nbsp;&nbsp;&nbsp;Console.ReadLine();<BR>&nbsp;&nbsp;}<BR><BR>public class TestPrivateStatic<BR>&nbsp;{<BR>&nbsp;&nbsp;public static int a;</P>
<P>&nbsp;&nbsp;static TestPrivateStatic()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;a = 2;<BR>&nbsp;&nbsp;&nbsp;Console.WriteLine("a has been given value");<BR>&nbsp;&nbsp;}<BR>&nbsp;}<BR>&nbsp;}<BR><BR>就这样了，平时总会发现一些细小的东西，没记下来真是一种损失，现在来弥补。<BR></P><img src ="http://www.cnblogs.com/ipointer/aggbug/281596.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47909/" target="_blank">微软发出提醒:今日起Windows 7 Beta开始自动重启</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>.net开源项目nxbre中flow engine的研究报告</title><link>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 16 Nov 2005 05:35:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/277656.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/11/16/277656.html#Feedback</comments><slash:comments>32</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/277656.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/277656.html</trackback:ping><description><![CDATA[<P>&nbsp; </P>
<P><SPAN>上周刚刚看完了<SPAN lang=EN-US>nxbre</SPAN>，写了一个<SPAN lang=EN-US>ppt</SPAN>给项目组评审，用来拟定我们<SPAN lang=EN-US>GSP</SPAN>中的规则引擎的实现需求。<SPAN lang=EN-US><BR><SPAN>&nbsp;&nbsp;&nbsp; </SPAN>不知为什么我上传不了文件，只好把<SPAN lang=EN-US>ppt</SPAN>的内容贴出来给大家共享。大家如果这个开源项目感兴趣，可以留言索取。<SPAN lang=EN-US>ppt</SPAN>中不可能把细节讲的很清楚，而且由于时间关系，只写了其中的flow engine,请见谅。<SPAN lang=EN-US><BR><BR><B>Nxbre</B></SPAN><B>的简介</B><SPAN lang=EN-US><BR>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Nxbre</SPAN></B><B><SPAN>包括<SPAN lang=EN-US>interface engine</SPAN>和<SPAN lang=EN-US>flow engine </SPAN></B></P>
<P><B><SPAN>两种引擎的区别 </SPAN></B></P>
<P><SPAN lang=EN-US>the Flow Engine, which uses XML as a way to control process flow for an application in an external entity. It is basically a wrapper on C#, as it offers all its flow control commands (if/then/else, while, foreach), plus a context of business objects and results. </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US>the Inference Engine, which is a forward-chaining (data driven) deduction engine and that supports concepts like Facts, Queries and Implications (as defined in RuleML 0.86 Datalog) and like Rule Priority, Mutual Exclusion and Precondition(as found in many commercial engines). It is designed in a way that encourages the separation of roles between the expert who designs the business rules and the programmer who binds them to the business objects. </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><B><SPAN>两种引擎使用的场景 </SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine supports priority, mutual exclusions and pre-conditions, </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine uses a "standard" rule format (RuleML), </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>the Inference Engine has an elaborated memory model with support for isolated deduction space. </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Interface Engine </SPAN><SPAN>更适合于知识库或专家系统，因为在这样的系统中，<SPAN lang=EN-US>facts</SPAN>必须被保持 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>5.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Flow Engine </SPAN><SPAN>只是对一段逻辑进行了解析，并根据结果去做<SPAN lang=EN-US>action </SPAN></P>
<P><SPAN lang=EN-US><SPAN>6.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>The Flow Engine is really an instantaneous traversal of logical branches using transient data for evaluations of boolean expressions.</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><B><SPAN>选择的理由</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在我们的<SPAN lang=EN-US>GSP</SPAN>系统中，没有对<SPAN lang=EN-US>fact</SPAN>保持的需求，没有通过规则优先级、互斥和前置条件的判断来选择规则 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Flow Engine </SPAN><SPAN>相对简单，易于维护 </SPAN></P>
<P><SPAN>所以，应该<SPAN lang=EN-US>Flow Engine</SPAN>是一个合适的选择 <BR></SPAN></P>
<P><B><SPAN lang=EN-US><BR>Flow Engine</SPAN></B><B><SPAN>的介绍</SPAN></B></P>
<P><SPAN>加载和卸载规则集的<SPAN lang=EN-US>API (BREImpl) </SPAN></P>
<P><SPAN lang=EN-US>Init </SPAN></P>
<P><SPAN lang=EN-US>Reset </SPAN></P>
<P><SPAN>数据操作的<SPAN lang=EN-US>API</SPAN>（<SPAN lang=EN-US>IBRERuleContext</SPAN>） </SPAN></P>
<P><SPAN lang=EN-US>SetObject </SPAN></P>
<P><SPAN lang=EN-US>GetObject </SPAN></P>
<P><SPAN>引擎执行的<SPAN lang=EN-US>API (BREImpl) </SPAN></P>
<P><SPAN lang=EN-US>Process </SPAN></P>
<P><SPAN lang=EN-US>Stop </SPAN></P>
<P><SPAN lang=EN-US><BR></SPAN><B><SPAN>规则引擎基本遵循以下<SPAN lang=EN-US>5</SPAN>个典型的步骤<SPAN lang=EN-US>&nbsp;</SPAN></B></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>创建规则引擎对象 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>向引擎中加载规则集或更换规则集 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>向引擎提交需要被规则集处理的数据对象集合 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>命令引擎执行 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>5.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>导出引擎执行结果，从引擎中撤出处理过的数据 </SPAN></P>
<P><SPAN lang=EN-US><BR><B>Flow Engine</B></SPAN><B><SPAN>中的规则文件</SPAN></B></P>
<P><SPAN>规则语言一般分为两类： </SPAN></P>
<P><SPAN lang=EN-US>&#8220;</SPAN><SPAN>面向程序技术<SPAN lang=EN-US>&#8221;</SPAN>的规则语言，使用者是技术人员。在<SPAN lang=EN-US>Flow Engine</SPAN>中是<SPAN lang=EN-US>.bre</SPAN>文件（结构是<SPAN lang=EN-US>businessRule.xsd</SPAN>规定的） ，引擎真正解析的也是这个文件。 </SPAN></P>
<P><SPAN lang=EN-US>&#8220;</SPAN><SPAN>面向业务<SPAN lang=EN-US>&#8221;</SPAN>的规则语言，使用者是业务人员。规则定制器应该生成这份文档。在<SPAN lang=EN-US>Flow Engine</SPAN>中是<SPAN lang=EN-US>.xbre</SPAN>文件（结构是<SPAN lang=EN-US>businessRule.xsd</SPAN>规定的） 。 </SPAN></P>
<P><SPAN>两种<SPAN lang=EN-US>Schema</SPAN>的转换是由<SPAN lang=EN-US>transformXRules.xsl</SPAN>文件规定的。 </SPAN></P>
<P><SPAN lang=EN-US>Flow Engine</SPAN><SPAN>为加载规则文件提供了以下的类：<SPAN lang=EN-US>IRulesDriver,AbstractRuelsDriver,BusinessRulesFileDriver,XSLTRulesFileDriver,XBusinessRulesFileDriver, XBusinessRulesStreamDriver, XBusinessRulesStringDriver </SPAN></P>
<P><SPAN lang=EN-US><BR><B>Flow Engine</B></SPAN><B><SPAN>中的规则上下文</SPAN></B></P>
<P><SPAN>规则上下文中包含如下四块： </SPAN></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>RuleFactory</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含<SPAN lang=EN-US>rule</SPAN>的解决方法，可以是默认的，也可以是自定义的 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Operator</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含可用的比较操作符，如：<SPAN lang=EN-US>==,&lt;,&gt;</SPAN>等 </SPAN></P>
<P><SPAN lang=EN-US><SPAN>3.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>Result</SPAN><SPAN>集<SPAN lang=EN-US>(hashtable),</SPAN>包含<SPAN lang=EN-US>result</SPAN>和用户初始的数据<SPAN lang=EN-US>,lookupobject</SPAN>就是在<SPAN lang=EN-US>result</SPAN>集中查找数据对象。每条<SPAN lang=EN-US>&lt;rule&gt;</SPAN>都会产生一条<SPAN lang=EN-US>result</SPAN>，每条<SPAN lang=EN-US>result</SPAN>又会包含<SPAN lang=EN-US>metadata</SPAN>和结果数据。<SPAN lang=EN-US>metadata</SPAN>中包含产生这条<SPAN lang=EN-US>result</SPAN>的<SPAN lang=EN-US>rule</SPAN>的<SPAN lang=EN-US>factory</SPAN>和<SPAN lang=EN-US>param </SPAN></P>
<P><SPAN lang=EN-US><SPAN>4.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN lang=EN-US>CallStack(stack),</SPAN><SPAN>目前没发现有什么用，只是在往<SPAN lang=EN-US>Result</SPAN>集中添加<SPAN lang=EN-US>result</SPAN>的同时也往此中添加 </SPAN></P>
<P><SPAN>支持上下文的主要类型：<SPAN lang=EN-US>IBRERuleContext,AbstractBRERuleContext,BRERuleContextImpl </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>创建规则引擎对象<SPAN lang=EN-US>&nbsp;</SPAN></B></P>
<P><SPAN>构建<SPAN lang=EN-US>BREFactoryConsole</SPAN>对象，他负责构建<SPAN lang=EN-US>BREImpl</SPAN>对象，并向外发布引擎中出现的<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception </SPAN></P>
<P><SPAN>构建<SPAN lang=EN-US>BREImp</SPAN>对象之前，必须首先构建<SPAN lang=EN-US>BREFactory,</SPAN>他负责将<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception</SPAN>的代理挂到<SPAN lang=EN-US>BREImp</SPAN>对象中的相应<SPAN lang=EN-US>event</SPAN>上去 </SPAN></P>
<P><SPAN>用<SPAN lang=EN-US>IRuleDriver</SPAN>初始化<SPAN lang=EN-US>BREImp</SPAN>对象 </SPAN></P>
<P><SPAN>相关的类型：<SPAN lang=EN-US> BREFactoryConsole</SPAN>，<SPAN lang=EN-US>BREFactory</SPAN>，<SPAN lang=EN-US>BREImp </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>加载规则集</SPAN></B></P>
<P><SPAN>在<SPAN lang=EN-US>Flow Engine</SPAN>中<SPAN lang=EN-US>rule</SPAN>（在<SPAN lang=EN-US>.bre</SPAN>文件中用<SPAN lang=EN-US>&lt;rule&gt;</SPAN>标签标识的部分）是一些用<SPAN lang=EN-US>id</SPAN>唯一标识的对象。加载这些<SPAN lang=EN-US>rule</SPAN>的方式有两种： </SPAN></P>
<P><SPAN lang=EN-US><SPAN>1.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在引擎初始的时候，先从规则文件中查找<SPAN lang=EN-US>&lt;factory&gt;</SPAN>标签，找到需要加载的<SPAN lang=EN-US>RuleFactory</SPAN>。通过反射的方式，创建该类型的实例（引擎默认的<SPAN lang=EN-US>rule</SPAN>） </SPAN></P>
<P><SPAN lang=EN-US><SPAN>2.<SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN>在引擎的运行时，外部需要对规则文件中定义的<SPAN lang=EN-US>rule</SPAN>有特殊的处理，必须在外部环境中构造<SPAN lang=EN-US>BRERuleFactory</SPAN>对象，并以一个代理作为它的参数，在代理的方法中实现对<SPAN lang=EN-US>rule</SPAN>的处理 </SPAN></P>
<P><SPAN>讨论：是否还需要第三种方式，因为使用第二种方式扩展系统时，外部环境开发者不得不很了解目前使用的规则文件中到底使用了哪些扩展的<SPAN lang=EN-US>rule</SPAN>，并为这些<SPAN lang=EN-US>rule</SPAN>些处理方法。当我们修改了规则文件，并添加了一些扩展<SPAN lang=EN-US>rule</SPAN>时，外部环境的开发者不得不修改他们的程序，以适应新的规则文件。 </SPAN></P>
<P><SPAN>我们现在想要的是像使用默认的<SPAN lang=EN-US>rule</SPAN>一样方式来使用扩展<SPAN lang=EN-US>rule</SPAN>，这就需要我们用一种注册的方式，在引擎加载<SPAN lang=EN-US>rule</SPAN>之前，将扩展的<SPAN lang=EN-US>rule</SPAN>注册进系统。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><SPAN>所有的<SPAN lang=EN-US>rule</SPAN>都必须通过引擎上下文（<SPAN lang=EN-US>IBRERuleContext</SPAN>）的<SPAN lang=EN-US>SetFactory</SPAN>方法注册进引擎上下文中 </SPAN></P>
<P><SPAN lang=EN-US>IBRERuleFactory</SPAN><SPAN>中有<SPAN lang=EN-US>ExecuteRule</SPAN>方法，这就是处理默认<SPAN lang=EN-US>rule</SPAN>的方法 </SPAN></P>
<P><SPAN>支持规则集的相关类型：<SPAN lang=EN-US>IBRERuleFactory,BRERuleFactory(</SPAN>主要是为自定义的<SPAN lang=EN-US>rule</SPAN>设计的，他的<SPAN lang=EN-US>ExecuteRule</SPAN>中只是调用了代理<SPAN lang=EN-US>) </SPAN></P>
<P><SPAN>在写代理方法的时候注意，引擎调用代理的时候，可以提供上下文和相关的参数，这是我们极其需要的 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>加载操作符<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>很简单，在<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>init()</SPAN>方法中，用反射的方式从当前<SPAN lang=EN-US>Assembly</SPAN>中查找所有实现<SPAN lang=EN-US>IBREOperator</SPAN>接口的类型，创建实例，加入上下文中。 </SPAN></P>
<P><SPAN>这里的操作符只是<SPAN lang=EN-US>if</SPAN>语句中判断大小用的，而<SPAN lang=EN-US>+</SPAN>，<SPAN lang=EN-US>-</SPAN>，<SPAN lang=EN-US>*</SPAN>，<SPAN lang=EN-US>/</SPAN>，或其他数学函数，我认为可以作为默认的<SPAN lang=EN-US>rule</SPAN>来对待 </SPAN></P>
<P><SPAN>支持的相关类型：<SPAN lang=EN-US>IBRERuleOperator,</SPAN>实现他的类其实就是实现一个<SPAN lang=EN-US>compare</SPAN>的<SPAN lang=EN-US>strategy </SPAN></P>
<P><SPAN>讨论：这一块是不是能满足需求 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中提交数据对象<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>如前所述，数据对象在系统中是被当成<SPAN lang=EN-US>result</SPAN>来处理的，封装他的<SPAN lang=EN-US>BRERuleObject</SPAN>类继承于<SPAN lang=EN-US>AbstractBRERuleResult</SPAN>，会被插入上下文的<SPAN lang=EN-US>result</SPAN>集中。数据对象被封装到<SPAN lang=EN-US>BRERuleObject</SPAN>的<SPAN lang=EN-US>Result</SPAN>属性中。 </SPAN></P>
<P><SPAN>具体的，在外部环境中，通过上下文的<SPAN lang=EN-US>SetObject(id,object)</SPAN>，就可以将数据对象添加到上下文中了。 </SPAN></P>
<P><SPAN>同样，获取数据对象的时候用上下文的<SPAN lang=EN-US>GetObject(id)</SPAN>。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中命令引擎执行<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>在启动引擎之前，要注意必须执行<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>Reset()</SPAN>方法，清空留在上下文中的上一次的<SPAN lang=EN-US>Result</SPAN>集和<SPAN lang=EN-US>CallStack</SPAN>清空，否则，可能会干扰本次的执行。这有一次表明了<SPAN lang=EN-US>Flow Engine</SPAN>是一个对逻辑分支的瞬时遍历，他不能保存结果，也不能用于以往知识对执行实例有影响的系统中。 </SPAN></P>
<P><SPAN>要执行引擎，只需调用<SPAN lang=EN-US>BREImpl</SPAN>的<SPAN lang=EN-US>process()</SPAN>方法，引擎就会根据规则文件中指定的逻辑来执行了。 </SPAN></P>
<P><SPAN>更具体的，<SPAN lang=EN-US>processxml()</SPAN>方法判断<SPAN lang=EN-US>XPathNavigator</SPAN>当前节点的类型，跳转到特定的处理程序中。 </SPAN></P>
<P><SPAN>如果当前节点有子节点，那么调用<SPAN lang=EN-US>DoRecursion()</SPAN>来进行迭代。 </SPAN></P>
<P><SPAN>执行的方式是先深的遍历。 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中导出结果<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>很简单，通过上下文的<SPAN lang=EN-US>GetResult(id)</SPAN>，就能导出运行的结果。<SPAN lang=EN-US>Id</SPAN>与该条<SPAN lang=EN-US>rule</SPAN>的<SPAN lang=EN-US>id</SPAN>相同。 </SPAN></P>
<P><SPAN>真正结果封装在<SPAN lang=EN-US>AbstractBRERuleResult</SPAN>的<SPAN lang=EN-US>result</SPAN>属性中 </SPAN></P>
<P><SPAN lang=EN-US>&nbsp; </SPAN></P>
<P><B><SPAN lang=EN-US>Flow Engine</SPAN></B><B><SPAN>中的<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>Exception</SPAN>处理<SPAN lang=EN-US><BR>&nbsp; </SPAN></B></P>
<P><SPAN>提供了丰富的向外部暴露内部运行情况的接口 </SPAN></P>
<P><SPAN>还指定了<SPAN lang=EN-US>log</SPAN>和<SPAN lang=EN-US>exception</SPAN>的级别，用于向不同的终端暴露信息 </SPAN></P>
<P><SPAN>内部使用<SPAN lang=EN-US>DispatchLog(message,level),DispatchException(message,level) </SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.cnblogs.com/ipointer/aggbug/277656.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47908/" target="_blank">CNET评论FireFox 3.5 - 为竞争对手打开了大门</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>XPath最通俗的教程（ZZ）</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Thu, 20 Oct 2005 00:43:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/258305.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html#Feedback</comments><slash:comments>60</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/258305.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/258305.html</trackback:ping><description><![CDATA[摘要:  以下是本人找到的最完整最易懂的XPath教程，不敢私藏，拿出来与大家分享。帮我点旁边的google广告呀。 实例 1基本的XPath语法类似于在一个文件系统中定位文件,如果路径以斜线 / 开始, 那么该路径就表示到一个元素的绝对路径/AAA选择根元素AAA&lt;AAA&gt; &lt;BBB/&gt; &lt;CCC/&gt; &lt;BBB/&gt; &lt;BBB/&gt; &lt;DDD&nbsp;&nbsp;<a href='http://www.cnblogs.com/ipointer/archive/2005/10/20/258305.html'>阅读全文</a><img src ="http://www.cnblogs.com/ipointer/aggbug/258305.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47907/" target="_blank">Vista SP2开始通过Windows Update向用户推送</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>【注意】一个巨牛的招聘题(ZZ)</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Fri, 14 Oct 2005 06:33:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/254800.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/14/254800.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/254800.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/254800.html</trackback:ping><description><![CDATA[我的老同学开创了一个软件公司，富的流油。今天他到这个城市来后马上打电话给我：&#8220;还好吧？我到这里的大学招毕业生，要呆上五天，咱哥们趁这个机会好好聚一聚，我做东。&#8221;<BR><BR>　　既然他要做东，我理所当然顺水推舟。来到他下榻的宾馆，看见一个大学生模样的人站在他面前接受面试。我的老同学说：&#8220;我这里有个魔方，你能不能把它弄成六面六个颜色？&#8221;那个大学生拿着魔方，面有难色。<BR><BR>　　我的老同学看了看我，对大学生说：&#8220;如果你没有考虑好，可以把魔方拿回去考虑我直到星期五才走。&#8221;等那个大学生走了以后，我问老同学：&#8220;这是你独创的考题？&#8221;<BR><BR>　　&#8220;咳！这个人有后台，我不好意思不要他，所以出个题考他，以便到时候安排个合适的职务。&#8221;<BR><BR>　　&#8220;要是我，&#8221;我说：&#8220;会把魔方拆开，然后一个个安上去。&#8221;&#8220;如果他这样做就好了，这就说明他敢作敢为，就可以从事开拓市场方面的工作。&#8221;<BR><BR>　　&#8220;那其他做法呢？&#8221;&#8220;如果他拿漆把六面刷出来，说明他很有创意，可以从事软件开发部的工作；如果他今天下午就把魔方拿回来，说明他非常聪明，领悟能力强，做我的助理最合适了；如果他星期三之前把魔方拿回来，说明他请教了人，也就是说他很有人缘，可以去客户服务部工作；如果在我走之前拿回来，说明他勤劳肯干，从事低级程序员的工作没问题；如果他最终拿回来说他还是不会，那说明他人很老实，可以从事保管或财物方面的工作；如果他拿不回来，那我就爱莫能助了。&#8221;<BR><BR>　　第二天晚上，我的老同学又请我吃饭。在饭桌上，我又问起魔方的事。这一回，老同学有些得意洋洋：&#8220;那个大学生我要定了，他今天早上把魔方还给了我，你猜怎么着？他新买了一个魔方！他还说&#8216;你的魔方我扳来扳去都无法还原，所以，我新买了一个，比你那个更大、更灵活！&#8217;&#8221;<BR><BR>　　&#8220;这说明什么？&#8221;我问。我的老同学压低了声音：&#8220;他绝对是做盗版的好材料！&#8221;<BR><img src ="http://www.cnblogs.com/ipointer/aggbug/254800.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47905/" target="_blank">iPhone OS 3.1测试版及开发包公布</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>如何安装ms 的 Enterprise Library</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 11 Oct 2005 07:34:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/252427.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/11/252427.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/252427.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/252427.html</trackback:ping><description><![CDATA[<P>这个问题困扰了很久，现在总结一下，备用。<BR>1、先将InstallAssemblyToGAC.bat编辑，修改其中visualStudioDir字段，改为本机安装vs studio的路径<BR>2、命令行中，进入本目录，运行InstallAssemblyToGAC.bat，将其导入GAC<BR>3、修改EntLibAddRefReg.reg中的路径，改为本目录，注意\需要用\\替换<BR>4、双击EntLibAddRefReg.reg文件，将路径导入注册表</P><img src ="http://www.cnblogs.com/ipointer/aggbug/252427.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47904/" target="_blank">Flickr 与 twitter 终成眷属，twitPic 使命结束</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>关于数据绑定</title><link>http://www.cnblogs.com/ipointer/archive/2005/10/11/252218.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Tue, 11 Oct 2005 02:48:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/10/11/252218.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/252218.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/10/11/252218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/252218.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/252218.html</trackback:ping><description><![CDATA[&nbsp; 
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN>最近刚接触到数据绑定，以前在学校时一直自己写代码来关联数据，当时没有太多心思去看这方面的东西，所以一直认为用到了数据的绑定就会降低我们对数据的控制力。然而当时写出来的东西又麻烦又难于管理，还会经常出错，盖了这个又影响到了那个。到了公司，在同事指导下，看了一点关于数据绑定方面的东西。发现有以下好处：一是，实现了程序中的特定的功能；二是，非常易于管理；三是，灵活性也没有受到太大影响，很多东西都是能很好的绑定起来，只是我们不知道怎么做。（至少现在我用到的地方，灵活性没有受到太多影响）。写此篇札记也为我以后存根，便于查看。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>1、<SPAN>&nbsp; </SPAN></SPAN><SPAN lang=EN-US>ComboBox</SPAN><SPAN>的绑定</SPAN></P>
<P><SPAN>将 <B><SPAN lang=EN-US>DataSource</SPAN></B><SPAN lang=EN-US> </SPAN>属性设置为某个数据源对象。可能的数据源包括数据表、数据视图、数据集、数据视图管理器、数组或实现了 <B><SPAN lang=EN-US>IList</SPAN></B><SPAN lang=EN-US> </SPAN>接口的任何类。</SPAN></P>
<P><SPAN>将<SPAN lang=EN-US> DisplayMember </SPAN>和<SPAN lang=EN-US> ValueMember </SPAN>分别绑定到数据源的某一列上，例如：</SPAN></P>
<P align=left><SPAN lang=EN-US>this</SPAN><SPAN lang=EN-US>.form.comboBox5.DataSource = <SPAN>this</SPAN>.manager.GetBillActionGroup().Tables[0];</SPAN></P>
<P align=left><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN>this</SPAN>.form.comboBox5.DisplayMember = "GROUPNAME";</SPAN></P>
<P><SPAN lang=EN-US><SPAN>this</SPAN>.form.comboBox5.ValueMember = "GROUPID";</SPAN></P>
<P><SPAN>这样在界面上看到的将是<SPAN lang=EN-US>displaymember</SPAN>中制定的数据，而在取<SPAN lang=EN-US>selectvalue</SPAN>时则是会取到<SPAN lang=EN-US>valuemember</SPAN>中制定的数据。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>2、<SPAN>&nbsp; </SPAN></SPAN><SPAN>将<SPAN lang=EN-US>ComboBox</SPAN>绑定到实现了 <B><SPAN lang=EN-US>IList</SPAN></B><SPAN lang=EN-US> </SPAN>接口的类</SPAN></P>
<P><SPAN>下面是我写的一个完整的例子，用于将一个有两个属性的<SPAN lang=EN-US>country</SPAN>类绑定到<SPAN lang=EN-US>comboBox,displaymember</SPAN>绑到<SPAN lang=EN-US>shortname,valuemember</SPAN>绑到这个对象。</SPAN></P>
<P><SPAN lang=EN-US>using System;<BR>using System.Drawing;<BR>using System.Collections;<BR>using System.ComponentModel;<BR>using System.Windows.Forms;<BR>using System.Data;</SPAN></P>
<P><SPAN lang=EN-US>namespace TestBanding<BR>{<BR>&nbsp;/// &lt;summary&gt;<BR>&nbsp;/// Form1 </SPAN><SPAN>的摘要说明。<SPAN lang=EN-US><BR>&nbsp;/// &lt;/summary&gt;<BR>&nbsp;public class Form1 : System.Windows.Forms.Form<BR>&nbsp;{<BR>&nbsp;&nbsp;private System.Windows.Forms.ComboBox comboBox1;<BR>&nbsp;&nbsp;private System.Windows.Forms.TextBox textBox1;<BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// </SPAN>必需的设计器变量。<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;private System.ComponentModel.Container components = null;</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;public Form1()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;InitializeComponent();<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// </SPAN><SPAN>清理所有正在使用的资源。<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;protected override void Dispose( bool disposing )<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;if( disposing )<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if (components != null) <BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;components.Dispose();<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;base.Dispose( disposing );<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;#region Windows </SPAN><SPAN>窗体设计器生成的代码<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// </SPAN>设计器支持所需的方法<SPAN lang=EN-US> - </SPAN>不要使用代码编辑器修改<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// </SPAN>此方法的内容。<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;private void InitializeComponent()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;this.comboBox1 = new System.Windows.Forms.ComboBox();<BR>&nbsp;&nbsp;&nbsp;this.textBox1 = new System.Windows.Forms.TextBox();<BR>&nbsp;&nbsp;&nbsp;this.SuspendLayout();<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;// comboBox1<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;this.comboBox1.Location = new System.Drawing.Point(96, 104);<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.Name = "comboBox1";<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.Size = new System.Drawing.Size(121, 20);<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.TabIndex = 0;<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.Text = "comboBox1";<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.SelectedIndexChanged += new System.EventHandler(this.comboBox1_SelectedIndexChanged);<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;// textBox1<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;this.textBox1.Location = new System.Drawing.Point(88, 40);<BR>&nbsp;&nbsp;&nbsp;this.textBox1.Name = "textBox1";<BR>&nbsp;&nbsp;&nbsp;this.textBox1.TabIndex = 1;<BR>&nbsp;&nbsp;&nbsp;this.textBox1.Text = "textBox1";<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;// Form1<BR>&nbsp;&nbsp;&nbsp;// <BR>&nbsp;&nbsp;&nbsp;this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);<BR>&nbsp;&nbsp;&nbsp;this.ClientSize = new System.Drawing.Size(292, 273);<BR>&nbsp;&nbsp;&nbsp;this.Controls.Add(this.textBox1);<BR>&nbsp;&nbsp;&nbsp;this.Controls.Add(this.comboBox1);<BR>&nbsp;&nbsp;&nbsp;this.Name = "Form1";<BR>&nbsp;&nbsp;&nbsp;this.Text = "Form1";<BR>&nbsp;&nbsp;&nbsp;this.Load += new System.EventHandler(this.Form1_Load);<BR>&nbsp;&nbsp;&nbsp;this.ResumeLayout(false);</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;#endregion</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;/// &lt;summary&gt;<BR>&nbsp;&nbsp;/// </SPAN><SPAN>应用程序的主入口点。<SPAN lang=EN-US><BR>&nbsp;&nbsp;/// &lt;/summary&gt;<BR>&nbsp;&nbsp;[STAThread]<BR>&nbsp;&nbsp;static void <?xml:namespace prefix = st1 /><st1:place w:st="on">Main</st1:place>() <BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;Application.Run(new Form1());<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;private void Form1_Load(object sender, System.EventArgs e)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;CountryCollection cc = CreateData();<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.DataSource = cc;<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.DisplayMember = "CountryCode";<BR>&nbsp;&nbsp;&nbsp;this.comboBox1.ValueMember = "MyCountry";<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;private CountryCollection CreateData()<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;CountryCollection countryCollection = new CountryCollection();<BR>&nbsp;&nbsp;&nbsp;Country c1 = new Country("PRC","China");<BR>&nbsp;&nbsp;&nbsp;countryCollection.Add(c1);<BR>&nbsp;&nbsp;&nbsp;Country c2 = new Country("Ame","America");<BR>&nbsp;&nbsp;&nbsp;countryCollection.Add(c2);<BR>&nbsp;&nbsp;&nbsp;Country c3 = new Country("Eng","England");<BR>&nbsp;&nbsp;&nbsp;countryCollection.Add(c3);<BR>&nbsp;&nbsp;&nbsp;return countryCollection;<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;private void comboBox1_SelectedIndexChanged(object sender, System.EventArgs e)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;this.textBox1.Text = ((Country)this.comboBox1.SelectedValue).ShortName;<BR>&nbsp;&nbsp;}<BR>&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;public class CountryCollection : CollectionBase<BR>&nbsp;{<BR>&nbsp;&nbsp;public void Add(Country country)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;this.List.Add(country);<BR>&nbsp;&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;public virtual Country this[int index]<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;get<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(index&gt;=0 || index&lt;this.List.Count)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return (Country)this.List[index];<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new ArgumentOutOfRangeException(index+"");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;set<BR>&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(index&gt;=0 || index&lt;this.List.Count)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value.GetType() == typeof(Country))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this.List[index] = value;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new Exception("Wrong type!");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw new ArgumentOutOfRangeException(index+"");<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;}<BR>&nbsp;}</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;public class Country<BR>&nbsp;{<BR>&nbsp;&nbsp;public Country(string code,string sName)<BR>&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;this.countryCode = code;<BR>&nbsp;&nbsp;&nbsp;this.shortName = sName;<BR>&nbsp;&nbsp;}<BR>&nbsp;&nbsp;private string countryCode;<BR>&nbsp;&nbsp;private string shortName;</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;&nbsp;public string CountryCode{get{return this.countryCode;}set{this.countryCode=value;}}<BR>&nbsp;&nbsp;public string ShortName{get{return this.shortName;}set{this.shortName=value;}}<BR>&nbsp;&nbsp;public Country MyCountry{get{return this;}}<BR>&nbsp;}<BR>}</SPAN></P>
<P><SPAN lang=EN-US><SPAN>3、<SPAN>&nbsp; </SPAN></SPAN><SPAN>卡片上的数据绑定</SPAN></P>
<P><SPAN>我们经常会做这样的东西，左边一个<SPAN lang=EN-US>datagrid,</SPAN>右边一堆<SPAN lang=EN-US>textbox</SPAN>和<SPAN lang=EN-US>combobox</SPAN>之类的东西，要选中<SPAN lang=EN-US>datagrid</SPAN>中的行来用右边的卡片来显示具体的明细。原来我都是手写的代码，维护起来非常的麻烦。后来发现，只要将右边的卡片中的控件也绑定到和<SPAN lang=EN-US>datagrid</SPAN>相同数据源，在<SPAN lang=EN-US>datagrid</SPAN>中选中行，在右边的卡片上就能切换不同的数据，非常方便。卡片控件的绑定如下：</SPAN></P>
<P><SPAN lang=EN-US>textBox1.DataBindings.Add("Text", myTable, "customID");</SPAN></P>
<P><SPAN lang=EN-US><SPAN>4、<SPAN>&nbsp; </SPAN></SPAN><SPAN>数据导航条</SPAN></P>
<P><SPAN>我们可能会用到数据导航条，虽然不太常用。记得在<SPAN lang=EN-US>msdn</SPAN>中的一个示例中，就有可以通过向导的方式来建立这种数据导航条。</SPAN></P>
<P><SPAN>主要我们要注意的类是</SPAN><SPAN lang=EN-US>CurrencyManager</SPAN><SPAN>，</SPAN><SPAN>它可以管理绑定的对象，其实是封装了对绑定数据源的统一的定位方式，通过下面的方法添加绑定：</SPAN></P>
<P><SPAN lang=EN-US>myCurrencyManager = (CurrencyManager)<SPAN>this</SPAN>.BindingContext[myTable];</SPAN></P>
<P><SPAN>通过下面的方法定位数据源：</SPAN></P>
<P><SPAN lang=EN-US>myCurrencyManager.Position = 0;</SPAN></P>
<P><SPAN lang=EN-US>&nbsp;</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN>就到这吧，本人水平有限，只能写出这么多了，最后推荐大家一个好论坛，</SPAN></P>
<P><SPAN lang=EN-US><A href="http://forums.microsoft.com/msdn/default.aspx?ForumGroupID=2">http://forums.microsoft.com/msdn/default.aspx?ForumGroupID=2</A></SPAN><SPAN>，这块是专门讨论<SPAN lang=EN-US>winform</SPAN>的。</SPAN></P>
<P><SPAN lang=EN-US><SPAN>&nbsp;&nbsp;&nbsp; </SPAN><SPAN>还有帮我点旁边的<SPAN lang=EN-US>google</SPAN>广告，给我留言。</SPAN></P></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN></SPAN><img src ="http://www.cnblogs.com/ipointer/aggbug/252218.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47904/" target="_blank">Flickr 与 twitter 终成眷属，twitPic 使命结束</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>RETE算法的描述（原创）</title><link>http://www.cnblogs.com/ipointer/archive/2005/09/28/246251.html</link><dc:creator>栖息的熊</dc:creator><author>栖息的熊</author><pubDate>Wed, 28 Sep 2005 14:44:00 GMT</pubDate><guid>http://www.cnblogs.com/ipointer/archive/2005/09/28/246251.html</guid><wfw:comment>http://www.cnblogs.com/ipointer/comments/246251.html</wfw:comment><comments>http://www.cnblogs.com/ipointer/archive/2005/09/28/246251.html#Feedback</comments><slash:comments>51</slash:comments><wfw:commentRss>http://www.cnblogs.com/ipointer/comments/commentRss/246251.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/ipointer/services/trackbacks/246251.html</trackback:ping><description><![CDATA[&nbsp; 
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过一周左右的研究，对规则引擎有了一定的了解。现在写点东西跟大家一起交流，本文主要针对</SPAN><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法进行描述。我的文笔不太好，如果有什么没讲明白的或是说错的地方，请给我留言。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先申明，我的帖子借鉴了网上很流行的一篇帖子，好像是来自</SPAN><SPAN lang=EN-US>CSDN</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">；还有一点，我不想做太多的名词解释，因为我也不是个研究很深的人，定义的不好怕被笑话。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">好现在我们开始。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先介绍一些网上对于规则引擎比较好的帖子。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来自</SPAN><SPAN lang=EN-US>JAVA</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">视频网</SPAN><SPAN lang=EN-US> </SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt"><SPAN lang=EN-US><A href="http://forum.javaeye.com/viewtopic.php?t=7803&amp;postdays=0&amp;postorder=asc&amp;start=0">http://forum.javaeye.com/viewtopic.php?t=7803&amp;postdays=0&amp;postorder=asc&amp;start=0</A></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法的最原始的描述，我不知道在哪里找到的，想要的人可以留下</SPAN><SPAN lang=EN-US>E-mail</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l1 level1 lfo1; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>CMU</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的一位博士生的毕业论文，个人觉得非常好，我的很多观点都是来自这里的，要的人也可以给我发</SPAN><SPAN lang=EN-US>mail<SPAN style="mso-spacerun: yes">&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN><A href="mailto:ipointer@163.com">mailto:ipointer@163.com</A></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接着统一一下术语，很多资料里的术语都非常混乱。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">1、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>facts </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事实，我们实现的时候，会有一个事实库。用</SPAN><SPAN lang=EN-US>F</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">2、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>patterns </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板，事实的一个模型，所有事实库中的事实都必须满足模板中的一个。用</SPAN><SPAN lang=EN-US>P</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">3、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>conditions </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条件</SPAN><SPAN lang=EN-US>,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规则的组成部分。也必须满足模板库中的一条模板。用</SPAN><SPAN lang=EN-US>C</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示。我们可以这样理解</SPAN><SPAN lang=EN-US>facts</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>patterns</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>conditions</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">之间的关系。</SPAN><SPAN lang=EN-US>Patterns</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是一个接口，</SPAN><SPAN lang=EN-US>conditions</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">则是实现这个接口的类，而</SPAN><SPAN lang=EN-US>facts</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是这个类的实例。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">4、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>rules </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规则，由一到多个条件构成。一般用</SPAN><SPAN lang=EN-US>and</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">或</SPAN><SPAN lang=EN-US>or</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">连接</SPAN><SPAN lang=EN-US>conditions</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。用</SPAN><SPAN lang=EN-US>R</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">表示。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">5、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN lang=EN-US>actions </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">动作，激活一条</SPAN><SPAN lang=EN-US>rule</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">执行的动作。我们这里不作讨论。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">6、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有一些术语，如：</SPAN><SPAN lang=EN-US>working-memory</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>production-memory</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，跟这里的概念大同小异。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 60pt; TEXT-INDENT: -18pt; mso-list: l0 level1 lfo2; tab-stops: list 60.0pt"><SPAN lang=EN-US style="mso-fareast-font-family: 'Times New Roman'"><SPAN style="mso-list: Ignore">7、<SPAN style="FONT: 7pt 'Times New Roman'">&nbsp; </SPAN></SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">还有一些，如：</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">、</SPAN><SPAN lang=EN-US>join-node</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，我们下面会用到，先放一下，一会讨论。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">引用一下网上很流行的例子，我觉得没讲明白，我在用我的想法解释一下。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; mso-para-margin-left: 2.0gd"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">假设在规则记忆中有下列三条规则</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; mso-para-margin-left: 2.0gd"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>if A(x) and B(x) and C(y) then add D(x)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>if A(x) and B(y) and D(x) then add E(x)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>if A(x) and B(x) and E(x) then delete A(x)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法会先将规则编译成下列的树状架构排序网络</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 10.5pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-para-margin-left: 1.0gd"><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; TEXT-INDENT: 21pt; LINE-HEIGHT: 150%; mso-para-margin-left: 3.0gd"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><IMG height=289 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/1.JPG" width=693 border=0><BR>而工作记忆内容及顺序为</SPAN><SPAN lang=EN-US>{A(1)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>A(2)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>B(2)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>B(3)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>B(4)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>C(5)}</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，当工作记忆依序进入网络后，会依序储存在符合条件的节点中，直到完全符合条件的推论规则推出推论。以上述例子而言，</SPAN> <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">最后推得</SPAN><SPAN lang=EN-US>D(2)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">让我们来分析这个例子。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">模板库：（这个例子中只有一个模板，算法原描述中有不同的例子</SPAN><SPAN lang=EN-US>, </SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">一般我们会用</SPAN><SPAN lang=EN-US>tuple,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">元组的形式来定义</SPAN><SPAN lang=EN-US>facts,patterns,condition</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>P: (?A , ?x)<SPAN style="mso-spacerun: yes">&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">其中的</SPAN><SPAN lang=EN-US>A</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可能代表一定的操作，如例子中的</SPAN><SPAN lang=EN-US>A,B,C,D,E ; x</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代表操作的参数。看看这个模板是不是已经可以描述所有的事实。</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">条件库：</SPAN><SPAN lang=EN-US>(</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这里元组的第一项代表实际的操作，第二项代表形参</SPAN><SPAN lang=EN-US>)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C1: (A , &lt;x&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C2: (B , &lt;x&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C3: (C , &lt;y&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C4: (D , &lt;x&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C5: (E , &lt;x&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>C6: (B , &lt;y&gt;)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">事实库：（第二项代表实参）</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F1: (A,1)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F2: (A,2)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F3: (B,2)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F4: (B,3)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F5: (B,4)</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US>F6: (C,5)</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">规则库：</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>R1: c1^c2^c3</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>R2: c1^c2^c4</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp; </SPAN>R3: c1^c2^c5</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有人可能会质疑</SPAN><SPAN lang=EN-US>R1: c1^c2^c3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，没有描述出，原式中：</SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt; TEXT-INDENT: 21pt"><SPAN lang=EN-US>if A(x) and B(x) and C(y) then add D(x)</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，</SPAN><SPAN lang=EN-US>A=B</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的关系。但请仔细看一下，这一点已经在条件库中定义出来了。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面我来描述一下，规则引擎中</SPAN><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法的实现。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先，我们要定一些规则，根据这些规则，我们的引擎可以编译出一个树状结构，上面的那张图中是一种简易的表现，其实在实现的时候不是这个样子的。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这就是</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">出场的时候了，根据</SPAN><SPAN lang=EN-US>rules</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">我们就可以确定</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，下面，我就画出本例中的</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，为了描述方便，我把</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">也画出来了。</SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;<IMG height=504 src="http://www.cnblogs.com/images/cnblogs_com/ipointer/2.PNG" width=693 border=0></o:p></SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上图中，左边的部分就是</SPAN><SPAN lang=EN-US>beta-network,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">右边是</SPAN><SPAN lang=EN-US>alpha-network,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">圆圈是</SPAN><SPAN lang=EN-US>join-node.</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从上图中，我们可以验证，在</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">中，表现出了</SPAN><SPAN lang=EN-US>rules</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内容，其中</SPAN><SPAN lang=EN-US>r1,r2,r3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">共享了许多</SPAN><SPAN lang=EN-US>BM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</SPAN><SPAN lang=EN-US>join-node,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">这是由于这些规则中有共同的部分，这样能加快</SPAN><SPAN lang=EN-US>match</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的速度。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">右边的</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">是根据事实库构建的，其中除</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节点的节点都是根据每一条</SPAN><SPAN lang=EN-US>condition,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">从事实库中</SPAN><SPAN lang=EN-US>match</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">过来的，这一过程是静态的，即在编译构建网络的过程中已经建立的。只要事实库是稳定的，即没有大幅度的变化，</SPAN><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法的执行效率应该是非常高的，其原因就是已经通过静态的编译，构建了</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。我们可以验证一下，满足</SPAN><SPAN lang=EN-US>c1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的事实确实是</SPAN><SPAN lang=EN-US>w1,w2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">下面我们就看一下，这个算法是怎么来运行的，即怎么来确定被激活的</SPAN><SPAN lang=EN-US>rules</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的。从</SPAN><SPAN lang=EN-US>top-node</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">往下遍历，到一个</SPAN><SPAN lang=EN-US>join-node,</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">与</SPAN><SPAN lang=EN-US>AM for c1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的节点汇合，运行到</SPAN><SPAN lang=EN-US>match c1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节点。此时，</SPAN><SPAN lang=EN-US>match c1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">节点的内容就是：</SPAN><SPAN lang=EN-US>w1,w2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。继续往下，与</SPAN><SPAN lang=EN-US>AM for c2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">汇合（所有可能的组合应该是</SPAN><SPAN lang=EN-US>w1^w3,w1^w4,w1^w5,w2^w3,w2^w4,w2^w5</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），因为</SPAN><SPAN lang=EN-US>c1^c2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">要求参数相同，因此，</SPAN><SPAN lang=EN-US>match c1^c2</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的内容是：</SPAN><SPAN lang=EN-US>w2^w3</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">。再继续，这里有一个扇出（</SPAN><SPAN lang=EN-US>fan-out</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">），其中只有一个</SPAN><SPAN lang=EN-US>join-node</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以被激活，因为旁边的</SPAN><SPAN lang=EN-US>AM</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">只有一个非空。因此，也只有</SPAN><SPAN lang=EN-US>R1</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">被激活了。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">解决扇出带来的效率降低的问题，我们可以使用</SPAN><SPAN lang=EN-US>hashtable</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">来解决这个问题。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US>RETE</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">算法还有一些问题，如：</SPAN><SPAN lang=EN-US>facts</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">库变化，我们怎么才能高效的重建</SPAN><SPAN lang=EN-US>alpha-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，同理包括</SPAN><SPAN lang=EN-US>rules</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的变化对</SPAN><SPAN lang=EN-US>beta-network</SPAN><SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">的影响。这一部分我还没细看，到时候再贴出来吧。</SPAN></P>
<P class=MsoNormal style="TEXT-INDENT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;帮我点一下旁边的google广告，谢谢了。</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 31.5pt; mso-para-margin-left: 3.0gd"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P>
<P class=MsoNormal style="MARGIN-LEFT: 21pt"><SPAN lang=EN-US><o:p>&nbsp;</o:p></SPAN></P><img src ="http://www.cnblogs.com/ipointer/aggbug/246251.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/>新闻：<a href="http://news.cnblogs.com/n/47903/" target="_blank">微软8月推送IE8到企业用户桌面</a><br/>网站导航: <a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://dotnet.cnblogs.com" target="_blank">.NET频道</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q/" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/ing/" target="_blank">闪存</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>