﻿<?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>博客园-linkin park</title><link>http://www.cnblogs.com/linkin/</link><description>林肯公园</description><language>zh-cn</language><lastBuildDate>Fri, 09 Jan 2009 23:16:03 GMT</lastBuildDate><pubDate>Fri, 09 Jan 2009 23:16:03 GMT</pubDate><ttl>60</ttl><item><title>Agile Framework视频演示发布</title><link>http://www.cnblogs.com/linkin/archive/2006/04/12/372779.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Tue, 11 Apr 2006 21:49:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/04/12/372779.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/372779.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/04/12/372779.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/372779.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/372779.html</trackback:ping><description><![CDATA[<p>一共四段&nbsp;：</p>
<ul>
    <li><a href="http://www.agilelabs.cn/agileframework/invoke.exe">远程服务调用</a>
    <li><a href="http://www.agilelabs.cn/agileframework/offline.exe">离线处理</a>
    <li><a href="http://www.agilelabs.cn/agileframework/event.exe">事件</a>
    <li><a href="http://www.agilelabs.cn/agileframework/cache.exe">缓存</a> </li>
</ul>
<p>建议按顺序下载观看（需要音箱） <br><br>想要了解Agile Framework的更多信息请点击<a href="http://www.agilelabs.cn/agileframework/" target=_blank>这里</a></p>
<img src ="http://www.cnblogs.com/linkin/aggbug/372779.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44385/" target="_blank">CES2009:思科展示新娱乐操作系统 进军社交网络</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Agile Framework的专区上线</title><link>http://www.cnblogs.com/linkin/archive/2006/03/31/363602.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Fri, 31 Mar 2006 07:00:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/03/31/363602.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/363602.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/03/31/363602.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/363602.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/363602.html</trackback:ping><description><![CDATA[<p>专区地址是：<a href="http://www.agilelabs.cn/agileframework/">http://www.agilelabs.cn/agileframework/</a></p>
<p>增加了Agile Framework的详细介绍，源码也即将发布。<br><br>(既然发在首页，按照园子里的规定应该多一些内容的。本来想直接把介绍贴过来，不过无奈原来是用WORD写的，贴过来之后格式完全都变了，调整了半天后只好放弃，大家还是直接去专区看吧）</p>
<img src ="http://www.cnblogs.com/linkin/aggbug/363602.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44382/" target="_blank">搜索引擎 创意 shell</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Agile Framework事件分发机制的改良</title><link>http://www.cnblogs.com/linkin/archive/2006/01/27/323892.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Fri, 27 Jan 2006 11:27:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/01/27/323892.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/323892.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/01/27/323892.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/323892.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/323892.html</trackback:ping><description><![CDATA[<P>在上次关于AF框架的<A class="" title="" href="/blogs/linkin/archive/2006/01/17/545.aspx" target="">事件模型的随笔</A>中介绍了AF的事件分发机制，这个事件分发机制比较好的解决了如果通过Web Services来让客户端得到服务器端事件的问题，让Web Service和Remoting的事件处理模型看上去完全一致，为在AF上开发事件驱动的应用程序带来极大的便捷。</P>
<P>但是由于这个模型在Web Service模式下是采用的轮询机制，这种机制会产生这样的问题：</P>
<OL>
<LI>性能问题。每个客户端都频繁的轮询服务器，在工作站比较多的情况下会给服务器的负载带来巨大的压力。 
<LI>响应延迟。在这种事件分发机制下。事件的响应时延取决于轮询的频率，轮询频率越高则延迟越小，而频率越低则延迟越大。</LI></OL>
<P>这两个问题互相矛盾：为了提高事件的响应速度，就必须提高轮询频率；而提高了轮询频率又会加大服务器的负载。所以造成了事件响应速度和服务器负载两者不可兼得的局面。</P>
<P>为了解决这个问题，AF改良了事件分发机制，将事件探测器移到服务器端，结构如下图所示：<BR><BR><IMG height=621 hspace=5 src="http://www.cnblogs.com/images/cnblogs_com/linkin/33963/o_事件分发模型图.png" width=626 align=baseline><BR><BR></P>
<P>从结构上来看，没有太大的变化，主要的改变是将事件探测器从客户端移动到了服务器端。客户端照样也轮询事件，但是如果没有事件，服务器的这个线程就进入睡眠状态，不让它返回。同时该线程每隔一定时间就醒来检查一下有没有事件发生。如果有事件就马上返回。</P>
<P>因为这种轮询不占用网络资源，所以可以将服务器的轮询间隔时间设置得很短（目前默认值是100ms）。同时因为服务器Hold了线程，所以客户端的事件轮询也可以设置得很短，甚至可以无延迟。</P>
<P>这样一来，由于是服务器内部的线程处理，并且获取事件的操作代价并不高，所以这个事件探测器大部分时间都会是在休眠状态，因此服务器并没有被消耗多少资源。同时由于轮询不需要远程传递结果，因此可以将轮询时间设置得非常短，因此也极大的提高了事件的响应速度（原来的事件的最长响应时间是1s，现在是100ms，提高了十倍）。</P>
<P>另外，为了防止客户端意外的中断和请求超时，可以设置一个最长轮询次数。假如超过了最长轮询次数，服务器线程也返回，假如客户端仍然是活跃的，它马上会发出一个新的获取事件请求。然后服务器又开始进入新的轮询。</P><img src ="http://www.cnblogs.com/linkin/aggbug/323892.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44384/" target="_blank">淘宝网：跃升第二大机票平台</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Agile Framework功能介绍（３）：Overview</title><link>http://www.cnblogs.com/linkin/archive/2006/01/23/321876.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Sun, 22 Jan 2006 18:57:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/01/23/321876.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/321876.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/01/23/321876.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/321876.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/321876.html</trackback:ping><description><![CDATA[<P>在以前的随笔中，介绍了一些关于Agile Framework的功能部分的特点，不过都还是一些&#8220;点&#8221;的介绍，这次介绍一下Agile Framework的整体模块组成结构，让大家对Agile Framework有一个从点到面的了解。</P>
<P>Agile Framework目前主要包含两个部分：客户端部分和服务器部分。在服务器端，AF的采用了Castle作为核心的的IoC容器，由于采用了这种轻量级容器技术，使得AF可以很容易的支持&#8220;POJO&#8221;业务对象（这是Java里面的说法，不知道在.Net里面同样的意思应该怎么叫）。而在客户端，AF采用的是Composite UI Application Block，它是一个结构非常酷的SmartClient框架，而且本身也带有一个IoC容器。由于采用了CAB技术，使AF拥有了非常强大灵活的界面插件能力。</P>
<P>Caslte拥有一个非常强大的IoC核心以及MonoRails Web框架和ActiveRecord数据框架，但是缺少一个强大的SmartClient客户端。而CAB有很强大的客户端框架，却没有相应的服务器部分。在一个企业应用架构中，往往需要同时构建服务器端和客户端应用，假如单独的使用它们的话会非常麻烦。</P>
<P>AF对这两个容器框架都做了许多额外的扩展工作，把它们包装起来，使得这两个框架无缝的融合为一体。同时在这个基础之上做了许多对构件企业应用程序非常有帮助的服务集成和扩展。<BR><BR><IMG height=480 hspace=5 src="http://www.cnblogs.com/images/cnblogs_com/linkin/33963/r_AgileFramework模块功能图.png" width=499 align=baseline></P>
<P>这幅图表述了Agile Framework的基本模块结构和开发模式，Agile Framework提供了通明的分布式计算能力，客户端组件和服务器端组件实际上虽然处于不同的容器之中，但是对组件来说，Agile Framework提供了几乎完全相同的容器模型，客户端组件访问服务器端服务就好像访问本地容器中的服务一样。</P>
<P>开发人员在Agile Framework框架上编写应用程序，目前可以获得如下好处：</P>
<UL>
<LI><STRONG>分布式容器。</STRONG>只需要编写客户端界面控件和服务器端的业务逻辑组件，并&#8220;插入&#8221;到框架之中就可以。由框架提供依赖注入能力。并且依赖关系可以是分布式的，比如你可以在客户端插件中声明一个服务器端组件的依赖请求。 
<LI><STRONG>分布式事件。</STRONG>无论是服务器端还是客户端组件，只要是放到Agile Framework中，所有的组件都获得了完整的通信能力，除了可以请求组件的服务外，还可以互相之间订阅事件。并且事件是完全解耦的，并不需要显式的挂接事件，只需要声明一下事件发送者和订阅者的标记，Agile Framework会自动的连接有对应关系的事件。同样，事件也是分布式的，你可以在客户端组件中订阅服务器端的事件。 
<LI><STRONG>透明的底层传输机制。</STRONG>目前在Agile Framework中同时支持两种数据传输方式：Web Service和Remoting。你可以根据实际使用环境的需要灵活的配置。你可以在Intranet中将传输方式配置成Remoting，提高性能。或者将传输方式配置成Web Service，以满足通过企业防火墙的需要。而这一切对组件来说都是透明的，完全不用关心底层具体的传输方式。甚至你可以配置成&#8220;自动检测&#8221;，框架首先尝试采用Remoting，如果不能用Remoting就自动切换成Web Service。 
<LI><STRONG>自动离线处理机制。</STRONG>不需要再去编写复杂的离线处理任务，Agile Framework已经提供了一套完善的离线处理机制，采用Agile Framework编写的应用程序可以非常轻易的拥有离线处理功能。让你的应用程序拥有非常好客户体验。 
<LI><STRONG>常用服务和类库。</STRONG>与Castle和CAB不一样，Agile Framework是一个企业应用开发框架，所以内置了许多帮助开发企业级应用程序的服务和类库，比如日志服务、事务服务、工作流服务、缓存服务、安全认证服务、异常管理服务等等。此外还提供了大量的非常有用的帮助类库（Helper），比如单位转换、动态排序、表达式计算、日期转换、加密压缩、文件操作等等在企业开发中会频频使用到的基础功能。 </LI></UL>
<P>对Agile Framework的结构总体概览就介绍到这里，以后会详细的介绍Agile Framwork的一些内部技术细节以及框架所提供的各种服务和Helper类的功能介绍和使用方法。</P>
<P>Agile Framework是一个基于.Net 2.0技术的开源企业开发框架，目前Agilelabs Team正在加紧开发中，期望能尽早的放出第一个版本。希望了解更多信息请访问<FONT color=#002c99><A href="http://www.agilelabs.cn/"><FONT color=#002c99>敏捷实验室</FONT></A></FONT>。</P><img src ="http://www.cnblogs.com/linkin/aggbug/321876.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44386/" target="_blank">Palm 发布移动平台webOS和新款智能手机Palm Pre</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Agile Framework功能介绍（2）：框架事件模型</title><link>http://www.cnblogs.com/linkin/archive/2006/01/17/318612.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Mon, 16 Jan 2006 18:38:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/01/17/318612.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/318612.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/01/17/318612.html#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/318612.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/318612.html</trackback:ping><description><![CDATA[<P><A href="http://www.agilelabs.cn/blogs/linkin/archive/2006/01/12/518.aspx">上一回</A>简单介绍了一下Agile Framework的事件自动连接功能，这次来详细介绍一下事件功能的实现原理。 </P>
<P>在Agile Framework中，只要为组件分别标记上EventPublisher和EventSubscriber就可以自动实现互相之间的连接，实现了事件的完全解耦。这个功能和Castle容器的EventWiringFacility的功能很像（在Composite UI Application Block中也有同样的事件机制）。但是和它们不同的是，Castle和CAB都只支持同一个容器内的事件互相连接。而Agile Framework的容器是分布式的，客户端组件和服务器组件都可以被加入到容器中，因此，Agile Framework的事件传递机制也是分布式的。简单的说，在服务器的业务组件中定义的事件也可以被客户端的组件接收到。</P>
<P>为了实现这个功能首先需要解决一个难题：因为Agile Framework可以同时支持Web Service和Remoting数据传输接口（只需要在配置文件中简单的修改一下配置，框架采用什么类型的传输接口对开发人员来说是完全透明的），所以就必须让事件传递机制同时支持这两种接口。用Remoting还比较好解决，因为Remoting本身就支持远程的事件机制。但是Web Service就麻烦了，它只支持简单请求/响应的无状态访问模型，无法主动让服务器发消息给客户端。</P>
<P>Agile Framework采用的Event Dispatch机制比较完美的解决了这个问题，以下是框架的事件模型图：</P>
<P><IMG height=825 src="http://www.cnblogs.com/images/cnblogs_com/linkin/33963/o_Agile+Framework+Event+Dispatch+Model.png" width=709> </P>
<P>在整个结构中，Event Dispather是所有事件的中转站，它订阅了系统中所有的事件，并且知道每一个事件接受者。</P>
<P>事件的传递机制简单描述如下：</P>
<P>当Event Dispatcher接收到一个被触发的事件后，他会检查事件订阅列表，逐一将事件分发到每个接收者，根据事件接收者所处的位置不同，这时会有如下几种不同的情况：</P>
<OL>
<LI>假如事件接受者就在容器内部，Event Dispatcher会直接将事件发送到该接收者。 
<LI>假如事件接收者是在客户端（Smart Client）并且接口是Remoting，Event Dispatcher会调用Remoting的远程接口将事件发送到客户端。 
<LI>假如事件接收者是在客户端（Smart Client）并且接口是Web Service，Event Dispatcher会将事件发送给一个叫Event Holder的对象，这个对象负责接收所有发送给客户端的事件，并且保存下来。在客户端框架会有一个叫Event Detector的对象定时通过Web Service进行轮询来检查EventHolder中的事件。假如有事件是被发送到该客户端的，就会接受该事件数据并转发给客户端的事件接收方法。 
<LI>如果事件接收者是Web页面，在Agile Framework中也有一个功能类似Event Detector的Ajax对象也会对Event Holder进行轮询。因此在Agile Framework中业务组件所定义的事件也能被Web页面对象接收到。</LI></OL>
<P>以上就是Agile Framework事件分发机制的基本原理。Agile Framework是一个开源的基于.Net 2.0技术的中间件平台，目前正在开发中，更多信息请访问<A href="http://www.agilelabs.cn/">敏捷实验室</A>。 </P><img src ="http://www.cnblogs.com/linkin/aggbug/318612.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44381/" target="_blank">Google浏览器Chrome 2.0测试版发布</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Agile Framework功能介绍（1）：自动事件连接</title><link>http://www.cnblogs.com/linkin/archive/2006/01/12/315639.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Wed, 11 Jan 2006 19:16:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2006/01/12/315639.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/315639.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2006/01/12/315639.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/315639.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/315639.html</trackback:ping><description><![CDATA[<P>采用Agile Framework框架开发企业应用程序会编写大量的业务组件，这些组件都是被作为插件插入到框架中，结构上是完全解耦的。虽然按照SOA的设计理念在每个子系统之间不应该存在直接通信，但是有时候也可能需要在组件之间通信，比如和基础子系统或工作流组件通信。</P>
<P>因为，为了能保持最大程度的保持组件之间解耦状态，Agile Framework提供了组件之间的事件自动连接机制（Castle也提供了一个EventWiringFacility，提供了同样的功能，但是有一个比较严重的Bug：假如在系统中存在相互之间都有发布和订阅关系的组件就会造成死循环）。</P>
<P>在Agile Framework中使用自动事件连接非常简单，只需要对发布的事件打上EventPublisher特性，然后在订阅方法上打上EventSubscriber标记，框架就会自动的把具有相同eventkey的事件连接起来：</P>
<DIV style="BORDER-RIGHT: #cccccc 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #cccccc 1px solid; PADDING-LEFT: 4px; FONT-SIZE: 13px; PADDING-BOTTOM: 4px; BORDER-LEFT: #cccccc 1px solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: #cccccc 1px solid; BACKGROUND-COLOR: #eeeeee"><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Publisher<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;[EventPublisher(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">eventkey</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">description</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">event</SPAN><SPAN style="COLOR: #000000">&nbsp;EventHandler</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">CommonEventArgs</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;EventPublished;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;RaiseEvent(</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;data)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(EventPublished&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EventPublished(</SPAN><SPAN style="COLOR: #0000ff">this</SPAN><SPAN style="COLOR: #000000">,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;CommonEventArgs</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">(data));<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}<BR><BR></SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Substriber<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">private</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">string</SPAN><SPAN style="COLOR: #000000">&nbsp;recievedArgs;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;[EventSubscriber(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">eventkey</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)]<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;EventSubstribe(</SPAN><SPAN style="COLOR: #0000ff">object</SPAN><SPAN style="COLOR: #000000">&nbsp;sender,&nbsp;CommonEventArgs</SPAN><SPAN style="COLOR: #000000">&lt;</SPAN><SPAN style="COLOR: #000000">String</SPAN><SPAN style="COLOR: #000000">&gt;</SPAN><SPAN style="COLOR: #000000">&nbsp;args)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;recievedArgs&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;args.Args;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV><BR>
<P>这样，当Publisher触发了EventPublished之后，Substriber就会接受到这个事件。<BR><BR>关于Agile Framework更多信息请访问：<A href="http://www.agilelabs.cn/">敏捷实验室</A></P><img src ="http://www.cnblogs.com/linkin/aggbug/315639.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44380/" target="_blank">微软中国被指变相裁员 微软称确有过人事调整</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>介绍Agile Framework </title><link>http://www.cnblogs.com/linkin/archive/2005/12/26/305182.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Mon, 26 Dec 2005 14:29:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2005/12/26/305182.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/305182.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2005/12/26/305182.html#Feedback</comments><slash:comments>14</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/305182.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/305182.html</trackback:ping><description><![CDATA[<DIV class=postText>
<P>.Net开发一直缺少一个强大的先进的开发框架。微软在.Net方面的宣传和文档总是让人感觉在不断的纠缠一些技术细节，一直没有像J2EE那样从整体为采用.Net技术开发中小型企业应用软件的开发人员指出一个清晰的开发框架。Petshop和Duwamish这样的范例太小了，并且很落后于当前的开发水平，无法体现一些类似IoC容器，AOP，OR Mapping等流行的开发理念。而类似MBF这样的由微软官方推荐的企业架构又太过于庞大，并且特定于一些类似Biztalk，Sharepoint这样的商业产品，给一些中小型企业软件软件商带来很大的压力。</P>
<P>这些做法其实是基于利益最大化而考虑的，微软做为一家非常优秀的商业公司，这么做本身也无可厚非。但是如果抛开一些商业上的因素，熟悉.Net技术的人一定会知道.Net其实是一个技术非常先进的优秀开发平台，并且绝对有能力可以实现一个类似J2EE这样的开发架构。许多开源界的软件开发人员也知道这一点，并且世界上也有许多优秀的程序员已经做出了卓越的贡献，创造了有名的Castle、Spring.Net、Aspect#、NHibernate等。这些项目已经为构建一个&#8220;类J2EE&#8221;的的.Net开发架构做好了充分和必要的条件。</P>
<P>而Agile Framework则是Agilelabs Team为了这个目标尽自己的努力的成果。</P>
<P>Agile Framework框架是一个为了帮助快速搭建企业级应用程序的基础性平台。它采用了.Net 2.0技术，充分利用了面向对象、Web Service、多层结构、分布式部署、IoC容器、智能客户端、ORM、动态插件、工作流等先进技术，并完美的体现了SOA的设计理念。达到降低耦合、提高重用，增加系统的灵活性和可扩展性，提高开发效率和质量，节约开发成本的效果。</P>
<P>Agile Framework不会像微软的官方解决方案一样，只考虑使用自家的技术，也不会像某些开源社区项目一样，非开源免费产品不用，追求所谓的&#8220;零成本&#8221;，&#8220;开放&#8221;、&#8220;跨平台&#8221;。Agile Framework会尽量站在用户的角度替用户考虑问题，博采众长，综合利用各种最合适的，最优秀的技术或产品，在合理的成本条件下为用户提供一套性价比最好、最实用的软件系统。</P>
<P>Agile&nbsp;Framework框架是根据最新的Smart Client、MonoRails WebFramework、Castle IoC容器、WWF工作流引擎、XML数据库、DB4O面向对象数据库、数据挖掘、Reporting Service等技术构建的一个插件式SOA开发框架，随着时间推移，它将不断增加入更新的设计概念和功能。</P>
<H2><FONT size=3>应用功能特点</FONT></H2>
<UL>
<LI><STRONG>Availability（可用性）</STRONG>：为了保证采用Agile Framework开发的应用系统具有高可用性，Agile Framework 利用了SQL Server 2005的数据库镜像功能，允许事务日志以连续的方式从源服务器传递到单台目标服务器上。当主系统出现故障时，应用程序可以立即重新连接到辅助服务器上的数据库。辅助实例几秒钟内即可检测到主服务器发生了故障，并能立即接受数据库连接。同时还采用了离线数据处理技术，使应用程序在网络设备或服务器发生故障，甚至在大停电的情况下，都能在一定程度上保证系统的继续运行。 
<LI><STRONG>Scalability（可伸缩性）</STRONG>：Agile Framework采用的是多层分布式架构，在负载量小的时候整个系统可以完全部署到一台服务器上以降低成本，同时系统也可以非常方便的采用纵切（按照系统的功能模块来划分）、横切（按照系统的逻辑层次来划分）或者两者结合的方式将每个子模块分别部署到多台服务器上群集处理。因此当服务的负载增长时，系统能简单的通过增加服务器数量来满足需求，且不降低或得到更好服务质量。 
<LI><STRONG>Performance（性能）</STRONG>：在表现层，Agile Framework采用了智能客户端的离线数据处理，与服务器端的交互是异步的，即使是在系统业务量非常繁重的情况下，工作站也能以极高的速度进行操作，给用户带来良好的使用体验。在中间层，Agile Framework采用了强大的动态代理缓存技术，能对调用的服务方法自动拦截，并根据不同的缓存策略进行数据缓存处理，极大的提高了服务响应速度。在数据层，Agile Framework采用了三层数据库技术，将系统数据按照活动数据、联机事务数据和联机分析数据分类，并根据这些数据的特点有针对性的采用了面向对象嵌入式数据库、XML数据库和关系型数据仓库分别保存和处理，极大提高了数据处理速度。 </LI></UL>
<H2><FONT size=3>开发功能特点</FONT></H2>
<UL>
<LI><STRONG>Transparency（透明性）</STRONG>：Agile Framework提供的大量的优秀特性，比如离线处理、客户端自动升级、内存数据库、缓存处理、远程调用、事务处理、日志记录等等都被内建到框架之中，对开发人员透明化，开发人员可以完全不用自己来编写代码处理这些问题。Agile Framework已经都为您提供，并且一切都是在内部进行的，程序员只需要配置一些参数选项，所开发的应用程序就能自动获得这些先进的特性。 
<LI><STRONG>Extendable（可扩展性）</STRONG>：不需要做任何编程修改，原始的Agile Framework本身就已经是一个可以运行起来的软件系统，只是还不包含任何的业务逻辑，没有实用价值。所有的业务逻辑和用户界面都是通过一种动态的插件机制将各种特定的业务组件和界面组件&#8220;插入&#8221;到框架之中，构建起一套具有实用价值的系统软件。这种&#8220;插件式&#8221;软件设计结构非常容易被扩展，并且灵活性相当高。开发人员只需要开发和管理一些特定的业务逻辑模块，并可以根据实际情况选择插入和替换某些业务或界面插件就能达到添加和修改系统功能的目的，不需要重新编译系统。 
<LI><STRONG>Loose coupling（松耦合）</STRONG>：Agile Framework的设计从业务组件、界面组件到子系统都完全贯通了松耦合的概念。具体体现在：每个组件都不直接依赖于其它组件，它们之间通过接口来互相通讯。每个子系统也都不直接依赖于其它的子系统，它们之间通过工作流引擎来互相通讯。这样做的好处是，无论小到一个组件，还是大到一个系统，都是可&#8220;插拔&#8221;的，当您需要添加或替换一个功能组件甚至是一个系统的时候，会非常方便，甚至都不需要中断系统的正常运行。 </LI></UL>
<P>另：以上的介绍用语有些广告宣传的语气，如果不太习惯还请谅解：）</P>
<P>Agile Framework目前正在开发和完善中，等到成熟后一定会发布并且公开源代码，如果兴趣请保持关注博客园和我们的网站，我会及时的公布一些进展消息。有好的建议或者批评都请不吝赐教，希望加入我们一起开发也非常的欢迎。</P>
<P>关于Agile Framework和敏捷实验室的链接：</P>
<UL>
<LI><A class="" title="" href="http://www.agilelabs.cn/" target="">敏捷实验室</A> 
<LI><A class="" title="" href="http://www.agilelabs.cn/Wiki/default.aspx/AgilelabsWiki/AgileFrameworkDevelopGuide.html" target="">Agile Framework的开发指南Wiki</A>（In progress） 
<LI><A href="http://www.agilelabs.cn/photos/agile_framework/picture273.aspx">Agile Framework整体架构图</A> 
<LI><A class="" title="" href="http://www.agilelabs.cn/blogs/linkin/archive/category/1011.aspx" target="">关于Agile Framework架构设计方面的随笔</A></LI></UL></DIV><img src ="http://www.cnblogs.com/linkin/aggbug/305182.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44379/" target="_blank">“新一代互联网”研究：中国走在世界前列</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>无法逃脱的if...else...</title><link>http://www.cnblogs.com/linkin/archive/2005/08/20/219121.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Sat, 20 Aug 2005 08:14:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2005/08/20/219121.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/219121.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2005/08/20/219121.html#Feedback</comments><slash:comments>16</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/219121.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/219121.html</trackback:ping><description><![CDATA[<P>在许多时候,我们经常会碰到这样的问题： <BR>根据给定的条件来生成不同的对象，我一般是这样： </P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;BaseClass{ <BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">abstract</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Do(); <BR>} <BR></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Class1&nbsp;:&nbsp;BaseClass{ <BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">override</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Do(){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15><IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15> <BR>&nbsp;&nbsp;} <BR>} <BR></SPAN><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Class2&nbsp;:&nbsp;BaseClass{ <BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">override</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Do(){ <BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<IMG height=20 src="http://www.cnblogs.com/Images/dot.gif" width=15>. <BR>&nbsp;&nbsp;&nbsp;} <BR>}</SPAN> </DIV></DIV>
<P>再做一个工厂类根据不同的条件生成不同的对象：</P><SPAN id=Codehighlighter1_13_192_Open_Text>
<P></SPAN></P>
<P></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Factory{<BR>&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">static</SPAN><SPAN style="COLOR: #000000">&nbsp;BaseClass&nbsp;Create(){<BR>&nbsp;</SPAN><SPAN style="COLOR: #008000">//</SPAN><SPAN style="COLOR: #008000">get&nbsp;conditons</SPAN><SPAN style="COLOR: #008000"><BR></SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(conditon&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">1</SPAN><SPAN style="COLOR: #000000">){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Class1();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">else</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">(condition&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #000000">2</SPAN><SPAN style="COLOR: #000000">){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;Class2();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV></DIV>
<P>用的时候可以这样：<BR></P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">class</SPAN><SPAN style="COLOR: #000000">&nbsp;Client{<BR>&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;Process(){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BaseClass&nbsp;bc&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;Factory.Create();<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bc.Do();<BR>&nbsp;&nbsp;&nbsp;}<BR>}</SPAN></DIV></DIV>
<P>但是有人在看了这段代码之后，说里面有if...else...，而面向对象的编程中可以利用设计模式来替换掉if...else...的代码，而代码中出现if...else...则意味着Bad Smell。可我不明白如何来替换这段代码，用抽象工厂吗？具体的工厂类是可以直接生成产品了，但是对条件的判断代码又转移到到底采用哪个具体工厂上去。<BR>有人有好办法吗？<BR><BR>&nbsp; </P><img src ="http://www.cnblogs.com/linkin/aggbug/219121.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44378/" target="_blank">苏宁首战告捷 销售同比增六成</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>拟在公司内实行的开发规定（修改版），敬请大家指正和补充 </title><link>http://www.cnblogs.com/linkin/archive/2005/08/03/206261.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Wed, 03 Aug 2005 01:18:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2005/08/03/206261.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/206261.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2005/08/03/206261.html#Feedback</comments><slash:comments>23</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/206261.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/206261.html</trackback:ping><description><![CDATA[<P>软件开发流程（框架性草稿，细节还需要完善，修改中） <BR>&nbsp;<BR><STRONG>团队组成</STRONG><BR><FONT color=#0000ff>项目经理、配置管理员、业务顾问、项目组员。<BR>其中项目经理是必须的，配置管理员和业务顾问可按情况单独配置或与其它项目共用。</FONT><BR><BR><STRONG>进展控制</STRONG><BR>在开发前先根据项目要求设定一个总体的完成期限，并且根据经验设置若干个项目里程碑，里程碑规定了项目进展所达到的要求，在整个开发流程中采用迭代循环的方式进行渐进式开发，<SPAN style="COLOR: #0000ff">每个项目的迭代周期应由项目经理根据迭代目标和实际情况进行确定。</SPAN>每次迭代前确定迭代目标和迭代周期，一般是把需求优先级最高和技术风险最大的用例首先实现，每次迭代都要以得到一个达到迭代目标并明确可运行的版本为结束标志。<BR><STRONG>需求分析</STRONG><BR>原则上不限制需求分析过程，但是建议采用UP流程进行需求分析，必须编写详细的文本方式的用例说明（UML图形为可选件）。进行需求分析时采用头脑风暴会议方式，要求项目组所有人都必须参加和讨论。所有的用例和设计都必须保存到配置管理库中。<BR><STRONG>软件开发</STRONG><BR>采用敏捷开发过程和持续集成。 <BR>测试先行，<SPAN style="COLOR: #0000ff">开发时，先编写对应的TESTCASE后经项目经理审核，并编列入开发文档后，方可进行功能代码编写</SPAN>，功能代码和单元测试代码都由必须同一个人完成。单元测试行覆盖率要达到90%以上。<BR>每天下班以前必须签入当天的工作代码，并通过单元测试。如有特殊情况不能完成，需要向项目经理说明。<BR>每次签入必须说明签入结果，比如增加成了什么功能，修复了什么BUG等等。 <BR>一般情况下组员都应该采用结对方式工作，两人同时使用一台电脑。碰到特殊情况由项目经理安排。<BR>除非迫不得以，尽量不要采用IDE的DEBUG方式来进行单步跟踪，而是采用记录日志和设置断言的方式来进行DEBUG。<BR>每次发现BUG，必须修改单元测试以至让单元测试可以检测到该BUG的存在。如有特殊情况不能完成，需要向项目经理说明。<BR><STRONG>会议要求</STRONG><BR>每次会议必须记录下需要解决的问题和会议结果，并且用摄象机录制整个会议过程，并存档。 <BR><BR>注：<BR>许多朋友在看过这个规定之后，提出了许多好建议和善意的批评，这里非常感谢大家，特别是<A id=Comments1_CommentList__ctl35_NameLink href="http://kingofsoft.cnblogs.com/" target=_blank>肯.索夫特</A>朋友（以上兰色部分为他的修改意见）。<BR>说实话，我的职业大部分是一个程序员，也没什么太多的管理经验，我想每个程序员在工作的时候都会有这种感觉：提高生产力除了提高技术，优秀的管理手段也是非常重要的一个因素。<BR>其实在国内很多企业，把程序员当工人一样管理，但是软件和传统工业相比还是有许多特殊的地方，但是管理人员并不知道，比如在我以前的一家公司，还在采用瀑布模型，需求人员做好了需求给设计人员，设计人员做好了设计给程序员，程序员基本上没有资格参与需求分析和设计，但是一程序员拿到最终设计时却发现无法下手，只好凭着自己的想象去做，最终是什么结果可以想象。但是管理人员还认为他的管理手段非常先进，实现了&#8220;流水线作业&#8221;。这种巨无&#8220;可操作性&#8221;的制度，最后竟然也被&#8220;操作&#8221;下来了，并且还做了几个项目。。。<BR>虽然我们并不是管理人员，但是在面对不合理的制度的时候，我们除了抱怨制度的合理性，能不能主动一点提出一些自己的理想中的建议呢？<BR>我承认我的经验不足，太理想化，在这个规范中，确实有许多地方不完善，也有许多部分还没有考虑到，比如软件测试等等。所以希望大家在批评之后，最好能提出一些修改意见或补充，或者把自己心目中设计的或实际运行中优秀制度提出来给大家分享和参考，再次感谢大家。</P><img src ="http://www.cnblogs.com/linkin/aggbug/206261.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44377/" target="_blank">福布斯：虚拟化技术登陆Mac平台</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item><item><title>Castle的IoC容器深入分析</title><link>http://www.cnblogs.com/linkin/archive/2005/08/02/205694.html</link><dc:creator>linkin</dc:creator><author>linkin</author><pubDate>Tue, 02 Aug 2005 07:44:00 GMT</pubDate><guid>http://www.cnblogs.com/linkin/archive/2005/08/02/205694.html</guid><wfw:comment>http://www.cnblogs.com/linkin/comments/205694.html</wfw:comment><comments>http://www.cnblogs.com/linkin/archive/2005/08/02/205694.html#Feedback</comments><slash:comments>27</slash:comments><wfw:commentRss>http://www.cnblogs.com/linkin/comments/commentRss/205694.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/linkin/services/trackbacks/205694.html</trackback:ping><description><![CDATA[大家都知道，Castle的Windsor容器非常强大，可以横向扩展的先进架构和自持自动连接等高级功能，并且充分利用了.Net的优势和特点，非常值得学习研究。<BR>在Castle中添加和使用组件非常简单：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #008080">1</SPAN><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><SPAN style="COLOR: #000000">IWindsorContainer&nbsp;container&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;WindsorContainer(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;XmlInterpreter(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">../BasicUsage.xml</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">)&nbsp;);<BR></SPAN><SPAN style="COLOR: #008080">2</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top><BR></SPAN><SPAN style="COLOR: #008080">3</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>container.AddComponent(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">newsletter</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">4</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(INewsletterService),&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(SimpleNewsletterService)&nbsp;);<BR></SPAN><SPAN style="COLOR: #008080">5</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>container.AddComponent(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">smtpemailsender</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">6</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(IEmailSender),&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(SmtpEmailSender)&nbsp;);<BR></SPAN><SPAN style="COLOR: #008080">7</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>container.AddComponent(&nbsp;</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">templateengine</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">,&nbsp;<BR></SPAN><SPAN style="COLOR: #008080">8</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(ITemplateEngine),&nbsp;</SPAN><SPAN style="COLOR: #0000ff">typeof</SPAN><SPAN style="COLOR: #000000">(NVelocityTemplateEngine)&nbsp;);<BR></SPAN><SPAN style="COLOR: #008080">9</SPAN><SPAN style="COLOR: #000000"><IMG src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align=top></SPAN></DIV></DIV>这样就可以了，不需要像Spring.Net那样写连接配置文件，因为在Castle中组件之间的依赖关系是自动检测并连接的。<BR>那么，Castle是如何做到的呢？<BR>当AddComponent的时候，Windsor其实是调用了MicroKernel来进行注册，Windsor只是MicroKernel的一个包装，容器的主要功能其实都是MicroKernel完成的，而MicroKernel被设计成一个非常精巧，但是可扩展能力超强的一个内核结构。<BR>在MicroKernel中，添加一个组件的具体的代码如下：<BR>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;AddComponent(String&nbsp;key,&nbsp;Type&nbsp;serviceType,&nbsp;Type&nbsp;classType)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(key&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArgumentNullException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">key</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(serviceType&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArgumentNullException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">serviceType</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(classType&nbsp;</SPAN><SPAN style="COLOR: #000000">==</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)&nbsp;</SPAN><SPAN style="COLOR: #0000ff">throw</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ArgumentNullException(</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">classType</SPAN><SPAN style="COLOR: #000000">"</SPAN><SPAN style="COLOR: #000000">);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;ComponentModel&nbsp;model&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;ComponentModelBuilder.BuildModel(key,&nbsp;serviceType,&nbsp;classType,&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">);<BR>&nbsp;&nbsp;&nbsp;&nbsp;RaiseComponentModelCreated(model);<BR>&nbsp;&nbsp;&nbsp;&nbsp;IHandler&nbsp;handler&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;HandlerFactory.Create(model);<BR>&nbsp;&nbsp;&nbsp;&nbsp;RegisterHandler(key,&nbsp;handler);<BR>}<BR></SPAN></DIV></DIV>
<P>首先，ComponentModelBuilder给组件生成了一个ComponentModel，这个Model实际上是用大量的反射来捕获这个组件的各种详细的元信息，就好象先给你来一次X光扫描，这个组件是什么东西清清楚楚。<BR>建立模型的具体过程如下：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">public</SPAN><SPAN style="COLOR: #000000">&nbsp;ComponentModel&nbsp;BuildModel(String&nbsp;key,&nbsp;Type&nbsp;service,&nbsp;Type&nbsp;classType,&nbsp;IDictionary&nbsp;extendedProperties)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;ComponentModel&nbsp;model&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ComponentModel(key,&nbsp;service,&nbsp;classType);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">if</SPAN><SPAN style="COLOR: #000000">&nbsp;(extendedProperties&nbsp;</SPAN><SPAN style="COLOR: #000000">!=</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">null</SPAN><SPAN style="COLOR: #000000">)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;model.ExtendedProperties&nbsp;</SPAN><SPAN style="COLOR: #000000">=</SPAN><SPAN style="COLOR: #000000">&nbsp;extendedProperties;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">foreach</SPAN><SPAN style="COLOR: #000000">(IContributeComponentModelConstruction&nbsp;contributor&nbsp;</SPAN><SPAN style="COLOR: #0000ff">in</SPAN><SPAN style="COLOR: #000000">&nbsp;contributors)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;contributor.ProcessModel(&nbsp;kernel,&nbsp;model&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;</SPAN><SPAN style="COLOR: #0000ff">return</SPAN><SPAN style="COLOR: #000000">&nbsp;model;<BR>}<BR></SPAN></DIV></DIV>
<P>其实具体过程就是调用contributor来进行具体的信息收集，每个Contributor负责收集不同的信息，在DefaultMicroKernel中一共注册了以下7个Contributor来收集信息：</P>
<DIV style="BORDER-RIGHT: windowtext 0.5pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: windowtext 0.5pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #e6e6e6; PADDING-BOTTOM: 4px; BORDER-LEFT: windowtext 0.5pt solid; WIDTH: 98%; WORD-BREAK: break-all; PADDING-TOP: 4px; BORDER-BOTTOM: windowtext 0.5pt solid">
<DIV><SPAN style="COLOR: #0000ff">protected</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">virtual</SPAN><SPAN style="COLOR: #000000">&nbsp;</SPAN><SPAN style="COLOR: #0000ff">void</SPAN><SPAN style="COLOR: #000000">&nbsp;InitializeContributors()<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ConfigurationModelInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;LifestyleModelInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ConstructorDependenciesModelInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;PropertiesDependenciesModelInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;LifecycleModelInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;ConfigurationParametersInspector()&nbsp;);<BR>&nbsp;&nbsp;&nbsp;&nbsp;AddContributor(&nbsp;</SPAN><SPAN style="COLOR: #0000ff">new</SPAN><SPAN style="COLOR: #000000">&nbsp;InterceptorInspector()&nbsp;);<BR>}<BR></SPAN></DIV></DIV>
<P>他们各有各的功能，你可以可以自己写Contributor来收集你想要收集的信息。<BR>接下来就是发出ComponentCreated的事件，这个事件是一个容器的扩展点，可以被注册的Facility接收到。<BR>再接下来，就是调用HandlerFactory来创建一个IHandler，IHandler的主要功能就是创建组件的激活器（Activator），每个组件都对应一个Activator，Activator根据Lifestyle管理器来创建不同生命类型的组件实例，比如Singleton，PreThread，Transient等等。<BR>然后在EnsureDependenciesCanBeSatisfied()这个方法中检查组件的依赖是否都得到了满足，这里就是自动连接的原理，假如没有满足，Castle就循环检查以前注册的每个组件是否满足该组件的要求，或者该组件是否满足以前注册的组件的要求，假如满足就添加到组件的依赖列表中。<BR>最后，注册IHandler，激发Registed事件（另一个扩展点），完成整个组件的注册过程。</P>
<P>&nbsp;</P>
<P>&nbsp;</P><img src ="http://www.cnblogs.com/linkin/aggbug/205694.html?type=1" width = "1" height = "1" /><br/><br/>--------------------------<br/><a href="http://job.cnblogs.com/offer/302/" target="_blank">盛大招聘.Net开发工程师 </a><br/><a href="http://www.hjbook.net/product/4041/" target="_blank">经典好书：.NET框架程序设计（修订版）</a><br/>新闻：<a href="http://news.cnblogs.com/n/44376/" target="_blank">微软CEO信誓旦旦:Windows 7将成最出色操作系统</a><br/>导航：<a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;&nbsp;<a href="http://kb.cnblogs.com" target="_blank">知识库</a>&nbsp;&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻</a>&nbsp;&nbsp;<a href="http://job.cnblogs.com/" target="_blank">招聘</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;&nbsp;<a href="http://zzk.cnblogs.com" target="_blank">找找看</a>]]></description></item></channel></rss>