﻿<?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>博客园-光影传说</title><link>http://www.cnblogs.com/dreamstec/</link><description>光影传说</description><language>zh-cn</language><lastBuildDate>Fri, 21 Nov 2008 17:28:48 GMT</lastBuildDate><pubDate>Fri, 21 Nov 2008 17:28:48 GMT</pubDate><ttl>60</ttl><item><title>关于业务层代码的组织</title><link>http://www.cnblogs.com/dreamstec/archive/2008/03/12/1101336.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Tue, 11 Mar 2008 16:57:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/03/12/1101336.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1101336.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/03/12/1101336.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1101336.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1101336.html</trackback:ping><description><![CDATA[摘要: 这应该是一个算是古老的话题了，我想在这里面重新的提一下，希望能跟园子里朋友交流交流。看园子里很多都是交流具体的技术，交流思想的倒是相对比较少，希望大家能够一起热闹热闹，给我扔砖头。　　前几篇帖子只是介绍了一下我的框架。特别是对ORM是采用自己的、NHIBENATE、LINQ TO SQL等，有采用LINQ　TO SQL的N个理由，也有不采用其的N个理由，其中重要的一条就是因为业务逻辑的组织。　　说&nbsp;&nbsp;<a href='http://www.cnblogs.com/dreamstec/archive/2008/03/12/1101336.html'>阅读全文</a><img src ="http://www.cnblogs.com/dreamstec/aggbug/1101336.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43624/" target="_blank">[新闻]诺基亚将支持Lotus Notes 和黑莓争夺市场</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>框架的代理层介绍</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/17/1071003.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Sat, 16 Feb 2008 16:10:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/17/1071003.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1071003.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/17/1071003.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1071003.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1071003.html</trackback:ping><description><![CDATA[<p><font face="Verdana">提到代理，就是客户端与服务器通信的桥梁，模拟服务提供的功能，关键一点就是接口和数据。<br />
框架的代理，刚开始我是参照微软的WS的用法，是采用调用的方式，后来看到.Net3.0的调用方法，眼睛一亮，决定采用，想了好几天，才想起来应该是通过透明代理实现的。由于在服务加载的时候，也是用透明代理进行对调用的拦截的，这里的实现思路是一致的。<br />
&nbsp;&nbsp;&nbsp;&nbsp; </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"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">interface</span><span style="color: #000000">&nbsp;CityServiceSO<br />
<img id="Codehighlighter1_35_149_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_35_149_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_35_149_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_35_149_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_35_149_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_35_149_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_35_149_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_35_149_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_35_149_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_35_149_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_45_101_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_45_101_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_45_101_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_45_101_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_45_101_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_45_101_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_45_101_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_45_101_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_45_101_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_45_101_Open_Text"><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;查找所有数据<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span></span><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataCollection</span><span style="color: #000000">&lt;</span><span style="color: #000000">CitySDO</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;FindAll();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;CityServiceSOI&nbsp;:&nbsp;ExecuteProxy</span><span style="color: #000000">&lt;</span><span style="color: #000000">CityServiceSO</span><span style="color: #000000">&gt;</span><span style="color: #000000">,&nbsp;CityServiceSO<br />
<img id="Codehighlighter1_236_412_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_236_412_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_236_412_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_236_412_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_236_412_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_236_412_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_236_412_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_236_412_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_236_412_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_236_412_Open_Text"><span style="color: #000000">{<br />
<img id="Codehighlighter1_246_302_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_246_302_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_246_302_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_246_302_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_246_302_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_246_302_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_246_302_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_246_302_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_246_302_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff">/**/</span><span id="Codehighlighter1_246_302_Open_Text"><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;summary&gt;</span><span style="color: #008000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;查找所有数据<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #808080">///</span><span style="color: #008000">&nbsp;</span><span style="color: #808080">&lt;/summary&gt;</span></span><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;DataCollection</span><span style="color: #000000">&lt;</span><span style="color: #000000">CitySDO</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;FindAll()<br />
<img id="Codehighlighter1_359_406_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_359_406_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_359_406_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_359_406_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_359_406_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_359_406_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_359_406_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_359_406_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_359_406_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_359_406_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;Proxy.FindAll();<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 从上面的调用可以看的出，在基类里提供了一个Proxy的泛形属性，并实现其接口，在调用的时候，实现切入点，在调用点转入后台调用。与实现原来实现的调用一样，只是表现形式上有所差异，代码更简洁。<br />
核心也就是重写：public override IMessage Invoke(IMessage message)这个函数。可以在此对调用进行更多的控制。<br />
此处主要提供了两个调用，一个是Local一个是Remoting，主要是针对是服务调用还是本地调用，从而实现根据配置文件不同而实现本地激活和远程服务器激活，具体使用的信道由配置文件决定，默认走的是Http信道。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</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"><img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">override</span><span style="color: #000000">&nbsp;IMessage&nbsp;Invoke(IMessage&nbsp;message)<br />
<img id="Codehighlighter1_58_1220_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_1220_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_58_1220_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_1220_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_58_1220_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_58_1220_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_58_1220_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_58_1220_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_58_1220_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_58_1220_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMessage&nbsp;rltMessage;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000"><br />
<img id="Codehighlighter1_121_997_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_121_997_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_121_997_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_121_997_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_121_997_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_121_997_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_121_997_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_121_997_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_121_997_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_121_997_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMethodCallMessage&nbsp;methodCall&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;message&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;IMethodCallMessage;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(methodCall&nbsp;</span><span style="color: #000000">==</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_258_333_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_258_333_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_258_333_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_258_333_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_258_333_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_258_333_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_258_333_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_258_333_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_258_333_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_258_333_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;E2EException(</span><span style="color: #800000">"</span><span style="color: #800000">调用参数不能为空</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MethodData&nbsp;methodData&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.GetMethodData(methodCall);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">switch</span><span style="color: #000000">&nbsp;(methodData.MethodType)<br />
<img id="Codehighlighter1_469_931_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_469_931_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_469_931_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_469_931_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_469_931_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_469_931_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_469_931_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_469_931_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_469_931_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_469_931_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MethodType.Remoting:<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">this</span><span style="color: #000000">.InvokeRemoting(methodCall,&nbsp;methodData);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MethodType.Local:<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">this</span><span style="color: #000000">.InvokeLocal(methodCall);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MethodType.Object:<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">this</span><span style="color: #000000">.InvokeObject(methodCall);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">case</span><span style="color: #000000">&nbsp;MethodType.GetType:<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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">this</span><span style="color: #000000">.InvokeGetType(methodCall);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;E2EException(</span><span style="color: #800000">"</span><span style="color: #800000">错误的代理类型</span><span style="color: #800000">"</span><span style="color: #000000">);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;exception)<br />
<img id="Codehighlighter1_1050_1179_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1050_1179_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_1050_1179_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_1050_1179_Closed_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top"  alt="" /><img id="Codehighlighter1_1050_1179_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_1050_1179_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_1050_1179_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_1050_1179_Open_Text').style.display='inline';" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_1050_1179_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://www.cnblogs.com/Images/dot.gif"  alt="" /></span><span id="Codehighlighter1_1050_1179_Open_Text"><span style="color: #000000">{<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rltMessage&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">this</span><span style="color: #000000">.CreateReturnMessage(exception,&nbsp;message&nbsp;</span><span style="color: #0000ff">as</span><span style="color: #000000">&nbsp;IMethodCallMessage);<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">&nbsp;rltMessage;<br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top"  alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /><br />
<img src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top"  alt="" /></span></div>
<p>&nbsp;&nbsp;<br />
</font><font face="Verdana">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 调用的切入实现了，下面就要实现远程调用了。远程调用，主要是为了实现服务器端激活，由于服务加载层的存在，由远程调用只需要把使用的类的全名、调用的函数和参数传递过来就可实现远程调用。<br />
这一块在这里不进行过多的叙述了。<br />
</font></p>
  <img src ="http://www.cnblogs.com/dreamstec/aggbug/1071003.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43623/" target="_blank">[新闻]Mozilla公布去年收入报告</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关于"WebForm和MVC"</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/12/1067292.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Tue, 12 Feb 2008 06:17:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/12/1067292.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1067292.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/12/1067292.html#Feedback</comments><slash:comments>26</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1067292.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1067292.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-family: 宋体">通过　<a title=" ocean " href="http://ocean.cnblogs.com/">ocean </a></span><span style="font-family: 宋体">&nbsp;的链接看这一篇文章&nbsp;<a title="关于WebForm和MVC" href="http://www.cnblogs.com/szw/archive/2007/12/22/1010449.html">WebForm和MVC</a>&nbsp;</span><span style="font-family: 宋体">看了之后有点想法，借自己的空间里发几句牢骚。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">关于</span>WebForm<span style="font-family: 宋体">和</span>MVC<span style="font-family: 宋体">我感觉应该不是一个概念上的东西，没有比较的地方。一个是设计模式，一个网页，怎么能够合在一起比较呢？企业级应用与</span>WebForm<span style="font-family: 宋体">与</span>MVC<span style="font-family: 宋体">也不是一个概念上的东西，也没有比较必要。就如</span>ocean<span style="font-family: 宋体">所说，里面有很多地方是在偷换概念。</span></p>
<p style="text-indent: 27pt">MVC<span style="font-family: 宋体">只是设计模式，你是</span>WebForm<span style="font-family: 宋体">展现，还是用</span>WinForm<span style="font-family: 宋体">展现，好像都没有关系，再跟企业级的开发牵扯到一起，好像是更乱了。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">对于设计模式，我感觉关键是你的</span>OO<span style="font-family: 宋体">基本功如何，完全没有必要为了使用某种设计模式而用那种设计模式。举个例子吧，</span>IUser oIUser = (IUser) ServiceLocator. getService ("UserInfor")<span style="font-family: 宋体">，这种用法可以已经深入了一些朋友的心底了，当然好处多多。只是我再多问一句，为什么一定要这样使用？</span>IUser<span style="font-family: 宋体">　</span>oIUser= ServiceLocator&lt; IUser&gt;. getService()<span style="font-family: 宋体">，或</span>IUser<span style="font-family: 宋体">　</span>oIUser= ServiceLocator&lt; IUser&gt;. getService(&#8220;UserInfor&#8221;)<span style="font-family: 宋体">这样的写法呢？应该是可以达到一样的功能。当然，思想还是一样的思想，便是达到的效果却是不一样了。因为一个需要强制转换，一个不需要强制转换。一种在编译的时候就能够找出这些存在的</span>Bug<span style="font-family: 宋体">，一种是要在运行的时候才能够出现存在的</span>Bug<span style="font-family: 宋体">，虽然只是一点点的改变，对软件的影响应该是比较大的。再深入的问一下，为什么一定要用接口呢？又一大堆用接口的理由。对于一些场合是必须要用接口的，但是还有很多地方，是可以不用接口的，特别是在我们一般的应用软件开发过程里，维护一个文件应该比维护两个文件要轻松一些。当然，用这种方法比较容易实现切入点，如果是从这点方面去考虑，那是要用的，毕竟有那么成熟的框架支持，如果仅仅是为了用这种方式而用这种方式，就要考虑考虑了。但是上面所提到的那两种调用方式，应该可以取代提到的那种方式。当然，实现切入的话，也有其他的方式，我们可以考虑考虑，比较一下。说了这么多，我不是在比较哪种好，哪种不好，只是要提醒不要人云亦云，要有自己的想法，不要为了某种设计模式而去用这种设计模式。只所以接到这个接口，也是在一个博友的</span>Blog<span style="font-family: 宋体">里看到这句话，才提上来的。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">对于设计方面，按照企业应用架构模式上的说法，领域模型、表入口模型、脚本模型，如果你是按照领域模型组织的，那么那些设计模式你会自然而然的用上去的，可能你还不知道这个模式叫什么名字，核心还是你的</span>OO<span style="font-family: 宋体">的基础。如果你是用脚本模型，还要硬套完整的设计模式，我感觉就完全没有这个必要。如果不是搞分布式程序的，没有独立的应用服务器，那么，远程激活、服务定位，好像都是多余的考虑。</span></p>
<p style="text-indent: 27pt">WebForm<span style="font-family: 宋体">，就是</span>BS<span style="font-family: 宋体">客户端。在我的观念中，客户端通常分为两种，胖客户端与瘦客户端，现在的什么富客户端，也是属于瘦客户端。反正在我的软件中，以</span>BS<span style="font-family: 宋体">＋</span>CS<span style="font-family: 宋体">结合比较多，所以呢，我通常不会去考虑要采用</span>BS<span style="font-family: 宋体">还是</span>CS<span style="font-family: 宋体">的，因为我两种客户端都要提供的，呵呵。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">说到企业级应用，要说的，可就是太多了，真是剪不断理还乱的感觉，我感觉应该是应用软件领域里面，最复杂的一块。设计一个框架就是在玩平衡木，玩艺术，没有最好的只有更适合的。单机性能最优，不能代表多机性能最优。是资金、技术、周期、性能、伸缩、安全、扩展、集成等等诸方面的综合。仅仅从</span>WebForm<span style="font-family: 宋体">、</span>MVC<span style="font-family: 宋体">方面就说什么企业级的应用，应该是远远远远不够的，不要被这本书上那本书，动不动就是企业级应用搞晕了头脑。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">到这里也不知道说了些什么，也有些文不对题，只是把自己的想法写下来，跟朋友们交流一下，只是个人观点，朋友们别扔西红柿呀<br />
　　　<br />
　　 那个</span>Linq<span style="font-family: 宋体">　</span>To Sql<span style="font-family: 宋体">与我的</span>ORM<span style="font-family: 宋体">的性能测试还没有做，不说了。应该做测试了</span>&#8230;<br />
</p>
<img src ="http://www.cnblogs.com/dreamstec/aggbug/1067292.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43621/" target="_blank">[新闻]2008年11月21日科技博客精选</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>框架的服务层简介</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066299.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Sat, 09 Feb 2008 07:45:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066299.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1066299.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066299.html#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1066299.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1066299.html</trackback:ping><description><![CDATA[&nbsp;
<p style="text-indent: 27pt"><span style="font-family: 宋体">上面粗粗的介绍了</span>DTO/SDO<span style="font-family: 宋体">方面的东西，接下来介绍服务层。说服务层，细分起来，可以再分为三个层次。一是用于写逻辑代码、流程代码（不敢说流程编排）、集成代码的服务层，二是用于实现这些逻辑服务的服务加载层，三是传输信道的服务层。由于今天是初三了，还有些活要超一些进度，我不知道近期还有多少时间写这个东东，只能更粗的介绍了。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">对于服务层、</span>DTO/SDO<span style="font-family: 宋体">层、数据交换层，我个人感觉难度要比</span>ORM<span style="font-family: 宋体">那块要一些，可能大家通常对于</span>ORM<span style="font-family: 宋体">那一块的关注比较多一点，这一块关注的人估计要相对少一点。希望大家能够给我多提些批评建议</span>&#8230;</p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">可能有的朋友会说，这又是重新发明轮子，又是一个时间先后的问题，</span>3.0<span style="font-family: 宋体">出来之后，我也曾考虑把这一块换</span>WCF<span style="font-family: 宋体">，但是用起来，发现</span>WCF<span style="font-family: 宋体">用起来不是很方便，特别是在服务加载那一块，很麻烦的，对于通常的项目来说，真的没有必要。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">还是快点把这个理一下吧。名词我不知道应该如何准确的定义，朋友们给个建议。</span></p>
<p style="margin-left: 48pt; text-indent: -21pt; tab-stops: list 48.0pt">一、<span style="font-family: 宋体">逻辑代码服务层：</span></p>
<p style="margin-left: 48pt"><span style="font-family: 宋体">主要是实现把</span>BO<span style="font-family: 宋体">的逻辑转换成更粗粒度的服务，实现服务的集成。另外，通常一个</span>Data<span style="font-family: 宋体">可以对应多个</span>DTO/SDO<span style="font-family: 宋体">，那么，要业务逻辑层不变的情况不，就可以改变对客户端的数据输出，此时，只要改变一下</span>DTO/SDO<span style="font-family: 宋体">和再添加一个方法就可以了，业务逻辑层代码不用作任何改变。此处要注意的就是对于事务的处理了，如何集成数据来自于其他的系统，特别是跨</span>Internet<span style="font-family: 宋体">的事务，这个就非常讨厌了，我现在还没有能力解决，对于局域网的事务要好一些，用</span>TIP<span style="font-family: 宋体">可以方便的加入到事务中。</span></p>
<p style="margin-left: 48pt"><span style="font-family: 宋体">这里还要考虑的是对于</span>BS<span style="font-family: 宋体">和</span>CS<span style="font-family: 宋体">的应用，</span>CS<span style="font-family: 宋体">应用通常是通过代理接入服务层的，</span>BS<span style="font-family: 宋体">应用可能通过代理，也可能不通过代理接入服务层。那么，对于采用声明事务，要对通过代理和不通过代理提供完全一样功能。这样提出了这样一个要求，对于函数的调用，必须要提供拦截的功能，通常的做法是用透明代理。我现在这里用的是</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">ContextBoundObject</span><span style="font-family: 宋体">这个基类，虽然可以使用，感觉不是很理想，不支持泛形。在函数调用</span>new ()<span style="font-family: 宋体">的时候，由</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">IContextAttribute</span><span style="font-family: 宋体">切换到代理。</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">RealProxy</span><span style="font-family: 宋体">在服务层里面用的是很多的，也是个关键。还有什么实现</span>DynamicProxy<span style="font-family: 宋体">等等，处理思想都是相似的，实现方式有所差异。</span></p>
<p style="margin-left: 48pt; text-indent: -21pt; tab-stops: list 48.0pt">二、<span style="font-family: 宋体">服务加载层</span></p>
<p style="margin-left: 42pt; text-indent: 5.25pt"><span style="font-family: 宋体">服务加载层，就是根据配置文件，把服务加载到内存里，实现服务器端激活。当第一次调用的时候，根据配置文件，把服务加载到内存里，当实例化的时候切入对于自定义属性的访问。当调用一个函数的时候，根据传入的服务类的类名、函数名，从缓存里查到这个实例的函数，再通过反射调用这个函数。主要的就是在配置文件加载上面了。</span></p>
<p style="margin-left: 48pt; text-indent: -21pt; tab-stops: list 48.0pt">三、<span style="font-family: 宋体">服务信道层</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">从上面的思想，应该可以看的出来，信道只是提供一个数据传输的通道罢了，通过</span>Http/TCPIP/MQ/SMTP<span style="font-family: 宋体">等等，都一样，要做的就是按照一定的格式，把数据从客户端传到服务器端，再把调用返回的数据写入信道，这就是信道要做的。具体的调用由服务加载层做。只要完成了一个，其他的几种都是相类似的，只是提供的协议不同罢了。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">再深入的介绍可能要花很多的篇幅，如果大家感兴趣的话，可以深入的讨论讨论。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">跟</span>WCF<span style="font-family: 宋体">的区别是，服务层依赖于配置文件，只有一个入口文件，如果用</span>WCF<span style="font-family: 宋体">，要么是</span>.asmx<span style="font-family: 宋体">要么是</span>.srv<span style="font-family: 宋体">，每一个服务对应着一个文件，只要业务代码写好了。就可以非常方便的加入到服务里面去，服务的变更非常方便，走</span>Http/TCPIP<span style="font-family: 宋体">都可以，切换也非常方便</span>,<span style="font-family: 宋体">不用更改任何代码，不用在服务上面多花精力。刚开始也是采用面向接口的方式，改进之后，去掉了，太麻烦，因为很多东西代码工具生成的，有时候需要手工调整，要同时维护着两个文件，加大了工作量。</span></p>
<p style="margin-left: 42pt"><span style="font-family: 宋体">算了，不说了，有点累了</span>&#8230;</p>
  <img src ="http://www.cnblogs.com/dreamstec/aggbug/1066299.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43620/" target="_blank">[新闻]Google拟年底前关闭"lively" 因不敌"第二人生"</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>框架的DTO层介绍</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066242.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Sat, 09 Feb 2008 04:30:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066242.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1066242.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/09/1066242.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1066242.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1066242.html</trackback:ping><description><![CDATA[<p>&nbsp;<span style="font-family: 宋体">新年哪里也没有去，呆在家里写了几篇</span>Blog<span style="font-family: 宋体">与大家交流一下。平时工作很忙，也难得有时间写点东西。大年三十、初一各发了一往篇，还有那么多的博友陪我一起，像我一样，呵呵。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">上面粗粗的介绍了</span>ORM<span style="font-family: 宋体">层、业务层。</span>ORM<span style="font-family: 宋体">主要是在数据访问，把程序从千篇一率的存储过程调用，从容易出错的</span>Sql<span style="font-family: 宋体">语句中解脱出来；业务层主要是规范业务逻辑的组织，简化事务处理，把精力用到处理业务逻辑的刀刃上。对于很小的</span>BS<span style="font-family: 宋体">软件，有这两层已经算是可以用了，但如果要考虑到集成、客户端，就会感觉只有这些还是远远不够的，数据处理的灵活性还不够，客户端界面的展示与业务逻辑层耦合的太紧密。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">下面就要介绍到数据交换层、服务层、</span>DTO<span style="font-family: 宋体">层。我先从</span>DTO<span style="font-family: 宋体">层介绍吧，对于</span>DTO<span style="font-family: 宋体">层，有的朋友可能会感觉没有存在的必要，多了一层，也或许是这样。复杂度，工作量，对人的要求也高了，成本也高了，等等，都是要考虑的方面。</span></p>
<p style="text-indent: 27pt">DTO<span style="font-family: 宋体">层，也就是在服务器端和客户端进行沟通的，把业务逻辑层的数据传输到客户端，再把客户端的数据传输到服务器端，既然这样，那么在</span>DTO<span style="font-family: 宋体">与逻辑层数据</span>Data<span style="font-family: 宋体">之间就存在一个数据交换，数据交换在后面再介绍。</span>DTO<span style="font-family: 宋体">的数据要能够支持客户端的数据绑定，可能有的朋友会问，用业务层的数据不可以吗？答案是：如果是在局域网内可以，在广域网上不可以。业务层的数据存在很多数据是延迟加载过来的，在网络上传输数据通常是要求一次把比较多的数据传输过去，也就是通常的粗粒度设计，建立连接等开销太大、时延太大了。另外，客户端需要哪些数据，需要传输哪些数据，业务逻辑层不清楚，业务层只知道我能够提供哪些数据，</span>DTO<span style="font-family: 宋体">是知道我需要哪数据，两者所站的角度不同。业务逻辑层的数据相当于数据的提供者，</span>DTO<span style="font-family: 宋体">是数据的消费者。朋友们，再发挥一下想像，是不是可以这么理解，因为这个的存在，业务逻辑层设计的时候，可以不考虑界面是如何显示的，只要关心我的业务逻辑就可以，只要我能够提供这些数据就可以了，你是从一个对象里面得到的，还是从几个关联对象里面找到的，还是从别的系统里通过</span>WebService<span style="font-family: 宋体">得到的，业务逻辑层不关心，关心的是业务逻辑层可以提供这么多数据就够了，对于客户端，只关心有这么数据我可以处理，你是从哪里得到，客户端不关心，只关心我有这么多的数据可以处理。这样，就可以实现客户端与服务器端分离开发，设计的时候更重要的是针对中间的服务和要处理的数据设计，或许就是面向契约和服务设计吧。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">借用</span>SDO<span style="font-family: 宋体">的一张图。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体"><img height="273" alt="" src="http://www.cnblogs.com/images/cnblogs_com/dreamstec/SDO.JPG" width="692" border="0" /><br />
看了这张图，我估计很多人是非常熟悉的，如果从上面的观点和角度去考虑</span>DTO<span style="font-family: 宋体">的问题，那么这张图是自然而然的事情了，或许也是框架升级的一个必然趋势吧。这张图我是在</span>2007<span style="font-family: 宋体">年的</span>9<span style="font-family: 宋体">月份才看到的，但是时候完整的框架已经开始使用了，思想应该是相似的。</span></p>
<p style="text-indent: 27pt"><span style="font-family: 宋体">不过，这个</span>DTO/SDO<span style="font-family: 宋体">当时真的害的我很辛苦。</span></p>
<p style="text-indent: 27pt">DTO<span style="font-family: 宋体">要能够支持：数据绑定、历史记录、级联触发、合并集合、序列化与反序列化，要实现一个大的递归，从其中的任何一个对象开始，能够找出整个传递的所有数据。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt">1、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">数据的绑定支持。要实现</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">IEditableObject</span><span style="font-family: 宋体">接口，对于状态的变化要实现</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">INotifyPropertyChanged</span><span style="font-family: 宋体">接口，</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">INotifyPropertyChanged</span><span style="font-family: 宋体">接口也是微软在</span>2.0<span style="font-family: 宋体">里面新添加的，估计也是为了实现数据的双向绑定而专门添加的。实现了这两个接口，微软会自动调用的。对于容纳这些数据的集合也要支持绑定处理，则要</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">IBindingList</span><span style="font-family: 宋体">实现接口，这样才能够实现数据的触发，这样就要实现一个对象能够找到其所有的集合，一个集合要能够其所有的对象，这样一样，就必须实现从对象、集合、对象的递归，再深入一点，就实现了数据的级联触发，实现了双向数据触发、绑定。数据源的每个属性变更，要能够在界面上反映出来，绑定界面的改变，能够记录到后台的数据源，并且要能够支持回滚。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt">2、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">对于历史记录。当实现</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">IEditableObject</span><span style="font-family: 宋体">这个接口，则必然实现了历史记录，对于</span>SDO<span style="font-family: 宋体">来说，就是</span>ChangeSummary<span style="font-family: 宋体">。能够找到集合的所有更改的记录，包括删除的记录。对于单个对象而言是能够得到历史记录和当前数据，对于集合而言，则能够找出差异集，同时，集合也要具备集合回滚的功能。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt">3、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">级联触发，则是在实现数据绑定的基础上的，对于常见的主从结构，当从对象的一个属性改变了，要能够自动通知其所在的集合、集合再通知所在的对象数据改变了，如果是多层结构，则能够自动的从最底层开始一路通知到顶层。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt">4、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family: 宋体">合并集合、集合的处理。集合的处理与数据绑定是直接相当的。数据源找出差异集之后，要对差异集进行处理，处理完之后，要对原始集合进行更进一步的处理，要把两个集合进行合并处理，主要是为了同步引用。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt"><span style="font-size: 9pt; font-family: 新宋体">5、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">同时，另外要实现的就是</span>Data<span style="font-family: 宋体">与</span>SDO<span style="font-family: 宋体">之间的转换以及其他格式的数据与</span>SDO<span style="font-family: 宋体">、</span>Data<span style="font-family: 宋体">数据之间的数据转换，比如</span>Binary/Xml/Text/Key/<span style="font-family: 宋体">文件</span>/<span style="font-family: 宋体">等，最基本的是</span>SDO<span style="font-family: 宋体">与</span>Data<span style="font-family: 宋体">之间的转换，这些转换根据需要，有时候是单向的，有时候是双向的，根据业务需求而定。</span></p>
<p style="margin-left: 72.75pt; text-indent: -45.75pt; tab-stops: list 72.75pt"><span style="font-size: 9pt; font-family: 新宋体">6、<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体">序列化与反序列化，主要是涉及到</span>Binary<span style="font-family: 宋体">和</span>XML<span style="font-family: 宋体">序列化。对于</span>Binary<span style="font-family: 宋体">序列化，倒还是相对好处理点，对</span><span style="font-size: 9pt; color: #2b91af; font-family: 新宋体">INotifyPropertyChanged</span><span style="font-family: 宋体">的处理和</span><span style="font-size: 9pt; font-family: 新宋体">ListChanged</span><span style="font-family: 宋体">的处理要多花点心思就可以了。</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体"></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"><img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;[OnDeserialized]<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;OnDeserialized(StreamingContext&nbsp;context)<br />
<img id="Codehighlighter1_88_484_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_88_484_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_88_484_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_88_484_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_88_484_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_88_484_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_88_484_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_88_484_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_88_484_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_88_484_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IList</span><span style="color: #000000">&lt;</span><span style="color: #000000">T</span><span style="color: #000000">&gt;</span><span style="color: #000000">&nbsp;list&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">base</span><span style="color: #000000">.Items;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #800080">0</span><span style="color: #000000">;&nbsp;i&nbsp;</span><span style="color: #000000">&lt;</span><span style="color: #000000">&nbsp;list.Count;&nbsp;i</span><span style="color: #000000">++</span><span style="color: #000000">)<br />
<img id="Codehighlighter1_191_300_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_191_300_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_191_300_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_191_300_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_191_300_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_191_300_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_191_300_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_191_300_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_191_300_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_191_300_Open_Text"><span style="color: #000000">{<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;t&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;list[i];<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.Attach(</span><span style="color: #0000ff">this</span><span style="color: #000000">);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetItem(i,&nbsp;t);<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OnListChanged(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;ListChangedEventArgs(ListChangedType.Reset,&nbsp;</span><span style="color: #000000">-</span><span style="color: #800080">1</span><span style="color: #000000">));<br />
<img id="Codehighlighter1_460_480_Open_Image" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_460_480_Open_Text').style.display='none'; document.getElementById('Codehighlighter1_460_480_Closed_Image').style.display='inline'; document.getElementById('Codehighlighter1_460_480_Closed_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_460_480_Closed_Image" style="display: none" onclick="this.style.display='none'; document.getElementById('Codehighlighter1_460_480_Closed_Text').style.display='none'; document.getElementById('Codehighlighter1_460_480_Open_Image').style.display='inline'; document.getElementById('Codehighlighter1_460_480_Open_Text').style.display='inline';" alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ListChanged&nbsp;</span><span style="color: #000000">+=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">delegate</span><span style="color: #000000">(</span><span style="color: #0000ff">object</span><span style="color: #000000">&nbsp;sender,&nbsp;ListChangedEventArgs&nbsp;e)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span id="Codehighlighter1_460_480_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.cnblogs.com/Images/dot.gif" /></span><span id="Codehighlighter1_460_480_Open_Text"><span style="color: #000000">{&nbsp;OnDataChanged();&nbsp;}</span></span><span style="color: #000000">;<br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000"><br />
<img alt="" src="http://www.cnblogs.com/images/OutliningIndicators/None.gif" align="top" /></span></div>
<p style="margin-left: 63pt; text-indent: 21pt"><br />
在反序列化时要重建绑定，并且重新关联事件触发链。因为是不能进行序列化的，我的处理是在此时行了一个投机取巧，请朋友们能给点建议。当然，这只是针对</span>Binary<span style="font-family: 宋体">反序列化时有效了。</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">对于</span>XML<span style="font-family: 宋体">的序列化，遇到的问题还要大一些，因为</span>Binary<span style="font-family: 宋体">序列化，是对</span>Field<span style="font-family: 宋体">进行的，不会影响到事件的触发，也就不会影响到状态的改变，再者也不会引起递归调用了。但是对于微软提供的</span>XML<span style="font-family: 宋体">序列化，在此处的应用不能直接的用了，因为</span>XML<span style="font-family: 宋体">是对属性的处理，首先，会引起递归调用，其次，事件的触发会引起状态的改变，要对数据进行</span>XML<span style="font-family: 宋体">序列化与反序列化，则必须要打破递归调用和取消事件的触发，当然还要提供一些对于</span>XML<span style="font-family: 宋体">处理的常用函数了。通常是要实现自定义的对象图序列化反序化，在中间打断递归，对于状态的触发，则要在对象的底层加一特殊处理，阻止事件的触发。不过对于</span>XML<span style="font-family: 宋体">序列化反序列化，我还没有实现，上面的只是个思路，不一定正确。主要是因为现在的远程数据走的都是压缩的二进制，当然用的是</span>Binary<span style="font-family: 宋体">序列化，要做的是对</span>Binary<span style="font-family: 宋体">序列化进行优化。等</span>BS<span style="font-family: 宋体">结构提上日程的时候，再对这方面进行处理，会提供一组</span>JS<span style="font-family: 宋体">的函数，用于处理绑定、触发的，如果实现的话，则</span>BS<span style="font-family: 宋体">的界面也可以实现绑定处理了，只是这是后话了，至少要半年之后。</span></p>
<p style="margin-left: 63pt; text-indent: 21pt">DTO<span style="font-family: 宋体">方面，详细的可以参考</span>Java<span style="font-family: 宋体">阵营的</span>SDO<span style="font-family: 宋体">，再加上俺们阵营的数据绑定，综合起来，应该差不多了。</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">我的这个</span>DTO/SDO<span style="font-family: 宋体">的实现，已经在两个项目里面已经得到了应用，感觉是大大降低了客户端的代码量、难度、出错概率，配合代码工具，客户端的工作量是成倍的降低了。特别是出错概率，原来的项目，客户端的一个界面通常要调试很多次，而且调试过有不少地方还会出错，现在这方面已经算是非常友好了。在新的项目里面，还升级了的客户端框架，加入了变更通知，就是当关闭窗体的时候，后台判断数据是否改变，给出提示，这个功能是在客户端框架里提供的，编码的时候不会体现出来。这些在后面会慢慢的介绍的。</span></p>
<p style="margin-left: 63pt; text-indent: 21pt"><span style="font-family: 宋体">又写了这么多，希望大家能够共同讨论一下，给俺点建议呀</span>&#8230;</p>
 <img src ="http://www.cnblogs.com/dreamstec/aggbug/1066242.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43620/" target="_blank">[新闻]Google拟年底前关闭"lively" 因不敌"第二人生"</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>业务层框架介绍</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/07/1065712.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Thu, 07 Feb 2008 07:20:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/07/1065712.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1065712.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/07/1065712.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1065712.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1065712.html</trackback:ping><description><![CDATA[摘要:  昨天介绍了ORM部分，由于Linq的用词不当，可能引起了部分人的误解，在些道歉。这里所说的Linq 仅仅只是Linq To Sql，切记切记。只是针对ORM处理部分。 在开始介绍业务层之前，再重提一下旧事吧。我的ORM是在2005年初开始设计的，在8月份，正式在项目里面开始使用，那时候Vs2005还在Beta1，一段时间之后才发布Beta2，当时还是冒了很大的风险的。因为项目启动的比较早，当时，&nbsp;&nbsp;<a href='http://www.cnblogs.com/dreamstec/archive/2008/02/07/1065712.html'>阅读全文</a><img src ="http://www.cnblogs.com/dreamstec/aggbug/1065712.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43619/" target="_blank">[新闻]微软证实已雇佣前雅虎搜索官员Suchter</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>关于Linq To SQL和自己的ORM的一点思考</title><link>http://www.cnblogs.com/dreamstec/archive/2008/02/06/1065343.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Wed, 06 Feb 2008 07:25:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2008/02/06/1065343.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/1065343.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2008/02/06/1065343.html#Feedback</comments><slash:comments>51</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/1065343.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/1065343.html</trackback:ping><description><![CDATA[摘要: 昨天收到帖子一位朋友的回复，建议我把框架的ORM改成 DotNet 3.5的Linq，其实这曾经也是我心中的迷惑。有N个用Linq的理由，也有N个不用Linq的理由。在完善框架的时候，电信的一位技术总监跟我说：我不建议你做框架，那是微软等大公司的事，我们主要是用框架，你现在写ORM，现在的DotNet3.5　已经处于Alpha测试阶段了，你的ORM还有多大的用处。我当时一下子迷惘了，赶快找资料，从&nbsp;&nbsp;<a href='http://www.cnblogs.com/dreamstec/archive/2008/02/06/1065343.html'>阅读全文</a><img src ="http://www.cnblogs.com/dreamstec/aggbug/1065343.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43615/" target="_blank">[新闻]百度称不会放弃“竞价排名” 两名曝光员工被辞</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>基于泛形、SOA设计思想的.net 框架 汇总（Demo代码下载)</title><link>http://www.cnblogs.com/dreamstec/archive/2007/12/12/991538.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Tue, 11 Dec 2007 16:18:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2007/12/12/991538.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/991538.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2007/12/12/991538.html#Feedback</comments><slash:comments>19</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/991538.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/991538.html</trackback:ping><description><![CDATA[辛苦大家了，把Demo的代码全部发上来。<br />
<br />
本来想多写几句的，太晚了，明天还要去淞江，要早些休息了。在线的朋友也早些休息。<a href="http://www.cnblogs.com/Files/dreamstec/怡景.rar"><br />
<br />
http://www.cnblogs.com/Files/dreamstec/怡景.rar</a> <br />
<br />
再把其他的Dll加上吧。<br />
<br />
<a href="/Files/dreamstec/Tools.rar">还缺少的几个Dll，在此补上</a> <br />
<br />
希望大家能多提宝贵意见。
<img src ="http://www.cnblogs.com/dreamstec/aggbug/991538.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43612/" target="_blank">[新闻]IBM联合顶尖大学研发认知计算 未来模拟大脑</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>完整的基于泛形、SOA设计思想的.net 框架　CS客户端(七）之三，这个生成的代码改动最小，只删除了一个控件，改变了一下文本框的位置与大小。</title><link>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991474.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Tue, 11 Dec 2007 15:18:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991474.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/991474.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991474.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/991474.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/991474.html</trackback:ping><description><![CDATA[摘要: namespaceUnie2e.Yuking.Forms{usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Drawing;usingSystem.Windows&nbsp;&nbsp;<a href='http://www.cnblogs.com/dreamstec/archive/2007/12/11/991474.html'>阅读全文</a><img src ="http://www.cnblogs.com/dreamstec/aggbug/991474.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43611/" target="_blank">[新闻].NET Framework 3.5 SP1完整版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>完整的基于泛形、SOA设计思想的.net 框架　CS外观层（七）之二</title><link>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991469.html</link><dc:creator>光影传说</dc:creator><author>光影传说</author><pubDate>Tue, 11 Dec 2007 15:13:00 GMT</pubDate><guid>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991469.html</guid><wfw:comment>http://www.cnblogs.com/dreamstec/comments/991469.html</wfw:comment><comments>http://www.cnblogs.com/dreamstec/archive/2007/12/11/991469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/dreamstec/comments/commentRss/991469.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/dreamstec/services/trackbacks/991469.html</trackback:ping><description><![CDATA[摘要: namespaceUnie2e.Yuking.Forms{usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Drawing;usingSystem.Windows.Forms;usingUnie2e.Common.C&nbsp;&nbsp;<a href='http://www.cnblogs.com/dreamstec/archive/2007/12/11/991469.html'>阅读全文</a><img src ="http://www.cnblogs.com/dreamstec/aggbug/991469.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/43611/" target="_blank">[新闻].NET Framework 3.5 SP1完整版发布</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item></channel></rss>