<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_自由飞</title><subtitle type="text"/><id>http://feed.cnblogs.com/blog/u/53125/rss</id><updated>2012-04-02T13:49:59Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/53125/rss"/><entry><id>http://www.cnblogs.com/freeflying/archive/2012/04/02/2430497.html</id><title type="text">架构之路--实战项目记录（二） 忘记数据库 开始抽象</title><summary type="text">对我而言，认识BLL层的作用，或者领域模型驱动的含义，最大的干扰来自数据库。我们很清楚的知道UI层的含义，也知道数据层是做什么的。但对于一个简单的（甚至是相当复杂的）系统而言，实在不知道除了对数据库进行增删改查以外，还能做些什么？发布一篇博客，不就是在数据库里插入一条记录么？点击一下推荐，不就是在数据库里做一个update么？为了避免数据库的干扰，这里，我们设定：不使用关系数据库做存储！请大家牢记，为了更清晰，更深刻的认识到这一点，我们再次明确，我们将使用最流行的NoSQL技术。牛叉吧！兴奋吧？打满了鸡血吧！好的，设计的任务交给你了，小李同学。接下来，你怎么办？哎呀，我对NoSQL还不熟呀（不</summary><published>2012-04-02T13:46:00Z</published><updated>2012-04-02T13:46:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2012/04/02/2430497.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2012/04/02/2430497.html"/><content type="html">&lt;div&gt;对我而言，认识BLL层的作用，或者领域模型驱动的含义，最大的干扰来自数据库。&lt;br /&gt;&lt;br /&gt;我们很清楚的知道UI层的含义，也知道数据层是做什么的。但对于一个简单的（甚至是相当复杂的）系统而言，实在不知道除了对数据库进行增删改查以外，还能做些什么？发布一篇博客，&lt;br /&gt;&lt;br /&gt;不就是在数据库里插入一条记录么？点击一下推荐，不就是在数据库里做一个update么？&lt;br /&gt;&lt;br /&gt;为了避免数据库的干扰，这里，我们设定：不使用关系数据库做存储！请大家牢记，为了更清晰，更深刻的认识到这一点，我们再次明确，我们将使用最流行的NoSQL技术。牛叉吧！兴奋吧？&lt;br /&gt;&lt;br /&gt;打满了鸡血吧！&lt;br /&gt;&lt;br /&gt;好的，设计的任务交给你了，小李同学。&lt;br /&gt;&lt;br /&gt;接下来，你怎么办？哎呀，我对NoSQL还不熟呀（不熟？其实除了名字知道以外，其他什么都根本就不知道）。马上开始研究一下NoSQL，看看里面有没有什么库呀，表呀之类的，好像那里面&lt;br /&gt;&lt;br /&gt;用的是集合？ &lt;br /&gt;&lt;br /&gt;如果你这样走下去的话，就偏离了DDD的宗旨了（但也不能说你&amp;#8220;错&amp;#8221;了）。&lt;br /&gt;&lt;br /&gt;我是这样做的。&lt;br /&gt;&lt;br /&gt;问：这个系统要做什么？有哪些功能？&lt;br /&gt;&lt;br /&gt;答：发布博客，博客可以评论。可以提问题，回答问题。当然，做这些事，都得注册登录&amp;#8230;&amp;#8230;&lt;br /&gt;&lt;br /&gt;好，根据以上信息，我们可以抽象出这几个对象。&lt;br /&gt;&lt;br /&gt;这是一个良好的开端。再细致点，博客和问题，都必须有标题；而博客的评论和问题的答案，不需要标题；但不管是博客还是问题，评论还是回答，都会有一个作者，都要发布时都要记录下&lt;br /&gt;&lt;br /&gt;发布的时间，甚至发布者的IP（基于中国人都知道的原因）。博客和问题，还要记录下浏览量&amp;#8230;&amp;#8230;&lt;br /&gt;&lt;br /&gt;到这里，你是不是嗅到了一种什么味道？&amp;#8220;不管&amp;#8230;&amp;#8230;还是&amp;#8230;&amp;#8230;都&amp;#8230;&amp;#8230;&amp;#8221;，共同的东西！那么想到面向对象的三大特征，&amp;#8220;继承&amp;#8221;就呼之欲出了。所以我们通过抽象，得到了以下的对象。&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('05fb4f35-b583-41f3-942c-53c512418f4c')"&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" class="code_img_closed" id="code_img_closed_05fb4f35-b583-41f3-942c-53c512418f4c" alt="" /&gt;&lt;img src="http://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" class="code_img_opened" id="code_img_opened_05fb4f35-b583-41f3-942c-53c512418f4c" onclick="cnblogs_code_hide('05fb4f35-b583-41f3-942c-53c512418f4c',event)" style="display:none"&gt;&lt;div id="cnblogs_code_open_05fb4f35-b583-41f3-942c-53c512418f4c" class="cnblogs_code_hide"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Article&amp;nbsp;is&amp;nbsp;abstract,&amp;nbsp;means&amp;nbsp;it's&amp;nbsp;not&amp;nbsp;a&amp;nbsp;really&amp;nbsp;entity&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;abstract&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Article&amp;nbsp;:&amp;nbsp;Entity&amp;lt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Content&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;Body&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Log&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Need&amp;nbsp;not&amp;nbsp;set&amp;nbsp;manually&amp;nbsp;in&amp;nbsp;most&amp;nbsp;scenarios&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;PublishIP&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Need&amp;nbsp;not&amp;nbsp;set&amp;nbsp;manually&amp;nbsp;in&amp;nbsp;most&amp;nbsp;scenarios&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;DateTime?&amp;nbsp;LastModifiedTime&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Associates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;User&amp;nbsp;Author&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Public&amp;nbsp;Methods&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;Publish()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;set&amp;nbsp;some&amp;nbsp;default&amp;nbsp;value&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setCreatedTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setLastModifiedTime();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setPublishIP();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Protect&amp;nbsp;Methods&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;setLastModifiedTime()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(LastModifiedTime&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;LastModifiedTime&amp;nbsp;=&amp;nbsp;DateTime.Now;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;protected&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;setPublishIP()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;.IsNullOrEmpty(PublishIP))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PublishIP&amp;nbsp;=&amp;nbsp;HttpContext.Current.Request.UserHostAddress;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;represent&amp;nbsp;article&amp;nbsp;can&amp;nbsp;be&amp;nbsp;regarded&amp;nbsp;as&amp;nbsp;the&amp;nbsp;main&amp;nbsp;part&amp;nbsp;of&amp;nbsp;one&amp;nbsp;page,&amp;nbsp;e.g.&amp;nbsp;Blog&amp;nbsp;and&amp;nbsp;Question&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;abstract&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;MainArticle&amp;nbsp;:&amp;nbsp;Article&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Content&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;Title&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;Keywords&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Credit&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;ViewCount&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Log&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Methods&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;View()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ViewCount++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Blog&amp;nbsp;:&amp;nbsp;MainArticle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Associates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;CategoryOfBlog&amp;nbsp;Category&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Content&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;string&lt;/span&gt;&amp;nbsp;BlogAbstract&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;CommentOfBlog&amp;nbsp;:&amp;nbsp;AttachedArticle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Associates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;Blog&amp;nbsp;ReferredBlog&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;CommentOfBlog&amp;nbsp;ReferredComment&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;abstract&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;AttachedArticle&amp;nbsp;:&amp;nbsp;Article&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&amp;nbsp;Answer&amp;nbsp;:&amp;nbsp;AttachedArticle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Properties&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#region&lt;/span&gt;&amp;nbsp;Associates&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;Question&amp;nbsp;ReferredQuestion&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;virtual&lt;/span&gt;&amp;nbsp;Answer&amp;nbsp;ReferredAnswer&amp;nbsp;{&amp;nbsp;&lt;span style="color: #0000FF;"&gt;get&lt;/span&gt;;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;set&lt;/span&gt;;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;#endregion&lt;/span&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img alt="" src="http://images.cnblogs.com/cnblogs_com/freeflying/classes.jpg" height="415" width="930" /&gt;&lt;/div&gt;&lt;p&gt;这样做的好处，很明显的，就是减少了重复代码。&amp;#8220;&lt;a href="http://news.cnblogs.com/n/137092/"&gt;代码越少越好&lt;/a&gt;&amp;#8221;，我深以为然。当然，随之而来，还有其他好处，容后再表，呵呵。这里只说一句，良好的抽象是实现设计模式的基础。&lt;br /&gt;&lt;br /&gt;其实，只要有面向对象的思想，进行这样的抽象是相当容易的。但我们常常会被关系型数据库所干扰（尤其是有一定开发经验的程序员），而不敢进行这种&amp;#8220;大胆的&amp;#8221;抽象。因为即使将代码写到这里了，也得面临一个很现实的问题，接下来怎么办？最终我们怎么把这些对象持久化（保存到数据库或其他媒介中去）。这就是我们接下来要进行的工作了。&lt;br /&gt;&lt;br /&gt;最后，对那些还想着数据库的同学，再重复强调一点：这个项目，我们用NoSQL！哦，sorry，改主意了，大家反映NoSQL太难了，又说干脆用xml文件吧。&lt;br /&gt;&lt;br /&gt; &lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeflying/aggbug/2430497.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeflying/archive/2012/04/02/2430497.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2012/04/01/2428567.html</id><title type="text">架构之路--实战项目记录（一） 概述</title><summary type="text">我正在开发的系统是一个简单的“博客+论坛+SNS”系统。应该比较好理解吧，就“博客园+csdn+开心网”模式。具体的功能在需要用到的时候详细讲解即可。（一）架构选择Asp.net: WebForm vs MVC我最后选择的还是MVC。只能说是个人偏好，感觉WebForm：1、对最终生成的Html不好控制2、框架略显笨重（页面生命周期，Ajax封装等）另外，asp.net MVC是新生事物，也有一个学习的机会。本来还一直觉得MVC中&lt;%= %&gt;难看（受asp影响），但后来razor出来以后，就彻底放心了。分层：两层 vs 三层在这个项目开始之前，我对三层都有看法，和很多同学一样，不知</summary><published>2012-04-01T05:43:00Z</published><updated>2012-04-01T05:43:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428567.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428567.html"/><content type="html">&lt;div&gt;我正在开发的系统是一个简单的&amp;#8220;博客+论坛+SNS&amp;#8221;系统。应该比较好理解吧，就&amp;#8220;博客园+csdn+开心网&amp;#8221;模式。具体的功能在需要用到的时候详细讲解即可。&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;（一）架构选择&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Asp.net: WebForm vs MVC&lt;/strong&gt;&lt;/p&gt;我最后选择的还是MVC。只能说是个人偏好，感觉WebForm：&lt;br /&gt;1、对最终生成的Html不好控制&lt;br /&gt;2、框架略显笨重（页面生命周期，Ajax封装等）&lt;br /&gt;另外，asp.net MVC是新生事物，也有一个学习的机会。本来还一直觉得MVC中&amp;lt;%= %&amp;gt;难看（受asp影响），但后来razor出来以后，就彻底放心了。&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;分层：两层 vs 三层&lt;/strong&gt;&lt;/p&gt;在这个项目开始之前，我对三层都有看法，和很多同学一样，不知道BLL层干嘛用。而且当时：&lt;br /&gt;1、我不准备开发一个支持多数据库的通用系统&lt;br /&gt;2、想不到有什么复杂的业务逻辑，最复杂的逻辑可能就是分页和多条件查询了，这不是数据库的事？&lt;br /&gt;但是，我终于说服自己：不懂嘛，只有去做了，才能把他搞懂！&amp;#8220;绝知此事要躬行&amp;#8221;。&lt;/div&gt;&lt;p&gt;后来，慢慢的，我有了一些收获，转机，就从我开始学习ORM开始。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ORM：NHibernate vs Framework Entity&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我记得当时犹豫了很久，最终选择了NHibernate，理由：&lt;br /&gt;1、NHibernate开源，可以深入研究&lt;br /&gt;2、摆脱微软依赖，向更广阔的天地前进（这个想法也影响了我选择MVC，毕竟，不只有asp.net才有MVC，php和java都有）。这里多说一句，直到现在，我都还很庆幸我的这个决定。此后，一路走来，风光无限。&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;（二）方法论&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;DDD（领域模型驱动）&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;div&gt;首先，领域模型，就是以面向对象的方式，通过各种各样的对象，构建领域层（或者业务层）。&lt;/div&gt;而DDD，我简单的把他理解为，&lt;strong&gt;而且，将构建领域模型作为设计工作的第一步！&lt;/strong&gt;不管之后UI层怎么呈现，也不管以后数据怎么存储到数据库（持久化）。&lt;div&gt;如果这就是DDD，那我就采用了DDD了，呵呵。&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;TDD（测试驱动）&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于测试驱动（即使按最狭义的理解:unit test drive)，我想了很久，最后都还是放弃了。理由：&lt;br /&gt;1、我是一个人开发，所以无论写unit test还是写代码，思路都是一致的，我自己写的unit test，自己写的代码，不可能不通过；&lt;br /&gt;2、而且以后，代码发生了变动，测试代码也得跟着改（这和三层的弊端类似）；&lt;br /&gt;3、单元测试对于重构的帮助，我觉得不能抵消由此带来的&amp;#8220;麻烦&amp;#8221;。&lt;br /&gt;4、懒！呵呵，这可能是最大的原因了。&lt;br /&gt;&lt;br /&gt;但是，我认为，如果是团队开发，TDD能发挥很大的作用：&lt;br /&gt;1、方便沟通交流，澄清客户需求。IF...ELSE...ELSE...是最清晰、最精准的描述需求的逻辑和语言了。&lt;br /&gt;2、便于封装。比如BLL层的开发人员不必等UI层完成，即可利用单元测试开始编码、调试、验收等。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;概述，我想说的就这些，因为我想把重点放在具体问题的分析和解决上，概念上的东西，点到为止即可。欢迎各位同学留言！尤其是对TDD，我很想听听大家的意见，尤其是经过实践检验过的经验。先谢了，呵呵。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeflying/aggbug/2428567.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428567.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2012/04/01/2428511.html</id><title type="text">架构之路--实战项目记录</title><summary type="text">讲解架构一直是一个难题。但首先郑重声明，我说这句话的意思是：所以，我也很难找到资料用来学习架构。而并不是我很牛叉，准备怎么怎么，深入浅出的让各位同学茅塞顿开，瞬间光芒大作，醍醐灌顶之类的。但我选择了这样一个方式，用一个真实的项目来展示我关于架构的一些想法。只是想法，并不一定正确，所以希望能和各位一起交流、谈论甚至争论，有所提高。目录：架构之路--实战项目记录（一） 概述架构之路--实战项目记录（二） 忘记数据库 开始抽象</summary><published>2012-04-01T05:07:00Z</published><updated>2012-04-01T05:07:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428511.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428511.html"/><content type="html">&lt;p&gt; 讲解架构一直是一个难题。&lt;/p&gt;&lt;p&gt;但首先郑重声明，我说这句话的意思是：所以，我也很难找到资料用来学习架构。而并不是我很牛叉，准备怎么怎么，深入浅出的让各位同学茅塞顿开，瞬间光芒大作，醍醐灌顶之类的。&lt;/p&gt;&lt;p&gt;但我选择了这样一个方式，用一个真实的项目来展示我关于架构的一些想法。只是想法，并不一定正确，所以希望能和各位一起交流、谈论甚至争论，有所提高。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;目录：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;a id="cb_post_title_url" href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428567.html"&gt;架构之路--实战项目记录（一） 概述&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;div&gt;&lt;a id="homepage1_HomePageDays_DaysList_DayItem_0_DayList_0_TitleUrl_0" href="http://www.cnblogs.com/freeflying/archive/2012/04/02/2430497.html"&gt;架构之路--实战项目记录（二） 忘记数据库 开始抽象&lt;/a&gt;&lt;/div&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeflying/aggbug/2428511.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeflying/archive/2012/04/01/2428511.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2011/07/31/2122359.html</id><title type="text">我的英语听力</title><summary type="text">磨蹭了好久，还是写一写吧，虽然我的英语水平目前也不是很好。英语对于程序员来说，无论是从待遇，还是从技术发展的角度来看，都是一个必须得过的槛。我重新开始拾起英语，就是进入程序员这一行之后，那时，我已经大学毕业5年多了。我在大学里过了6级，但和很多同龄人一样，靠的是阅读理解挣分，听力基本靠“蒙”，也就是所谓的哑巴英语，聋子英语。毕业后打算出国留学，要考雅思，所以曾经下狠“心”（但不是狠功夫，呵呵），猛补听力和口语，但效果都不好。感觉真正有所突破，还是这几年。好了，直接所我的一些看法吧，更希望大家能给我也支支招，大家互相帮助，共同进步。:-)第一、听说和读写哪个更重要。我记得我们大学的时候（1998</summary><published>2011-07-30T16:50:00Z</published><updated>2011-07-30T16:50:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2011/07/31/2122359.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2011/07/31/2122359.html"/><content type="html">&lt;div&gt;磨蹭了好久，还是写一写吧，虽然我的英语水平目前也不是很好。&lt;br /&gt;&lt;br /&gt;英语对于程序员来说，无论是从待遇，还是从技术发展的角度来看，都是一个必须得过的槛。我重新开始拾起英语，就是进入程序员这一行之后，那时，我已经大学毕业5年多了。&lt;br /&gt;&lt;br /&gt;我在大学里过了6级，但和很多同龄人一样，靠的是阅读理解挣分，听力基本靠&amp;#8220;蒙&amp;#8221;，也就是所谓的哑巴英语，聋子英语。毕业后打算出国留学，要考雅思，所以曾经下狠&amp;#8220;心&amp;#8221;（但不是狠功夫，呵呵），猛补听力和口语，但效果都不好。感觉真正有所突破，还是这几年。&lt;br /&gt;&lt;br /&gt;好了，直接所我的一些看法吧，更希望大家能给我也支支招，大家互相帮助，共同进步。:-)&lt;br /&gt;&lt;br /&gt;第一、听说和读写哪个更重要。我记得我们大学的时候（1998-2002年），对传统英语教育骂声一片，&amp;#8220;学了这么多年的英语，碰到一个老外，听不懂，说不出，失败呀！&amp;#8221;。我也是其中振臂疾呼的愤青之一，呵呵。不过，现在看来，其实读写比听说用的地方多得多，书籍、文档、Email和IM，即使是telephone conference，也是有文本说明的。毕竟，英语，对我们而言，是一门&amp;#8220;外语&amp;#8221;。那我们还需不需要练听力和口语呢？我个人是这样认为的。这是一种理想，一种追求，是我长久以来的梦想：和一个来自遥远异国他乡的人，面对面的交流，悦耳的语音，像流畅的旋律&amp;#8230;&amp;#8230;。当然，除此之外，如果听和说，也能促进我们的读和写；而且，让我们能谋得一个更好的职位，毕竟，口语好的求职者，还是要少很多。&lt;br /&gt;&lt;br /&gt;第二、提高英语听力的方法。读是写的基础，听是说的基础。读写我就不浪费笔墨了，而听力的提高，是我们很多人长期的噩梦。我尝试过很多方法：传统的精听泛听、逆向法、千万别学英语和天涯漏屋的&amp;#8220;悉得&amp;#8221;法（姑且如是称之吧）；试过好几种资料：大学教材，中级/高级听力，疯狂英语，电影和VOA&amp;#8230;&amp;#8230;。就这些说说我的看法吧。&lt;br /&gt;&lt;br /&gt;1、泛听的前提是精听。在这上面，我吃过大亏（可能也因人而异）。不知道你们看到过这种说法没有，&amp;#8220;没事我就把耳机带着听，走路也听，吃饭也听，睡觉也听（睡前的效果还最好），开始什么也听不懂。但我还是接着听，就这样听呀听。结果有一天，忽然，我就发现，我居然发现，英语想流水一样飘过，我居然都能听懂啦！奇迹呀！&amp;#8221;真的是奇迹，但这种奇迹从来没发生在我身上！？园子里有没有同学见证过这种奇迹？我从来没有。我支持逆向法，天涯漏屋也很明确的说了，&amp;#8220;听不懂的声音就是噪音，就是无效输入，无效输入是没有任何作用的。&amp;#8221;但我很奇怪，《千万别学英语》居然说，一个不懂任何日语的人，就收听日语电视节目，这样看呀看呀看呀看，看了几个月，就&amp;#8220;自然而然&amp;#8221;的懂日语了？而我当年，居然就信了！&lt;/div&gt;&lt;div&gt;&lt;br /&gt;泛听是最舒服的，舒服得完全可以做催眠特效药，是吧？多少个夜晚，我们在英语温柔的喃喃细雨中入眠？但就我的经验来看，他的作用是很微小的，尤其是当我们收听的是我们几乎无法理解的节目，如VOA Standard（甚至VOA Special，哪怕全神贯注，我们有多少人能一篇听懂100%？更何况是在走路的时候，吃饭的时候，睡觉的时候？）而且，这样泛听，还很有可能，让我们习惯于注意力涣散，抱着有一天&amp;#8220;顿悟&amp;#8221;的空想，而一旦希望破灭，莫名的烦躁沮丧&amp;#8230;&amp;#8230;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;对于泛听，我的理解：1、泛听意味着&amp;#8220;大量&amp;#8221;的听，要求我们听的量大；2、泛听训练我们从总体上把握材料的能力；所以，3、泛听绝对不是随随便便的&amp;#8220;乱听&amp;#8221;。所以，无论如何，泛听的结果必须是，最后，你是听懂了材料的，不要求100%，但80%，至少60%要吧？为了达到这种效果，很多老师前辈，都是说，泛听的难度不能太大，一定要大概能听懂的。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;但我以前的水平，VOA Special都听不懂（一篇，那时只能收广播），还到哪里去找更简单的听力材料？但现在，让我泛听，随便听点VOA，不管Standard还是Specail，我就比较舒服了，能听懂，不会打瞌睡，而且还能学到点东西，一种表达法，听不懂的词，查查词典，也能有个结果，这就很爽了。但走到这一步，一定是精听的基础。逆向法绝对是精听的典型，强调&amp;#8220;听写&amp;#8221;，大家可以仔细看看。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;这一条，概括起来说，就是，只有当你听力达到一定水平之后，泛听才能起作用。起步阶段，精听是绝对的基础。&lt;br /&gt;&lt;br /&gt;2、首先听声音。这是《千万别学英语》给我最大的帮助（另外一个是使用英英词典）。如何有效的去精听？一句话过去了，我翻来覆去的听，就是听不清，听不懂，怎么办？这里，要区分&amp;#8220;听不懂&amp;#8221;和&amp;#8220;听不清&amp;#8221;，&amp;#8220;听不懂&amp;#8221;是可以理解的，但&amp;#8220;听不清&amp;#8221;呢？&amp;#8220;听不懂&amp;#8221;，指的是意思；&amp;#8220;听不清&amp;#8221;，指的是声音。这一句话的&amp;#8220;声音&amp;#8221;，你总该听&amp;#8220;到&amp;#8221;了的吧，那就把你听&amp;#8220;到&amp;#8221;的记下来。比如，&amp;#8220;When it's very Dav mess&amp;#8221;，&amp;#8220;Dav mess&amp;#8221;什么东西，谁也不知道，但这个声音你可以先记下来，然后和原文对比，你就会回发现问题，可能是出现了弱读、连读；或者是你没有辨音正确，他实际上是&amp;nbsp; Defence，那你就知道了，你区分不了f和v，m和n等&amp;#8230;&amp;#8230;然后下意识的训练改正。&lt;br /&gt;&amp;nbsp;&lt;br /&gt;3、查词典和跟读。你听到的，不一定是正确的，比如，你认为你听到的，是sink，但实际上，是think。凡是碰到这种情况，不要轻易放过。这就算逆向法不看脚本查词典的好处。查词典，一定程度上，能逼着你努力的去听清楚，听正确。如果你这时候，看了一下脚本，你就很可能就放过了这个&amp;#8220;辨音&amp;#8221;点。随着你英语综合能力的提高，你可能就能根据上下文，自然的得出这里该是sink还是think的结论，但实际上，你还是不能区分th和s发音的区别，这就会导致你的发音出现问题。就像我是南方人，现在拼音打字都得开模糊音，分不清zh和z，这不影响我听懂普通话（尤其是在句子里），但会影响我的普通话发音。&lt;br /&gt;你发不出某个音，一定是你听不&amp;#8220;到&amp;#8221;或者分辨不出来这个音。很多人发不准v和w，th和s，其实就算他们分辨不出这些音的区别（你们可以做个试验看看）。一个有助于解决这个问题的方法，就是跟读对比。录下你的发音，和原声对比，很多时候，是能听出差别来的。&lt;br /&gt;&lt;br /&gt;4、不用强求英语思维。我们那时候，&amp;#8220;英语思维&amp;#8221;，是一个很时髦的说法。说不出，听不懂的原因，就是你不具有&amp;#8220;英语思维&amp;#8221;，你听到的每个单词，都要把它转换成汉语，然后再组合成句子，要花多长时间呀，等你完成了这些，人家都不知道说到哪里去了&amp;#8230;&amp;#8230;所以&amp;#8220;不要在头脑里翻译，直接用英语思维&amp;#8221;。我觉得，听不懂的原因是找到了的；但解决的方法&amp;#8220;不要在头脑里翻译，直接用英语思维&amp;#8221;，这个解决问题的方法，值得商榷。&lt;br /&gt;我很长一段时间都在这样尝试，但效果很差。第一，不翻译，怎么能理解？有些简单的，可能可以，Good Morning， Execuse me。但一旦复杂了，&amp;#8220;The President's announcement was not from page news in most British newspapers, but one that did cover the decision call it a gamble and retreat(d)&amp;#8221;，怎么办？怎样又才可以算&amp;#8220;英语思维&amp;#8221;？怎样才能达到&amp;#8220;英语思维&amp;#8221;？&amp;#8220;不翻译&amp;#8221;就可以了么？我觉得不是，这是一个&amp;#8220;熟能生巧&amp;#8221;的过程，在听的过程中，我们其实是无法&amp;#8220;完全翻译&amp;#8221;的，为了跟上说话者的节奏，我们自然的力图抓住说话者的意图，而忽略翻译的形式。如果你这做过翻译，你就会有这样的体会，这句话，我懂了他的意思；但让我把他翻译出来，还真得再仔细想想。但是我对这句话的理解，一定是汉语形式的，比如&amp;#8220;总统&amp;#8221;，&amp;#8220;声明&amp;#8221;，&amp;#8220;报纸&amp;#8221;等等，除非这里压根就没有，或者我根本就不知道&amp;#8220;总统&amp;#8221;这个汉语单词。这在我们的计算机专业里，会出现这种情况，比如，我们常说，team leader，谁都知道这个词的意思，但要把他翻译成汉语，可能大家都得想一想。&lt;br /&gt;对于一个土生土长的中国人，完全的英语思维，没有及其特殊的环境（比如国外生活5年10年），其实是无法形成的。汉语已经烙入我们的灵魂，但这是我们的骄傲，汉语，美丽如斯！&lt;br /&gt;相信我，你听不懂，只是你不够熟练。并不是翻译得不够熟练，而是理解得不够熟练。如果要做到熟练的翻译，在理解的基础上，还有很长很长的路要走，这条路，更陡峭，更险峻，更辉煌。&lt;br /&gt;&lt;br /&gt;第三，平和的心态。&lt;br /&gt;&lt;br /&gt;一上大学，我的英语学习目标就是，风度翩翩的和老外侃大山，没事就弄两部原声英语大片看看，像听新闻联播一样听VOA&amp;#8230;&amp;#8230;然后，我干过很多傻事，直接买了一本《红与黑》的原著抱着啃，准备一学期啃完它；大一寒假我就买了《乱世佳人》的DVD，计划一个寒假把它给&amp;#8220;搞定&amp;#8221;；抱着单词书（听说还有被词典的，那个佩服呀）一天几百个的狂背，还要按遗忘曲线复习；&amp;#8230;&amp;#8230;唯一没干过的就是跑到公交车上吼&amp;#8220;疯狂英语&amp;#8221;，可能那时候我已经感觉靠&amp;#8220;疯狂&amp;#8221;学英语不靠谱。&lt;br /&gt;&lt;br /&gt;真正促使我反思的，是我老婆，她学日语的。绝对没有任何语言天赋：语文烂得一塌糊涂（可能我要去太高，呵呵），唱歌跑调跑到天上去了。更没有语言环境，日语绝对是上大学才开始认第一个字。没有任何特殊的学习方法和学习心得，完全是跟着课堂走，磁带是教材的配套，听广播是上到日语新闻这门课，老师要求听就听听，之后就没见她听过。一定要说一个什么方法，我说是，&amp;#8220;胆小法&amp;#8221;。大四了，一节课都还不敢翘，课前认真复习，课后按时完成作业（但仅限于能交差，因为他们老师要&amp;#8220;抽查&amp;#8221;）。说白了，整个大学四年，就像读了&amp;#8220;轻松版&amp;#8221;的四年高中。结果日语一级考试成绩，分数那个高，全西南地区第7名。我当时都傻眼了，现实版的郭靖呀。&lt;br /&gt;但是她毕业后做口译，还是不行，被带了3、5个月，才慢慢上手的。&lt;br /&gt;但即使现在，她完全胜任她的工作（日常的接待、洽谈、陪同翻译等），但看日语电影，听日语新闻，不看字幕，还是不行（至少不能一遍100%的听懂）&lt;br /&gt;&lt;br /&gt;决心做程序员开始，我也同时重新拾起了我的英语。不过，这一次，没有什么宏伟的目标，没有什么眼花缭乱的学习方法，就早晚上下班（共2小时）听听VOA吧。&lt;br /&gt;老老实实的从special开始，听了大概半年；然后开始standard，一直到现在。&lt;br /&gt;先整段新闻的听几遍；然后按句子或意群，一个单词一个单词的抠；然后对照脚本，找出没有听正确的地方，最后还要再听几遍。这样下来，一段3分半钟左右的新闻，最开始1-2天能听完一篇，现在慢慢的一天能听3-4篇。&lt;br /&gt;开始是很多单词看到就认识但就没听出来，这一般都是因为这个单词自己本来就不知道该怎么发音，或者自己的发音是错的；现在基本上听不懂的单词，自己也看不懂，就不认识，偶尔运气好，能根据发音查到单词，难的还是一些虚词，像区分and和in之类的，或者是几个虚词连在一起，as of it 之类的。&lt;br /&gt;不给自己压力，必须每天听完多少多少，如果哪一天有点厌烦了，我会停下来，在地铁里傻傻的发愣，但我不会一连好几天都不听。其实地铁里也没什么事做，而且有点好奇，昨天下到手机里的新闻里究竟说的是什么呀？到后来，听英语成了一种习惯，不听就不自在。&lt;br /&gt;我曾经试过每隔多久&amp;#8220;复习&amp;#8221;一下以前听过的东西，因为我发现，过一段时间再听以前的材料，当时没听懂的，哪怕看了脚本，现在还是很可能听不懂（呵呵，比较奇怪吧？）但后来，我觉得听已经知道了意思的新闻真的没什么意思，为了不破坏我愉快的情绪，算了，过去的就过去了&amp;#8230;&amp;#8230;&lt;br /&gt;&lt;br /&gt;如果只和昨天比，前天比，上一周比，我完全不能感觉到我的进步，甚至有时觉得会有退步（因为突然发现，这一段新闻，我居然完全不知所云；而昨天那篇新闻，我两篇就听懂了大意呀？！）。但回头看看，收获是沉甸甸的。&lt;br /&gt;&lt;br /&gt;我仍然不能像听新闻联播一样听VOA，津津有味的欣赏没有字幕的英语大片。但我完全能够在一个纯英文的环境中，胜任我的工作，完成老外组织的纯英语的培训，参加各种全球客户的电话会议，中午吃饭时和老外你一言我一句的瞎掰，结结巴巴，但仍然谈笑风生。&lt;br /&gt;&lt;br /&gt;我曾经复习4个月考过了司法资格考试，3个月考过软件设计师，但对于英语，我终于明白，一步一个脚印，持之以恒的坚持，是通向成功的唯一捷径。所以，在收获英语的同时，也收获了一份淡定从容。&lt;/div&gt;&lt;img src="http://www.cnblogs.com/freeflying/aggbug/2122359.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeflying/archive/2011/07/31/2122359.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2011/01/23/1942359.html</id><title type="text">Orchard源代码研究</title><summary type="text">Orchard是一个基于.NET平台的开源CMS（Comment Management System）。园子里周金根同学有过介绍。决定研究Orchard主要基于以下几个原因：1. 技术很新。最近发布的版本居然都使用的是Asp.net MVC Razor!2. 大量使用的开源技术，如NHibernate, Autofac等。3. 架构很新颖（至少对于我来说），大量使用的IoC之类的让我彻底的云里雾里的了。4. 活跃的社区支持，练习英文的好机会。如果你和我一样，一起来看一看吧。再次呼吁，在博客园开一个Orchard栏目。支持的顶起呀！官方网站：http://www.orchardproject.n</summary><published>2011-01-23T02:59:00Z</published><updated>2011-01-23T02:59:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2011/01/23/1942359.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2011/01/23/1942359.html"/><content type="html">&lt;p&gt;Orchard是一个基于.NET平台的开源CMS（Comment Management System）。园子里周金根同学有过&lt;a href="http://www.cnblogs.com/zhoujg/archive/2011/01/19/1939453.html"&gt;介绍。&lt;/a&gt;&lt;/p&gt;&lt;p&gt;决定研究Orchard主要基于以下几个原因：&lt;/p&gt;&lt;p&gt;1. 技术很新。最近发布的版本居然都使用的是Asp.net MVC Razor!&lt;br /&gt;2. 大量使用的开源技术，如NHibernate, Autofac等。&lt;br /&gt;3. 架构很新颖（至少对于我来说），大量使用的IoC之类的让我彻底的云里雾里的了。&lt;br /&gt;4. 活跃的社区支持，练习英文的好机会。&lt;br /&gt;&lt;br /&gt;如果你和我一样，一起来看一看吧。再次呼吁，在博客园开一个Orchard栏目。支持的顶起呀！&lt;br /&gt;&lt;br /&gt;官方网站：&lt;a href="http://www.orchardproject.net/"&gt;http://www.orchardproject.net/&lt;/a&gt;&lt;br /&gt;社区支持：&lt;a href="http://orchard.codeplex.com/discussions"&gt;http://orchard.codeplex.com/discussions&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/freeflying/aggbug/1942359.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/freeflying/archive/2011/01/23/1942359.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2010/03/12/1684762.html</id><title type="text">ASP.NET的SEO：SEO Hack --- Html注入和Nofollow</title><summary type="text">ASP.NET的SEO：目录黑帽（black hat）SEO主要是指采取“不怎么道德”（暂时就这么形容吧！）的方式进行搜索引擎优化。1. 注入攻击，包括Sql注入和Html注入。我经常能看到对Sql注入防范的谈论，但对于Html注入，很多人并没有引起足够的重视。为了展示Html注入的效果，我们模仿了一个常见的留言本功能。首先，在页面声明中添加两个属性设置EnableEven...</summary><published>2010-03-12T13:30:00Z</published><updated>2010-03-12T13:30:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2010/03/12/1684762.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2010/03/12/1684762.html"/><content type="text">ASP.NET的SEO：目录黑帽（black hat）SEO主要是指采取“不怎么道德”（暂时就这么形容吧！）的方式进行搜索引擎优化。1. 注入攻击，包括Sql注入和Html注入。我经常能看到对Sql注入防范的谈论，但对于Html注入，很多人并没有引起足够的重视。为了展示Html注入的效果，我们模仿了一个常见的留言本功能。首先，在页面声明中添加两个属性设置EnableEven...</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2010/03/02/1676728.html</id><title type="text">Reset按钮在回发之后就不起作用</title><summary type="text">今天突然发现Reset按钮在回发之后就不起作用了，清不掉TextBox里的值。 &lt;input type="reset" value="reset" /&gt;网上搜了一下，只有问题，没有答案。csdn上一个老帖子里说和ViewState之类的有关，把我还搞得晕乎乎的，想想reset按钮怎么也就是一个客户端的控件，和服务器端根本不搭界，怎么可能呢？ViewState怎么也得到了服务器端才开始解...</summary><published>2010-03-02T10:49:00Z</published><updated>2010-03-02T10:49:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2010/03/02/1676728.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2010/03/02/1676728.html"/><content type="text">今天突然发现Reset按钮在回发之后就不起作用了，清不掉TextBox里的值。 &lt;input type="reset" value="reset" /&gt;网上搜了一下，只有问题，没有答案。csdn上一个老帖子里说和ViewState之类的有关，把我还搞得晕乎乎的，想想reset按钮怎么也就是一个客户端的控件，和服务器端根本不搭界，怎么可能呢？ViewState怎么也得到了服务器端才开始解...</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2010/02/26/1674557.html</id><title type="text">ASP.NET的SEO：Linq to XML---网站地图和RSS Feed</title><summary type="text">本系列目录网站地图的作用是让搜索引擎尽快的，更多的收录网站的各个网页。 这里我们首先要明白一个基本的原理，搜索引擎的爬行方式。整个互联网就像一张纵横交错的“网”：网的各个节点就是各个网页，而各个网页之间通过url相互连接。蜘蛛可以从一个网页出发，通过该网页上的url，爬到另一个网页；再通过另一个网页上的url，再爬到更多的网页……，以此类推。但如果是...</summary><published>2010-02-26T13:15:00Z</published><updated>2010-02-26T13:15:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2010/02/26/1674557.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2010/02/26/1674557.html"/><content type="text">本系列目录网站地图的作用是让搜索引擎尽快的，更多的收录网站的各个网页。 这里我们首先要明白一个基本的原理，搜索引擎的爬行方式。整个互联网就像一张纵横交错的“网”：网的各个节点就是各个网页，而各个网页之间通过url相互连接。蜘蛛可以从一个网页出发，通过该网页上的url，爬到另一个网页；再通过另一个网页上的url，再爬到更多的网页……，以此类推。但如果是...</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2010/02/24/1672308.html</id><title type="text">ASP.NET的SEO：HTTP报头状态码---内容重定向</title><summary type="text">本系列目录我们经常说“404错误”，你知道他指的是什么意思么？404其实是Http报头所包含的一个“状态码”，表明该Http请求失败。那么除此之外，还有哪些常用的状态码呢？这些状态码和SEO又有什么关系呢？每次当用户代理（可以理解为就是IE和Firefox）向Web站点请求一个URL地址，服务器都会给予回复，回复内容包括两部分：HTTP报头，和被请求...</summary><published>2010-02-23T16:56:00Z</published><updated>2010-02-23T16:56:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2010/02/24/1672308.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2010/02/24/1672308.html"/><content type="text">本系列目录我们经常说“404错误”，你知道他指的是什么意思么？404其实是Http报头所包含的一个“状态码”，表明该Http请求失败。那么除此之外，还有哪些常用的状态码呢？这些状态码和SEO又有什么关系呢？每次当用户代理（可以理解为就是IE和Firefox）向Web站点请求一个URL地址，服务器都会给予回复，回复内容包括两部分：HTTP报头，和被请求...</content></entry><entry><id>http://www.cnblogs.com/freeflying/archive/2010/02/21/1670758.html</id><title type="text">ASP.NET的SEO：使用.ashx文件——排除重复内容</title><summary type="text">本系列目录 不同的链接指向的页面如果具有大量相同的内容，这种现象就会被称为“重复内容”，如果一个网站的重复内容很多，搜索引擎就会认为这个网站的价值不高。所以我们应尽量避免各种重复内容。动态网站的重复内容常常是由URL参数引起的，而URL重写会恶化这一现象（比较耐人寻味哟，呵呵）。因为如果使用的是原始的URL参数的话，搜索引擎可能会进行适当的判断，而得知重复内容是由URL参数...</summary><published>2010-02-21T14:22:00Z</published><updated>2010-02-21T14:22:00Z</updated><author><name>自由飞</name><uri>http://www.cnblogs.com/freeflying/</uri></author><link rel="alternate" href="http://www.cnblogs.com/freeflying/archive/2010/02/21/1670758.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/freeflying/archive/2010/02/21/1670758.html"/><content type="text">本系列目录 不同的链接指向的页面如果具有大量相同的内容，这种现象就会被称为“重复内容”，如果一个网站的重复内容很多，搜索引擎就会认为这个网站的价值不高。所以我们应尽量避免各种重复内容。动态网站的重复内容常常是由URL参数引起的，而URL重写会恶化这一现象（比较耐人寻味哟，呵呵）。因为如果使用的是原始的URL参数的话，搜索引擎可能会进行适当的判断，而得知重复内容是由URL参数...</content></entry></feed>
