<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_首页</title><subtitle type="text">代码改变世界</subtitle><id>http://feed.cnblogs.com/blog/sitehome/rss</id><updated>2012-05-28T07:58:41Z</updated><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/sitehome/rss"/><entry><id>http://www.cnblogs.com/wcyao/archive/2012/05/28/2521348.html</id><title type="text">[小把戏] 之IBatis.Net系统分页问题的解决</title><summary type="text">本文想解决园子里大家都关心的Ibatis.Net分页的实现问题。其实我也找了Ibatis.Net分页的解决方案，园子里有一些，奈何没有发现我想要的方式，大都的策略是调用两次SQL Statement,第一次，根据条件查询总记录条数，第二次，根据条件查询从第N行到M行的数据集合，不是这种不能满足条件，恰恰相反，这种写法，完全可以满足现有项目的需求，也很具备SQL调优空间，但有个的弊端，是通过一个查询写几遍。很难复用。感觉很是别扭，我看过在查询较多的系统里，到处充斥这分页的SQL语句，另外一点，本来我们码农们只要关心实现获取业务数据就行了，每次在实现功能的基础上，还要再加上分页的SQL语句，使..</summary><published>2012-05-28T07:52:00Z</published><updated>2012-05-28T07:52:00Z</updated><author><name>围成</name><uri>http://www.cnblogs.com/wcyao/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wcyao/archive/2012/05/28/2521348.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wcyao/archive/2012/05/28/2521348.html"/><content type="html">&lt;p&gt;本文想解决园子里大家都关心的Ibatis.Net分页的实现问题。其实我也找了Ibatis.Net分页的解决方案，园子里有一些，奈何没有发现我想要的方式，大都的策略是调用两次SQL Statement,第一次，根据条件查询总记录条数，第二次，根据条件查询从第N行到M行的数据集合，不是这种不能满足条件，恰恰相反，这种写法，完全可以满足现有项目的需求，也很具备SQL调优空间，但有个的弊端，是通过一个查询写几遍。很难复用。感觉很是别扭，我看过在查询较多的系统里，到处充斥这分页的SQL语句，另外一点，本来我们码农们只要关心实现获取业务数据就行了，每次在实现功能的基础上，还要再加上分页的SQL语句，使原本的可能就复杂的语句，变得更加复杂和难以理解。&lt;/p&gt;&lt;p&gt;为此，我特地Reflect看了Ibatis.Net的源码。根据他的处理逻辑扩展了SqlMapper的接口，增加 IList&amp;lt;T&amp;gt; QueryForListWithPage&amp;lt;T&amp;gt;这种功能。本想通过注入的方式实现的，看过Java的筒子们曾用注入的方式搞定过。可惜Ibatis.Net没有发现这种方式（或许我才疏学浅，没有找到）。貌似MyBatis已经支持。但没有实践过。本文代码只针对Ibatis 1.62版本和使用MSSQL数据库。如果感觉此思路还不错，我的源码是共享滴，完全可以下载源码，改造成你想要的其它方式。&lt;/p&gt;&lt;p&gt;至于分页的SQL，个人偏好row_number这种方法，其它的如分页存储过程，TOP方式就不费笔墨了。&lt;/p&gt;&lt;p&gt;话多无益。直接上码&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取学生列表（使用配置GetStudentList的sql，按照id升序排序获取从第八十个到第一百学生）&lt;/span&gt;&lt;br/&gt; &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; list = mapper.QueryForListWithPage&amp;lt;T&amp;gt;(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GetStudentList&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, paras, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;id asc&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800080;"&gt;80&lt;/span&gt;, &lt;span style="color: #800080;"&gt;100&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;ref&lt;/span&gt; count);&lt;/div&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;那么具体实现怎么写呢，我采用c#的扩展方法，扩展了Ibatis.Net标配的SqlMapper功能，看起来类似Ibatis.Net原生态的功能，但又没有破坏Ibatis源码，这种插件式，不会给原有的Ibatis引入任何的Bug.&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; SqlMapperExtension&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; PageSql =&lt;br/&gt;            &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;with cte as( select id0=row_number() over(order by {0}),* from  ({1}) as cte1) select * from cte where id0 between @beginNo and @endNo&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;const&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; CountSql = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;select count(*) {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; 查询分页&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;typeparam name="T"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;泛型&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/typeparam&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="mapper"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;mapper&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="tag"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;SQL Statement的id&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="paramObject"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;参数&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="orderby"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;查询条件，必须确保数据库中有这一列&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="beginNo"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;开始行数&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="endNo"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;结束行数&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;param name="totalCount"&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;总条数&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #808080;"&gt;///&lt;/span&gt; &lt;span style="color: #808080;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;查询结果&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; IList&amp;lt;T&amp;gt; QueryForListWithPage&amp;lt;T&amp;gt;(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; ISqlMapper mapper, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; tag, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; paramObject,&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;orderby&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; beginNo, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; endNo, &lt;span style="color: #0000ff;"&gt;ref&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; totalCount)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; flag = &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            ISqlMapSession sqlMapSession &lt;/span&gt;=&lt;span style="color: #000000;"&gt; mapper.LocalSession;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (sqlMapSession == &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;            {&lt;br/&gt;                sqlMapSession &lt;/span&gt;=&lt;span style="color: #000000;"&gt; mapper.CreateSqlMapSession();&lt;br/&gt;                flag &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                IMappedStatement mappedStatement &lt;/span&gt;=&lt;span style="color: #000000;"&gt; mapper.GetMappedStatement(tag);&lt;br/&gt;                IStatement statement &lt;/span&gt;=&lt;span style="color: #000000;"&gt; mappedStatement.Statement;&lt;br/&gt;                RequestScope request &lt;/span&gt;=&lt;span style="color: #000000;"&gt; statement.Sql.GetRequestScope(mappedStatement, paramObject, sqlMapSession);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; statementsql =&lt;span style="color: #000000;"&gt; request.PreparedStatement.PreparedSql;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cmdPageSql = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(PageSql, &lt;span style="color: #0000ff;"&gt;orderby&lt;/span&gt;&lt;span style="color: #000000;"&gt;, statementsql);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; cmdCountSql = &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format(CountSql,statementsql.Substring(statementsql.ToLower().IndexOf(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;from&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)));&lt;br/&gt;&lt;br/&gt;                request.PreparedStatement.PreparedSql &lt;/span&gt;=&lt;span style="color: #000000;"&gt; cmdPageSql;&lt;br/&gt;                request.IDbCommand &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DbCommandDecorator(sqlMapSession.CreateCommand(statement.CommandType), request);&lt;br/&gt;                ApplyParameterMap(sqlMapSession, request.IDbCommand, request, statement, paramObject);&lt;br/&gt;                totalCount &lt;/span&gt;=&lt;span style="color: #000000;"&gt; GetCount(request, sqlMapSession, cmdCountSql);&lt;br/&gt;                request.IDbCommand.CommandText &lt;/span&gt;=&lt;span style="color: #000000;"&gt; request.PreparedStatement.PreparedSql;&lt;br/&gt;                AddCommandParameters(beginNo, endNo, request);&lt;br/&gt;                IList&lt;/span&gt;&amp;lt;T&amp;gt; result = RunQueryForList&amp;lt;T&amp;gt;(statement, request, sqlMapSession, paramObject, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; result;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;finally&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (flag)&lt;br/&gt;                {&lt;br/&gt;                    sqlMapSession.CloseConnection();&lt;br/&gt;                }&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;园友们若想直接拿来使用，可以下载&lt;a href="http://files.cnblogs.com/wcyao/Ibatis.Net.zip"&gt;附件文件&lt;/a&gt;，在引用Ibatis.Net的dll同时，在工程里再增加&lt;a href="http://files.cnblogs.com/wcyao/Ibatis.Net.zip"&gt;SqlMapperExtension&lt;/a&gt;这个类文件，就可以方便调用了。此方法在Ibatis.Net1.62版本下，使用MSSQL,已经通过测试验证。OK，如果你不想分页功能，那么就还是使用下面的方式。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;         var listall = mapper.QueryForList&amp;lt;T&amp;gt;(statementName, paras);&lt;br/&gt;&lt;/div&gt;&lt;p&gt;这样你只需要在sqlmapper的xml里写一个SQL语句，获取全部记录和获取分页记录(含有总条数)两件事就都可以搞定.&lt;/p&gt;&lt;p&gt;觉得好的话，别忘了顶一下哦，呵呵.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wcyao/aggbug/2521348.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wcyao/archive/2012/05/28/2521348.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hmiinyu/archive/2012/05/28/2519661.html</id><title type="text">ASP.NET MVC架构与实战系列之二：理解MVC路由配置</title><summary type="text">在上一篇文章中，我简短的谈了一下MVC的底层运行机制，如果对MVC还不是很了解的朋友，可以作为入门的参照。接下来，我开始介绍关于URL路由的相关知识。URL路由不是MVC独有的，相反它是独立于MVC而单独存在的(在System.Web.Routing下)。因此，URL路由也能为传统的ASP.NET应用程序服务。我用一个简单的例子来解释路由，在我们的上一节的"ASP.NET MVC应用程序"中添加一个新的页面default.aspx，其后台代码如下：protected void Page_Load(object sender, EventArgs e){ var origin</summary><published>2012-05-28T07:49:00Z</published><updated>2012-05-28T07:49:00Z</updated><author><name>Miracle  He</name><uri>http://www.cnblogs.com/hmiinyu/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hmiinyu/archive/2012/05/28/2519661.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hmiinyu/archive/2012/05/28/2519661.html"/><content type="html">&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 在上一篇文章中，我简短的谈了一下MVC的底层运行机制，如果对MVC还不是很了解的朋友，可以作为入门的参照。接下来，我开始介绍关于URL路由的相关知识。URL路由不是MVC独有的，相反它是独立于MVC而单独存在的(在System.Web.Routing下)。因此，URL路由也能为传统的ASP.NET应用程序服务。我用一个简单的例子来解释路由，在我们的上一节的"ASP.NET MVC应用程序"中添加一个新的页面default.aspx，其后台代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Page_Load(&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender, EventArgs e)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; originalPath =&lt;span style="color: #000000;"&gt; Request.Path;&lt;br/&gt;    HttpContext.Current.RewritePath(Request.ApplicationPath, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    IHttpHandler handler &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MvcHttpHandler();&lt;br/&gt;    handler.ProcessRequest(HttpContext.Current);&lt;br/&gt;    HttpContext.Current.RewritePath(originalPath, &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;当执行请求页面default.aspx时，首先将请求的路径重写为"/"，而该路径会匹配路由{controller}/{action}/{id}，根据Global.asax路由配置，将映射为Home/Index/，从而输出Index.aspx的内容(而不是default.aspx的内容)，不禁要问：为什么default.aspx在MVC应用程序中当做普通的ASP.NET页面，而不是将该请求转化为路由执行？是不是在MVC中就不能使用普通的ASP.NET页面呢？如果不能，当有一天我希望将我的普通站点转化为MVC站点时，是否还需要重新开发？带着这些疑问，我们进一步来探讨如何在MVC中支持原有的ASP.NET页面。在Global.asax中的Application_Start()方法中添加以下代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Start()&lt;br/&gt;{&lt;br/&gt;    AreaRegistration.RegisterAllAreas();&lt;br/&gt;    RegisterRoutes(RouteTable.Routes);&lt;br/&gt;    &lt;span style="color: #800000;"&gt;&lt;strong&gt;RouteTable.Routes.RouteExistingFiles &lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;= true&lt;/strong&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;;&lt;br/&gt;&lt;/strong&gt;&lt;/span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;再次运行default.aspx会出现以前错误页面(找不到页面)。&lt;/p&gt;&lt;div align="left"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/hmiinyu/7.png" alt="" width="719" height="216" border="0" /&gt;&lt;br /&gt;刚才增加的代码：RouteTable.Routes.RouteExistingFiles = true(默认为false);表明MVC启用对现有Web页面的解析，此时尽管同样解析到路由{controller}/{action}/{id}上，但却找不到对应的控制器路由参数default.aspx，因而导致错误。接下来我们为它添加相关的路由设置，在Global.asax中添加以下代码：&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;为default.aspx添加路由&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;routes.MapRoute(&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;default.aspx&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, action = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Index&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, id =&lt;span style="color: #000000;"&gt; UrlParameter.Optional } &lt;br/&gt;);&lt;/span&gt;&lt;/div&gt;&lt;p&gt;删除或注释掉default.aspx.cs中的代码再次运行，会发现页面能正常解析。需要说明的是，URL路由的排列顺序非常关键，一旦找到第一个匹配的路由，将不会继续寻找剩下的路由了。是因为这里找到了匹配的路由Start，从而正确的映射到Home下的视图Index.aspx。为了更加深入理解路由解析的匹配规则，我们引入"路由匹配监控器"。添加引用"&lt;a title="RouteDebug.dll" href="http://files.cnblogs.com/hmiinyu/RouteDebug-Binary.zip"&gt;RouteDebug.dll&lt;/a&gt;"，并在Global.asax中注册检测代码以分别检测没有启用和启用(依靠RouteExistingFiles属性)ASP.NET页面解析两种情况。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Start()&lt;br/&gt;{&lt;br/&gt;    AreaRegistration.RegisterAllAreas();&lt;br/&gt;    RegisterRoutes(RouteTable.Routes);&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;RouteTable.Routes.RouteExistingFiles = true;&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;    RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/hmiinyu/8.png" alt="" width="574" height="371" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #800000;"&gt;&lt;strong&gt;未启用(默认)Web页面解析的路由监控图&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/hmiinyu/9.png" alt="" width="575" height="417" border="0" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="color: #800000;"&gt;启用Web页面解析的路由监控图&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;从图中我们发现，当启用Web页面解析时，比未启用适多出一个路由项，这是因为此时是从Global.asax中去寻找匹配的路由项。过程大概是这样的：首先会到路由表集合中寻找，如果找到匹配的路由定义则解析路由定义中的各个参数，依次获取参数映射的控制器/视图/参数信息，最后定位到指定控制器下的指定视图页面进行输出。相反，而过找不到对应的匹配路由则返回错误页面。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;前面已提到过，URL路由的基本格式是: {controller}/{action}/{id}，但也存在很多变体，总的来说，都会把不包含在{}中的部分当成常量来处理。如：blog/{action}/{author}的正确映射应该为:blog/show/miracle，再比如{report}/{year}/{month}/{day}映射为:sale/2012/5/25。这样就非常好理解页面具有的功能。开发者一般都会通过Global.asax文件的Application_Start()来设置URL路由的定义，通过静态类RouteTable的Routes属性来设置路由。&lt;/p&gt;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;{&lt;br/&gt;    routes.IgnoreRoute(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{resource}.axd/{*pathInfo}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    routes.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Route(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{action}/{author}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; BlogRouteHandler()));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Application_Start()&lt;br/&gt;{&lt;br/&gt;    AreaRegistration.RegisterAllAreas();&lt;br/&gt;    RegisterRoutes(RouteTable.Routes);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;我们可以看出在路由中定义了两个路由参数:action和author。当用户发送URL请求&lt;a href="http://server/blog/show/miracle"&gt;http://server/blog/show/miracle&lt;/a&gt;时，根据路由的定义将进行映射，使得action映射为show，author映射为miracle，如果当用户发送请求&lt;a href="http://server/blog/add"&gt;http://server/blog/add&lt;/a&gt;时，由于找不到对应的路由也没有默认路由，此时URL路由将不会进行处理，而是作为普通的页面交由ASP.NET应用程序处理。在添加URL路由的同时，还可以设置路由参数的默认值。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;{&lt;br/&gt;    routes.IgnoreRoute(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{resource}.axd/{*pathInfo}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    routes.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Route(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{action}/{author}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; BlogRouteHandler())&lt;br/&gt;    {&lt;br/&gt;       &lt;strong&gt;&lt;span style="color: #800000;"&gt; Defaults &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;= new RouteValueDictionary&lt;br/&gt;        {&lt;br/&gt;            {"action", "show"},&lt;br/&gt;            {"author", "miracle"&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;}&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;&lt;/strong&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;现在用户就可以发送更多的请求了，如: &lt;a href="http://server/blog"&gt;http://server/blog&lt;/a&gt;将映射到&lt;a href="http://server/blog/show/miracle"&gt;http://server/blog/show/miracle&lt;/a&gt;上，&lt;a href="http://server/blog/add"&gt;http://server/blog/add&lt;/a&gt;将映射到&lt;a href="http://server/blog/add"&gt;http://server/blog/add&lt;/a&gt;上，而&lt;a href="http://server/blog/add/miraclehe"&gt;http://server/blog/add/miraclehe&lt;/a&gt;将映射到&lt;a href="http://server/blog/add/miraclehe"&gt;http://server/blog/add/miraclehe&lt;/a&gt;上。简单总结一句：如果对应的路由参数没有填充值的话，则使用默认值，否则使用对应的路由参数值。有时，为了适应一类URL的定义，可以用通配符(*)来表示。如:blog/query/{*values}，对应的映射可以包含如下：/blog/query/miracle/2012/05，/blog/query/miracle或/blog/query等。可能还需要为路由参数添加约束，以更好的满足参数的准确性。如：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;{&lt;br/&gt;    routes.IgnoreRoute(&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{resource}.axd/{*pathInfo}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    routes.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Route(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{locale}/{year}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; BlogRouteHandler())&lt;br/&gt;    {&lt;br/&gt;        &lt;strong&gt;&lt;span style="color: #800000;"&gt;Constraints &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;= new RouteValueDictionary&lt;br/&gt;        {&lt;br/&gt;            {"locale", "{a-z}{2}-{A-Z}{2}"},&lt;br/&gt;            {"year", @"\d{4}"&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #800000;"&gt;}&lt;br/&gt;        }&lt;br/&gt;&lt;/span&gt;    });&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;对应的映射为：/blog/en-US/2012，而/blog/en-us/2012，/blog/en-US/12均不符合要求。介绍了关于默认值和约束的相关知识后，我们来看看Route类定义，主要包含以下属性：默认值Defaults、约束Constraints、命名空间DataTokens、URL路由以及路由处理程序RouteHandler，以下是其构造函数列表。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Route(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url, IRouteHandler handler);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Route(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url, RouteValueDictionary defaults, IRouteHandler handler);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Route(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler handler);&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; Route(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; url, RouteValueDictionary defaults, RouteValueDictionary constraints, RouteValueDictionary dataTokens, IRouteHandler handler);&lt;/div&gt;&lt;p&gt;可以看出，最简单的构造函数只需要URL路由和路由处理程序，最复杂的则包含所有属性。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; route = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Route(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{action}/{author}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;br/&gt;                       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RouteValueDictionary { {&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;show&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }, {&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;author&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;miracle&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;} },&lt;br/&gt;                       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; MvcRouteHandler());&lt;/div&gt;&lt;p&gt;可将(多个)路由添加到路由集合RouteCollection中，通过RouteTable.Routes属性来维护路由集合。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;{&lt;br/&gt;    routes.Add(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Route(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{action}/{author}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;br/&gt;                       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; RouteValueDictionary { {&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;action&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;show&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; }, {&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;author&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;miracle&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;} },&lt;br/&gt;                       &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MvcRouteHandler()));&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;大家可能会发现，添加路由有MapRoute和Add两个方法，那到底有什么区别的。MapRoute是RouteCollection的扩展方法，同时还有IngnoreRoute，而Add则是实例方法，相对来说要使用Add来调用比较复杂(包含刚才提到的5大属性)，而MapRoute则相对简洁。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; RegisterRoutes(RouteCollection routes)&lt;br/&gt;{&lt;br/&gt;    routes.MapRoute(&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;strong&gt;&lt;span style="color: #800000;"&gt;Article&lt;/span&gt;&lt;/strong&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 路由名称&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{action}/{author}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; 带有参数的 URL&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { controller = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Home&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, action = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;show&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, author = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;miracle&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; } &lt;br/&gt;    );&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;细心的朋友会发现，在MapRoute中指定了路由名称(可选)，到底有什么用呢？先看以下生成链接(在下一篇文章中将提到)的代码：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&amp;lt;%= Html.RouteLink(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Miracle's Blog&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Article&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { action = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;compose&lt;/span&gt;&lt;span style="color: #800000;"&gt;" &lt;/span&gt;}) %&amp;gt;&lt;/div&gt;&lt;p&gt;此时在URL路由匹配时就直接按照名称解析，同时可以不用指定默认的路由参数，而不用遍历匹配以提高匹配效率。另一种优化路由的方式是将最常见的路由存放在路由表的最前面(只要找到第一个则不再寻找)。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 有时，我们需要自定义路由约束(需要实现IRouteConstraint的Match方法)以满足更复杂的路由需求。假定路由为: blog/miracle/{year}/{month}/{day}。此时year参数的参考值：2000~2012，month为:1~12， day为：28、29、30或31(根据月份而定)。分别添加YearRouteConstraint类、MonthRouteConstraint类和DayRouteConstraint类。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('b0dfd16b-8423-450f-aa63-bee86fbf15e2')"&gt;&lt;div id="cnblogs_code_open_b0dfd16b-8423-450f-aa63-bee86fbf15e2" class="cnblogs_code_hide"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; YearRouteConstraint : IRouteConstraint&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Match(HttpContextBase httpContext, Route route, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; parameterName, RouteValueDictionary values, RouteDirection routeDirection)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (routeDirection == RouteDirection.IncomingRequest &amp;amp;&amp;amp;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            parameterName.ToLower() &lt;/span&gt;== &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;year&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; year = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.TryParse(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;year&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString(), &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; year))&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; year &amp;gt;= &lt;span style="color: #800080;"&gt;2000&lt;/span&gt; &amp;amp;&amp;amp; year &amp;lt;= &lt;span style="color: #800080;"&gt;2012&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MonthRouteConstraint : IRouteConstraint&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Match(HttpContextBase httpContext, Route route, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; parameterName, RouteValueDictionary values, RouteDirection routeDirection)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (routeDirection == RouteDirection.IncomingRequest &amp;amp;&amp;amp;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            parameterName.ToLower() &lt;/span&gt;== &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;month&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; month = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.TryParse(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;month&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString(), &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt;&lt;span style="color: #000000;"&gt; month))&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; month &amp;gt;= &lt;span style="color: #800080;"&gt;1&lt;/span&gt; &amp;amp;&amp;amp; month &amp;lt;= &lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            }&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; DayRouteConstraint : IRouteConstraint&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Match(HttpContextBase httpContext, Route route, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; parameterName, RouteValueDictionary values, RouteDirection routeDirection)&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (routeDirection == RouteDirection.IncomingRequest &amp;amp;&amp;amp;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            parameterName.ToLower() &lt;/span&gt;== &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;day&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; month = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.TryParse(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;month&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString(), &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; month)) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (month &amp;lt;= &lt;span style="color: #800080;"&gt;0&lt;/span&gt; || month &amp;gt; &lt;span style="color: #800080;"&gt;12&lt;/span&gt;) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; day = &lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;.TryParse(values[&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;day&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;].ToString(), &lt;span style="color: #0000ff;"&gt;out&lt;/span&gt; day)) &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;switch&lt;/span&gt;&lt;span style="color: #000000;"&gt; (month)&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;7&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;8&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; day &amp;lt;= &lt;span style="color: #800080;"&gt;31&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;6&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;9&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;11&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; day &amp;lt;= &lt;span style="color: #800080;"&gt;31&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;case&lt;/span&gt; &lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; day &amp;lt;= &lt;span style="color: #800080;"&gt;28&lt;/span&gt;;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;不计闰年&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;            }&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;接下来，我们可以来利用自定义约束配置路由。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;配置自定义约束&lt;/span&gt;&lt;br/&gt;routes.MapRoute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Article&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;, &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog/{year}/{month}/{day}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                {&lt;br/&gt;                    controller &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;blog&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    action &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;show&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    author &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;miracle&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    year &lt;/span&gt;= &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    month &lt;/span&gt;= &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;                    day &lt;/span&gt;= &lt;span style="color: #800000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                },&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;br/&gt;                {&lt;br/&gt;                    year &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; YearRouteConstraint(),&lt;br/&gt;                    month &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MonthRouteConstraint(),&lt;br/&gt;                    day &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DayRouteConstraint()&lt;br/&gt;                });&lt;/span&gt;&lt;/div&gt;&lt;p&gt;现在如果运行&lt;a href="http://server/blog/show/miracle/2012/4/31"&gt;http://server/blog/show/miracle/2012/4/31&lt;/a&gt;将报错，因为不符合日期约束。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hmiinyu/aggbug/2519661.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hmiinyu/archive/2012/05/28/2519661.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yjf512/archive/2012/05/28/2521412.html</id><title type="text">Lua的协同程序</title><summary type="text">Lua是一种简单，可扩展，可移植及高效的脚本语言。在嵌入式系统，移动设备，web服务器，游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与C语言或者其他语言。 这里说的是lua语言中的协同程序（coroute），也有人翻译成为协作程序 基本函数和语法 coroutine就是lua的协同程序 先讲一下coroutine的语法： coroutine.create() 创建coroutine，返回coroutine， 参数是一个函数，当和resume配合使用的时候就唤醒函数调用 coroutine.resume() 重启coroutine，和create配合使用...</summary><published>2012-05-28T07:39:00Z</published><updated>2012-05-28T07:39:00Z</updated><author><name>轩脉刃</name><uri>http://www.cnblogs.com/yjf512/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yjf512/archive/2012/05/28/2521412.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yjf512/archive/2012/05/28/2521412.html"/><content type="html">&lt;p&gt;Lua是一种简单，可扩展，可移植及高效的脚本语言。在嵌入式系统，移动设备，web服务器，游戏等方面都能见到它的身影。lua其中最吸引人的一点事它能很方便地与C语言或者其他语言。&lt;/p&gt;  &lt;p&gt;这里说的是lua语言中的协同程序（coroute），也有人翻译成为协作程序&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;基本函数和语法&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;coroutine就是lua的协同程序&lt;/p&gt;  &lt;br /&gt;  &lt;p&gt;&lt;strong&gt;先讲一下coroutine的语法：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.create(&lt;function&gt;)&lt;/function&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;创建coroutine，返回coroutine， 参数是一个函数，当和resume配合使用的时候就唤醒函数调用&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.resume(&lt;coroutine&gt;)&lt;/coroutine&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;重启coroutine，和create配合使用&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.yield()&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;挂起coroutine，将coroutine设置为挂起状态，这个和resume配合使用能有很多有用的效果&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.status(&lt;coroutine&gt;)&lt;/coroutine&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;查看coroutine的状态&lt;/p&gt;  &lt;p&gt;注：coroutine的状态有三种：dead，suspend，running，具体什么时候有这样的状态请参考下面的程序&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.wrap（&lt;function&gt;）&lt;/function&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;创建coroutine，返回一个函数，一旦你调用这个函数，就进入coroutine，和create功能重复&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;coroutine.running()&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;返回正在跑的coroutine，一个coroutine就是一个线程，当使用running的时候，就是返回一个corouting的线程号&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;使用下面的程序来了解一下这几个函数的基本用法:&lt;/strong&gt;&lt;/p&gt;  &lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;   co = coroutine.create(&lt;br/&gt;    function(i)&lt;br/&gt;        print(i);&lt;br/&gt;    end&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;coroutine.resume(co, 1)   -- 1&lt;br/&gt;print(coroutine.status(co))  -- dead&lt;br/&gt;&lt;br/&gt;print("----------")&lt;br/&gt;&lt;br/&gt;co = coroutine.wrap(&lt;br/&gt;    function(i)&lt;br/&gt;        print(i);&lt;br/&gt;    end&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;co(1)&lt;br/&gt;&lt;br/&gt;print("----------")&lt;br/&gt;&lt;br/&gt;co2 = coroutine.create(&lt;br/&gt;    function()&lt;br/&gt;        for i=1,10 do&lt;br/&gt;            print(i)&lt;br/&gt;            if i == 3 then&lt;br/&gt;                print(coroutine.status(co2))  --running&lt;br/&gt;                print(coroutine.running()) --thread:XXXXXX&lt;br/&gt;            end&lt;br/&gt;            coroutine.yield()&lt;br/&gt;        end&lt;br/&gt;    end&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;coroutine.resume(co2) --1&lt;br/&gt;coroutine.resume(co2) --2&lt;br/&gt;coroutine.resume(co2) --3&lt;br/&gt;&lt;br/&gt;print(coroutine.status(co2))   -- suspended&lt;br/&gt;print(coroutine.running())   --nil&lt;br/&gt;&lt;br/&gt;print("----------")&lt;/div&gt;&lt;p&gt;返回数据：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205281539079429.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205281539071348.png" width="505" height="224" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;coroutine.running就可以看出来,coroutine在底层实现就是一个线程。当create一个coroutine的时候就是在新线程中注册了一个事件。当使用resume触发事件的时候，create的coroutine函数就被执行了，当遇到yield的时候就代表挂起当前线程，等候再次resume触发事件。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;分析学习coroutine的时候经常遇到的一个程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;源程序可以看&lt;a href="http://pgl.yoyo.org/luai/i/2.11+Coroutines" target="_blank"&gt;这里&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我稍微做了点修改，增加了一下分隔符：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;  function foo (a)&lt;br/&gt;    print("foo", a)  -- foo 2&lt;br/&gt;    return coroutine.yield(2 * a) -- return: a , b &lt;br/&gt;end&lt;br/&gt;&lt;br/&gt;co = coroutine.create(function (a , b)&lt;br/&gt;    print("co-body", a, b) -- co-body 1 10&lt;br/&gt;    local r = foo(a + 1)&lt;br/&gt;    &lt;br/&gt;    print("co-body2", r)&lt;br/&gt;    local r, s = coroutine.yield(a + b, a - b)&lt;br/&gt;    &lt;br/&gt;    print("co-body3", r, s)&lt;br/&gt;    return b, "end"&lt;br/&gt;end)&lt;br/&gt;       &lt;br/&gt;print("main", coroutine.resume(co, 1, 10)) -- true, 4&lt;br/&gt;print("------")&lt;br/&gt;print("main", coroutine.resume(co, "r")) -- true 11 -9&lt;br/&gt;print("------")&lt;br/&gt;print("main", coroutine.resume(co, "x", "y")) -- true 10 end&lt;br/&gt;print("------")&lt;br/&gt;print("main", coroutine.resume(co, "x", "y")) -- false cannot resume dead coroutine&lt;br/&gt;print("------")&lt;/div&gt;&lt;p&gt;这个程序返回：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/20120528153907235.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205281539094215.png" width="515" height="219" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;很神奇，也很让人看不懂&lt;/p&gt;&lt;br /&gt;&lt;p&gt;先理解下下面几点：&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;resume一定是在主线程的，yield是在子线程（coroutine）的 &lt;/li&gt;  &lt;li&gt;resume可以带参数     &lt;div&gt;当coroutine是suspend状态的时候，参数是作为coroutine的参数传入的&lt;/div&gt;    &lt;div&gt;当coroutine是suspend状态的时候，参数是作为coroutine的参数传入的&lt;/div&gt;  &lt;/li&gt;  &lt;li&gt;resume返回值有两种情况     &lt;div&gt;      &lt;ul&gt;        &lt;li&gt;当coroutine是suspend状态的时候，返回是是bool [yield params]           &lt;div&gt;bool是这个resume操作是否成功&lt;/div&gt;          &lt;div&gt;yield params是当前coroutine的yield的参数&lt;/div&gt;        &lt;/li&gt;        &lt;li&gt;当coroutine是dead状态的时候，返回值是bool [function return]           &lt;div&gt;bool是这个resume操作是否成功&lt;/div&gt;          &lt;div&gt;yield params是当前coroutine的yield的参数&lt;/div&gt;        &lt;/li&gt;      &lt;/ul&gt;    &lt;/div&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;先对照上面几条看一个简单的例子:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;  co = coroutine.create(&lt;br/&gt;    function (a , b)&lt;br/&gt;        print("params", a, b)&lt;br/&gt;        return coroutine.yield(3, 3)&lt;br/&gt;    end&lt;br/&gt;)&lt;br/&gt;coroutine.resume(co, 1, 2);&lt;br/&gt;print(coroutine.resume(co, 4, 5))&lt;/div&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205281539095610.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/yjf512/201205/201205281539099722.png" width="492" height="47" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;理解完上面这个程序，再看看coroutine2的程序,这里把每个输出执行了哪些步骤列出来了：&lt;/p&gt;&lt;ol&gt;  &lt;li&gt;print("main", coroutine.resume(co, 1, 10)) 执行了：     &lt;div&gt;print("co-body", 1, 10)&lt;/div&gt;    &lt;div&gt;print("foo", 2)&lt;/div&gt;    &lt;div&gt;coroutine.resume(co, 1, 10) 返回 true, 4 (!!这里的4是yield的参数)&lt;/div&gt;    &lt;div&gt;print("main", true, 4)&lt;/div&gt;  &lt;/li&gt;  &lt;li&gt;print("main", coroutine.resume(co, "r")) 执行了：     &lt;div&gt;foo(a) 返回了 "r" (这是由yield返回的)&lt;/div&gt;    &lt;div&gt;print("co-body2", "r")&lt;/div&gt;    &lt;div&gt;coroutine.resume(co, "r") 返回 true, 11 -9 (!!这里的a和b还是用1和10计算的)&lt;/div&gt;    &lt;div&gt;print("main" , true, 11 -9)&lt;/div&gt;  &lt;/li&gt;  &lt;li&gt;print("main", coroutine.resume(co, "x", "y"))执行了：     &lt;div&gt;local r, s = coroutine.yield(a + b, a - b) r和s值为x和y&lt;/div&gt;    &lt;div&gt;print("co-body3", "x", "y")&lt;/div&gt;    &lt;div&gt;return b, "end" //此时coroutine线程结束，为dead状态&lt;/div&gt;    &lt;div&gt;coroutine.resume(co, "x", "y") 返回值为 true 10 end&lt;/div&gt;    &lt;div&gt;print("main" , true 10 end)&lt;/div&gt;  &lt;/li&gt;  &lt;li&gt;print("main", coroutine.resume(co, "x", "y"))执行了：     &lt;div&gt;由于coroutine.resume(co, "x", "y")已经dead了，所以这里返回false&lt;/div&gt;  &lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;参考文章&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://pgl.yoyo.org/luai/i/about" target="_blank"&gt;Luai: Lua reference manual interface: about&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codingnow.com/2000/download/lua_manual.html" target="_blank"&gt;lua_manual&lt;/a&gt;&lt;/p&gt;&lt;p&gt;《lua程序设计》&lt;/p&gt;&lt;div id="MySignature"&gt;&lt;a href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" rel="license" target="_blank"&gt;&lt;img style="border-right-width: 0pt; border-top-width: 0pt; border-bottom-width: 0pt; border-left-width: 0pt" alt="Creative Commons License" align="left" src="http://i.creativecommons.org/l/by-nc/3.0/88x31.png" /&gt;&lt;/a&gt;   &lt;p&gt;本文基于&lt;a title="Attribution-NonCommercial 3.0 Unported" href="http://creativecommons.org/licenses/by-nc/3.0/deed.zh" target="_blank"&gt;署名-非商业性使用 3.0&lt;/a&gt;许可协议发布，欢迎转载，演绎，但是必须保留本文的署名&lt;a href="http://www.cnblogs.com/yjf512/" target="_blank"&gt;叶剑峰&lt;/a&gt;（包含链接http://www.cnblogs.com/yjf512/），且不得用于商业目的。如您有任何疑问或者授权方面的协商，请&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#106;&amp;#105;&amp;#97;&amp;#110;&amp;#102;&amp;#101;&amp;#110;&amp;#103;&amp;#121;&amp;#101;&amp;#49;&amp;#49;&amp;#48;&amp;#64;&amp;#103;&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#46;&amp;#99;&amp;#111;&amp;#109;" target="_blank"&gt;与我联系&lt;/a&gt;。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/yjf512/aggbug/2521412.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yjf512/archive/2012/05/28/2521412.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html</id><title type="text">创建Windows服务(Windows Services)N种方式总结</title><summary type="text">最近由于工作需要，写了一些windows服务程序，有一些经验，我现在总结写出来。目前我知道的创建创建Windows服务有3种方式:a.利用.net框架类ServiceBaseb.利用组件Topshelfc.利用小工具instsrv和srvany下面我利用这3种方式,分别做一个windows服务程序，程序功能就是每隔5秒往程序目录下记录日志:a.利用.net框架类ServiceBase本方式特点:简单，兼容性好通过继承.net框架类ServiceBase实现第1步: 新建一个Windows服务 public partial class Service1 : ServiceBase {...</summary><published>2012-05-28T07:38:00Z</published><updated>2012-05-28T07:38:00Z</updated><author><name>aierong</name><uri>http://www.cnblogs.com/aierong/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html"/><content type="html">&lt;p&gt;最近由于工作需要，写了一些windows服务程序，有一些经验，我现在总结写出来。&lt;br /&gt;目前我知道的创建创建Windows服务有3种方式:&lt;br /&gt;a.利用.net框架类ServiceBase&lt;br /&gt;b.利用组件Topshelf&lt;br /&gt;c.利用小工具instsrv和srvany&lt;/p&gt;&lt;p&gt;下面我利用这3种方式,分别做一个windows服务程序，程序功能就是每隔5秒往程序目录下记录日志:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;a.利用.net框架类ServiceBase&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:简单，兼容性好&lt;/span&gt;&lt;/p&gt;&lt;p&gt;通过继承.net框架类ServiceBase实现&lt;/p&gt;&lt;p&gt;第1步: 新建一个Windows服务&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 : ServiceBase&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Path.GetDirectoryName ( Assembly.GetExecutingAssembly ( ).Location ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Service1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; OnStart ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnStop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第2步: 添加Installer&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    [RunInstaller ( &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; )]&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 : System.Configuration.Install.Installer&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller serviceInstaller;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller processInstaller;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Installer1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;&lt;br/&gt;            processInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceProcessInstaller ( );&lt;br/&gt;            serviceInstaller &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ServiceInstaller ( );&lt;br/&gt;&lt;br/&gt;            processInstaller.Account &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceAccount.LocalSystem;&lt;br/&gt;            serviceInstaller.StartType &lt;/span&gt;=&lt;span style="color: #000000;"&gt; ServiceStartMode.Automatic;&lt;br/&gt;&lt;br/&gt;            serviceInstaller.ServiceName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;my_WindowsService&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.Description &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            serviceInstaller.DisplayName &lt;/span&gt;= &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;WindowsService_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;            Installers.Add ( serviceInstaller );&lt;br/&gt;            Installers.Add ( processInstaller );&lt;br/&gt;        }  &lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:安装,卸载 &lt;br /&gt;Cmd命令&lt;br /&gt;installutil&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (安装Windows服务)&lt;br /&gt;installutil /u&amp;nbsp;&amp;nbsp; WindowsService_test.exe&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsService_test.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="background-color: #ffffff;"&gt;&lt;strong&gt;b.利用组件Topshelf&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码简单,开源组件,Windows服务可运行多个实例&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Topshelf是一个开源的跨平台的服务框架，支持Windows和Mono，只需要几行代码就可以构建一个很方便使用的服务. 官方网站:http://topshelf-project.com&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步:引用程序集TopShelf.dll和log4net.dll&lt;/p&gt;&lt;p&gt;第2步:创建一个服务类MyClass,里面包含两个方法Start和Stop,还包含一个定时器Timer,每隔5秒往文本文件中写入字符&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Directory.GetCurrentDirectory ( ) + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Timer ( &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt; )&lt;br/&gt;            {&lt;br/&gt;                AutoReset &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Elapsed &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , ElapsedEventArgs e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Start ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Start DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Stop ( )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Stop DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; , DateTime.Now ) +&lt;span style="color: #000000;"&gt; Environment.NewLine );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第3步:使用Topshelf宿主我们的服务，主要是Topshelf如何设置我们的服务的配置和启动和停止的时候的方法调用&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Main ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; [ ] args )&lt;br/&gt;        {&lt;br/&gt;            HostFactory.Run ( x &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                x.Service&lt;/span&gt;&amp;lt;MyClass&amp;gt; ( ( s ) =&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;                {&lt;br/&gt;                    s.SetServiceName ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;ser&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                    s.ConstructUsing ( name &lt;/span&gt;=&amp;gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; MyClass ( ) );&lt;br/&gt;                    s.WhenStarted ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Start ( ) );&lt;br/&gt;                    s.WhenStopped ( ( t ) &lt;/span&gt;=&amp;gt;&lt;span style="color: #000000;"&gt; t.Stop ( ) );&lt;br/&gt;                } );&lt;br/&gt;&lt;br/&gt;                x.RunAsLocalSystem ( );&lt;br/&gt;&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的描述&lt;/span&gt;&lt;br/&gt;                x.SetDescription ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_Description&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务的显示名称&lt;/span&gt;&lt;br/&gt;                x.SetDisplayName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_DisplayName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;服务名称&lt;/span&gt;&lt;br/&gt;                x.SetServiceName ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Topshelf_ServiceName&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;&lt;br/&gt;            } );&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;第4步: cmd命令&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; install&amp;nbsp;&amp;nbsp;&amp;nbsp; (安装Windows服务)&lt;/p&gt;&lt;p&gt;ConsoleApp_Topshelf.exe&amp;nbsp; uninstall&amp;nbsp; (卸载Windows服务)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/ConsoleApp_Topshelf.rar&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;c.利用小工具instsrv和srvany &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="text-decoration: underline;"&gt;本方式特点:代码超级简单,WindowsForm程序即可,并支持程序交互(本人最喜欢的特点),好像不支持win7,支持xp win2003&lt;/span&gt;&lt;/p&gt;&lt;p&gt;首先介绍2个小工具:&lt;/p&gt;&lt;p&gt;instsrv.exe:用以安装和卸载可执行的服务&lt;/p&gt;&lt;p&gt;srvany.exe:用于将任何EXE程序作为Windows服务运行&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这2个工具都是是Microsoft Windows Resource Kits工具集的实用的小工具&amp;nbsp;&lt;/p&gt;&lt;p&gt;你可以通过下载并安装Microsoft Windows Resource Kits获得 &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=17657"&gt;http://www.microsoft.com/en-us/download/details.aspx?id=17657&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第1步: 新建WindowsForm程序&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;   &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;partial&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 : Form&lt;br/&gt;    {&lt;br/&gt;        Timer _timer;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; FileName = Application.StartupPath + &lt;span style="color: #800000;"&gt;@"&lt;/span&gt;&lt;span style="color: #800000;"&gt;\&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt; + &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;test.txt&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; Form1 ( )&lt;br/&gt;        {&lt;br/&gt;            InitializeComponent ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Form1_Load ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            _timer &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Timer ( )&lt;br/&gt;            {&lt;br/&gt;                Enabled &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt; ,&lt;br/&gt;                Interval &lt;/span&gt;= &lt;span style="color: #800080;"&gt;5000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            };&lt;br/&gt;&lt;br/&gt;            _timer.Tick &lt;/span&gt;+= &lt;span style="color: #0000ff;"&gt;delegate&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; _sender , EventArgs _e )&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;.Format ( &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Run DateTime {0}&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; , DateTime.Now ) );&lt;br/&gt;            };&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; _timer_Tick ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;throw&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; NotImplementedException ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; witre ( &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; context )&lt;br/&gt;        {&lt;br/&gt;            StreamWriter sw &lt;/span&gt;=&lt;span style="color: #000000;"&gt; File.AppendText ( FileName );&lt;br/&gt;            sw.WriteLine ( context );&lt;br/&gt;            sw.Flush ( );&lt;br/&gt;            sw.Close ( );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; button1_Click ( &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; sender , EventArgs e )&lt;br/&gt;        {&lt;br/&gt;            MessageBox.Show ( &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Hello&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; );&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;第2步:安装,卸载&lt;/p&gt;&lt;p&gt;服务的安装步骤分5小步:&lt;/p&gt;&lt;p&gt;(1)打开CMD,输入以下内容，其中WindowsForms_WindowsService为你要创建的服务名称&lt;/p&gt;&lt;p&gt;格式:目录绝对路径\instsrv &amp;nbsp;WindowsForms_WindowsService&amp;nbsp; 目录绝对路径\srvany.exe&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe &amp;nbsp;WindowsForms_WindowsService &amp;nbsp;D:\TempWork\win\Debug\srvany.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(2)regedit打开注册表编辑器,找到以下目录&lt;/p&gt;&lt;p&gt;HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WindowsForms_WindowsService&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(3)鼠标右键单击WindowsForms_WindowsService，创建一个"项"，名称为"Parameters"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(4)鼠标左键单击"Parameters",在右边点击鼠标右键，创建一个"字符串值"(REG_SZ)，名称为"Application"，数值数据里填写目录下可执行文件的绝对路径+文件名&lt;/p&gt;&lt;p&gt;例如:&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\WindowsFormsApplication_Exe.exe&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;(5)打开services.msc服务控制面板，找到WindowsForms_WindowsService服务，鼠标右键-属性-登陆，勾选"允许服务与桌面交互"&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;启动服务,可以看到程序界面&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/732/2012052815265286.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;卸载服务&lt;/p&gt;&lt;p&gt;D:\TempWork\win\Debug\instsrv.exe WindowsForms_WindowsService REMOVE&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;代码下载:http://files.cnblogs.com/aierong/WindowsFormsApplication_Exe.rar&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/aierong/aggbug/2521409.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aierong/archive/2012/05/28/2521409.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/love17914/archive/2012/05/28/2521384.html</id><title type="text">Javascript中的对象和原型(一)</title><summary type="text">面向对象的语言（如Java）中有类的概念，而通过类可以创建任意多个具有相同属性和方法的对象。但是，JavaScript 没有类的概念，因此它的对象也与基于类的语言中的对象有所不同。要了解面向对象，首先就要了解Javascript中的对象和原型。这篇文章中主要学习一下Javascript中的对象。</summary><published>2012-05-28T07:20:00Z</published><updated>2012-05-28T07:20:00Z</updated><author><name>念在三角湖畔</name><uri>http://www.cnblogs.com/love17914/</uri></author><link rel="alternate" href="http://www.cnblogs.com/love17914/archive/2012/05/28/2521384.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/love17914/archive/2012/05/28/2521384.html"/><content type="html">&lt;h1 style="text-align: center;"&gt;Javascript中的对象和原型(一)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;面向对象的语言（如Java）中有类的概念，而通过类可以创建任意多个具有相同属性和方法的对象。但是，JavaScript 没有类的概念，因此它的对象也与基于类的语言中的对象有所不同。&lt;/p&gt;&lt;p&gt;要了解面向对象，首先就要了解Javascript中的对象和原型。这篇文章中主要学习一下Javascript中的对象。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 幼圆;"&gt;一 关于对象&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对象其实就是一种引用类型。而对象的值就是引用类型的实例。在JavaScript 中引用类型是一种数据结构，将数据和功能组织在一起。它也常被称做为类，但JavaScript 中却没有类的概念。虽然JavaScript 是一门面向对象的语言，却不具备传统面向对象语言所支持的类和接口等基本结构。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 幼圆;"&gt;二 对象的创建以及常用操作&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.使用new运算符&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080;"&gt;1&lt;/span&gt; &amp;lt;script&amp;gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;2&lt;/span&gt;     &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Object();        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用new运算符创建一个对象&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;3&lt;/span&gt;     user.name = '念在三角湖畔';        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给对象添加属性&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;4&lt;/span&gt;     user.age = 22&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;5&lt;/span&gt;     user.address = '湖北武汉'&lt;span style="color: #000000;"&gt;;&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008080;"&gt;6&lt;/span&gt;     alert(user.name + " " +user.age);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回 '念在三角湖畔 湖北武汉'&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #008080;"&gt;7&lt;/span&gt; &amp;lt;/script&amp;gt;&lt;/div&gt;&lt;p&gt;说明：上面的方式中new关键字可以省略，即var user = new Objext();等价于 var user = Object();&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.使用JSON数组创建&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;关于JSON的一些知识可以百度上搜索下。&lt;/p&gt;&lt;p&gt;简单的JSON数组: {name:'念在三角湖畔',age:22,address:'湖北武汉'}&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;使用JSON符号创建&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #008000;"&gt;/*&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br/&gt;        简单的JSON数组:{name:'念在三角湖畔',age:22,address:'湖北武汉'}&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user =&lt;span style="color: #000000;"&gt; {&lt;br/&gt;        name:&lt;/span&gt;'念在三角湖畔'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        age:&lt;/span&gt;22&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        address:&lt;/span&gt;'湖北武汉'&lt;span style="color: #000000;"&gt;    &lt;br/&gt;    };&lt;br/&gt;    alert(user.name &lt;/span&gt;+ " " +user.age);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回 '念在三角湖畔 湖北武汉'&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3.传统赋值方式&lt;/strong&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;传统赋值&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user =&lt;span style="color: #000000;"&gt; {};&lt;br/&gt;    user.name &lt;/span&gt;= '念在三角湖畔';        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给对象添加属性&lt;/span&gt;&lt;br/&gt;    user.age = 22&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    user.address &lt;/span&gt;= '湖北武汉'&lt;span style="color: #000000;"&gt;;&lt;br/&gt;    alert(user.name &lt;/span&gt;+ " " +user.age);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回 '念在三角湖畔 湖北武汉'&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4.属性的调用&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于对象属性的调用有两种方式：&lt;/p&gt;&lt;p&gt;拿上面的例子来说，上面我们已经用了其中一种方式，也就是'.'运算符，调用方法如下：&lt;/p&gt;&lt;p&gt;alert(user.name + " " +user.age);//返回 '念在三角湖畔 湖北武汉'&lt;/p&gt;&lt;p&gt;另一种方法：&lt;br /&gt;alert(user['name'] + " " +user['age']);//返回 '念在三角湖畔 湖北武汉&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5.给对象添加方法&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;给对象添加方法和给变量添加一个属性其实大同小异。具体代码如下：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user =&lt;span style="color: #000000;"&gt; {&lt;br/&gt;        name:&lt;/span&gt;'念在三角湖畔',        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给对象添加属性&lt;/span&gt;&lt;br/&gt;        age:22&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        address:&lt;/span&gt;'湖北武汉'&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        showInfo:&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;(){&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;添加一个方法&lt;/span&gt;&lt;br/&gt;            alert(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.name+" "+&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.age+" "+&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.address);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回 '念在三角湖畔 22 湖北武汉'    &lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        },&lt;br/&gt;        showHello:showHello&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;将对象外部的方法添加到对象&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;    };&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; showHello(){&lt;br/&gt;        alert(&lt;/span&gt;"Hello!"&lt;span style="color: #000000;"&gt;);    &lt;br/&gt;    }&lt;br/&gt;    user.showInfo();&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;调用方法&lt;/span&gt;&lt;br/&gt;    user.showHello();&lt;/div&gt;&lt;p&gt;&lt;strong&gt;6.删除对象的属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;删除对象的属性用delete操作符。格式：&lt;em&gt;delete 对象名称.属性名称&lt;/em&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; user =&lt;span style="color: #000000;"&gt; {&lt;br/&gt;        name:&lt;/span&gt;'念在三角湖畔',        &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;给对象添加属性&lt;/span&gt;&lt;br/&gt;        age:22&lt;span style="color: #000000;"&gt;,&lt;br/&gt;        address:&lt;/span&gt;'湖北武汉'&lt;span style="color: #000000;"&gt;&lt;br/&gt;    };&lt;br/&gt;    alert(user.name);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回&amp;lsquo;念在三角湖畔&amp;rsquo;&lt;/span&gt;&lt;br/&gt;    &lt;span style="color: #0000ff;"&gt;delete&lt;/span&gt; user.name;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;删除user的name属性&lt;/span&gt;&lt;br/&gt;    alert(user.name);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回&amp;lsquo;undefined&amp;rsquo;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: 幼圆;"&gt;三 总结&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这里比较浅显的讲述了一下Javascript中对象的创建和对象方法的添加以及对象属性的删除。对象在javascript面向对象中是一个比较重要的，也算是一个比较基础的部分，只有弄清楚了对象的一些常用操作才能够进行面向对象开发。&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/love17914/aggbug/2521384.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/love17914/archive/2012/05/28/2521384.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/cntosoft/archive/2012/05/28/2521332.html</id><title type="text">开发企业应用系统需要掌握的知识技能</title><summary type="text">本篇文章主要是对开发方面及项目管理方面的知识技能内容进行规划及调侃，这是一篇自我调侃的建议。在这篇文章中我把掌握程度分为了解、熟悉、精通。了解指的是知道这个事物并且会使用这个事物。熟悉指的是对这个事物的使用和应用非常了解，出现问题能快速解决问题。精通指的是对这个事物的原理已经掌握，并知道这个事物的来龙去脉。因为开发一个优秀的企业应用系统需要掌握知识点实在太多，在这里我抛砖引玉把按能力分为初级、普通、高级三种等级并对相关的知识技能进行分类，也系统通过这种形式跟大家探讨，可以把知识技能分的更合理更加科学，让新来的程序员可以对照着这张表格进行规划学习路径，让老程序员可以对照着进行技术改进。</summary><published>2012-05-28T06:46:00Z</published><updated>2012-05-28T06:46:00Z</updated><author><name>至软</name><uri>http://www.cnblogs.com/cntosoft/</uri></author><link rel="alternate" href="http://www.cnblogs.com/cntosoft/archive/2012/05/28/2521332.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/cntosoft/archive/2012/05/28/2521332.html"/><content type="html">&lt;p&gt;&lt;strong&gt;1.&amp;nbsp;&amp;nbsp; 概述&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本篇文章主要是对开发方面及项目管理方面的知识技能内容进行规划及调侃，这是一篇自我调侃的建议。在这篇文章中我把掌握程度分为了解、熟悉、精通。了解指的是知道这个事物并且会使用这个事物。熟悉指的是对这个事物的使用和应用非常了解，出现问题能快速解决问题。精通指的是对这个事物的原理已经掌握，并知道这个事物的来龙去脉。因为开发一个优秀的企业应用系统需要掌握知识点实在太多，在这里我抛砖引玉把按能力分为初级、普通、高级三种等级并对相关的知识技能进行分类，也系统通过这种形式跟大家探讨，可以把知识技能分的更合理更加科学，让新来的程序员可以对照着这张表格进行规划学习路径，让老程序员可以对照着进行技术改进。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.&amp;nbsp;&amp;nbsp; 知识技能的三种等级&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.1.&amp;nbsp; 初级&lt;/strong&gt;&lt;/p&gt;&lt;table style="width: 100%;" border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="16%"&gt;&lt;p&gt;&lt;strong&gt;分类&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="25%"&gt;&lt;p&gt;&lt;strong&gt;知识技能&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="6%"&gt;&lt;p align="center"&gt;&lt;strong&gt;程度&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td width="51%"&gt;&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;软件开发方法&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;面向对象&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《C#面向对象基础教程》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="5" valign="top" width="16%"&gt;&lt;p&gt;程序语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;C#语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;HTML&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CSS&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《CSS2.0参考手册》&lt;/p&gt;&lt;p&gt;《CSS3.0参考手册》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Javascript&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;Web技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Asp.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;.Net框架技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Ado.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;数据库技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL Server 2005&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;其他软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;IIS服务器&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Office软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;2.2.&amp;nbsp; 普通&lt;/strong&gt;&lt;/p&gt;&lt;table style="width: 100%;" border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;&lt;strong&gt;分类&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;&lt;strong&gt;知识技能&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;&lt;strong&gt;程度&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="3" valign="top" width="16%"&gt;&lt;p&gt;过程管理&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CMMI&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《适用于开发的能力成熟度集成模型(CMMI-DEV) 1.2版》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;RUP&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《Rational Unified Process 2000 参考手册》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;敏捷开发&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《敏捷软件开发：原则、模式与实践》&lt;/p&gt;&lt;p align="left"&gt;《硝烟中的 Scrum 和 XP》&lt;/p&gt;&lt;p align="left"&gt;《Scrum Checklists》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;软件开发方法&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;面向对象&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《C#面向对象基础教程》&lt;/p&gt;&lt;p align="left"&gt;《面向对象分析与设计(UML.2.0版)》&lt;/p&gt;&lt;p align="left"&gt;《深入浅出面向对象分析与设计》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;测试驱动开发（TDD）&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;分析设计&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;设计模式及准则&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《企业应用架构模式》&lt;/p&gt;&lt;p align="left"&gt;《新版设计模式手册C#》&lt;/p&gt;&lt;p&gt;《大话设计模式》&lt;/p&gt;&lt;p&gt;《面向对象设计原则》&lt;/p&gt;&lt;p&gt;《类库开发设计准则》&lt;/p&gt;&lt;p&gt;《软件界面设计准则》&lt;/p&gt;&lt;p align="left"&gt;《数据库设计准则》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;重构&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《重构》&lt;/p&gt;&lt;p align="left"&gt;《重构：改善既有代码的设计》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="5" valign="top" width="16%"&gt;&lt;p&gt;基础知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;算法&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《C#数据结构》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;内存、进程和线程管理&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《WINDOWS程序员指南--DLL和内存管理》&lt;/p&gt;&lt;p&gt;《Win32 API详解》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;协议&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《HTTP协议详解》&lt;/p&gt;&lt;p align="left"&gt;《TCP-IP详解卷合集(卷一卷二卷三)》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CLR&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《框架设计 CLR Via C#》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;英语&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="7" valign="top" width="16%"&gt;&lt;p&gt;程序语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;C#语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;HTML&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;XML语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CSS&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《CSS2.0参考手册》&lt;/p&gt;&lt;p&gt;《CSS3.0参考手册》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Javascript&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;UML语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="3" valign="top" width="16%"&gt;&lt;p&gt;Web技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Asp.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Microsoft Ajax&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;JQuery&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《jQuery 中文参考》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="5" valign="top" width="16%"&gt;&lt;p&gt;.Net框架技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Ado.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;WCF&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;WF&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;NHibernate&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《Hibernate开发指南》&lt;/p&gt;&lt;p&gt;《NHibernate中文参考》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;Spring.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;数据库技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL Server 2005&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;其他软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;IIS服务器&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Office软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;2.3.&amp;nbsp; 高级&lt;/strong&gt;&lt;/p&gt;&lt;table style="width: 100%;" border="1" cellspacing="0" cellpadding="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;&lt;strong&gt;分类&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;&lt;strong&gt;知识技能&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;&lt;strong&gt;程度&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&lt;strong&gt;参考资料&lt;/strong&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="3" valign="top" width="16%"&gt;&lt;p&gt;过程管理&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CMMI&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《适用于开发的能力成熟度集成模型(CMMI-DEV) 1.2版》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;RUP&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《Rational Unified Process 2000 参考手册》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;敏捷开发&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《敏捷软件开发：原则、模式与实践》&lt;/p&gt;&lt;p align="left"&gt;《硝烟中的 Scrum 和 XP》&lt;/p&gt;&lt;p align="left"&gt;《Scrum Checklists》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;软件开发方法&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;面向对象&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《C#面向对象基础教程》&lt;/p&gt;&lt;p align="left"&gt;《面向对象分析与设计(UML.2.0版)》&lt;/p&gt;&lt;p align="left"&gt;《深入浅出面向对象分析与设计》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;测试驱动开发（TDD）&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;分析设计&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;设计模式及准则&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《企业应用架构模式》&lt;/p&gt;&lt;p align="left"&gt;《新版设计模式手册C#》&lt;/p&gt;&lt;p&gt;《大话设计模式》&lt;/p&gt;&lt;p&gt;《面向对象设计原则》&lt;/p&gt;&lt;p&gt;《类库开发设计准则》&lt;/p&gt;&lt;p&gt;《软件界面设计准则》&lt;/p&gt;&lt;p align="left"&gt;《数据库设计准则》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;重构&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《重构》&lt;/p&gt;&lt;p align="left"&gt;《重构：改善既有代码的设计》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="5" valign="top" width="16%"&gt;&lt;p&gt;基础知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;算法&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《C#数据结构》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;内存、进程和线程管理&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《WINDOWS程序员指南--DLL和内存管理》&lt;/p&gt;&lt;p&gt;《Win32 API详解》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;协议&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《HTTP协议详解》&lt;/p&gt;&lt;p align="left"&gt;《TCP-IP详解卷合集(卷一卷二卷三)》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CLR&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p align="left"&gt;《框架设计 CLR Via C#》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;英语&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="7" valign="top" width="16%"&gt;&lt;p&gt;程序语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;C#语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;HTML&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;XML语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;CSS&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《CSS2.0参考手册》&lt;/p&gt;&lt;p&gt;《CSS3.0参考手册》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Javascript&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;UML语言&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="3" valign="top" width="16%"&gt;&lt;p&gt;Web技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Asp.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Microsoft Ajax&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;JQuery&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《jQuery 中文参考》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="5" valign="top" width="16%"&gt;&lt;p&gt;.Net框架技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Ado.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;MSND&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;WCF&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;WF&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;NHibernate&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;《Hibernate开发指南》&lt;/p&gt;&lt;p&gt;《NHibernate中文参考》&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p align="left"&gt;Spring.net&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;数据库技术&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;SQL Server 2005&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;精通&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2" valign="top" width="16%"&gt;&lt;p&gt;其他软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;IIS服务器&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;Office软件&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;了解&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="16%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="25%"&gt;&lt;p&gt;领域知识&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="6%"&gt;&lt;p align="center"&gt;熟悉&lt;/p&gt;&lt;/td&gt;&lt;td valign="top" width="51%"&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/cntosoft/aggbug/2521332.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/cntosoft/archive/2012/05/28/2521332.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/hooray/archive/2012/05/28/2521330.html</id><title type="text">我和我的HoorayOS</title><summary type="text">HoorayOS是我在我去年8月份开始构想，9月份开始编写的一个开源的web桌面类应用框架。它的前身是EonerCMS，因为那会公司准备重新开发自己的CMS系统，以应用于一些中小型的网站，于是也就有了这片文章《关于CMS后台展示/操作方式的个人拙见》 直到今年2月，我正式将作品开源，其目的有二，一是因为我觉得差不多可以拿出手了，该有的功能差不多完整了，即时有缺少，比如文件夹、多桌面、应用码头（这些功能在最新版本里都已实现），但这已经不影响一个系统的正常使用了，已经具备二次开发的条件了，其二就是毕竟开发快半年了，自己的毅力有点变弱，我不是一个很高尚的人，所以我很渴望能通过HoorayOS给...</summary><published>2012-05-28T06:44:00Z</published><updated>2012-05-28T06:44:00Z</updated><author><name>胡尐睿丶</name><uri>http://www.cnblogs.com/hooray/</uri></author><link rel="alternate" href="http://www.cnblogs.com/hooray/archive/2012/05/28/2521330.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/hooray/archive/2012/05/28/2521330.html"/><content type="html">&lt;p&gt;HoorayOS是我在我去年8月份开始构想，9月份开始编写的一个开源的web桌面类应用框架。它的前身是EonerCMS，因为那会公司准备重新开发自己的CMS系统，以应用于一些中小型的网站，于是也就有了这片文章《&lt;a href="http://www.cnblogs.com/hooray/archive/2011/08/01/2123330.html" target="_blank"&gt;关于CMS后台展示/操作方式的个人拙见&lt;/a&gt;》&lt;/p&gt;&lt;p&gt;直到今年2月，我正式将作品开源，其目的有二，一是因为我觉得差不多可以拿出手了，该有的功能差不多完整了，即时有缺少，比如文件夹、多桌面、应用码头（这些功能在最新版本里都已实现），但这已经不影响一个系统的正常使用了，已经具备二次开发的条件了，其二就是毕竟开发快半年了，自己的毅力有点变弱，我不是一个很高尚的人，所以我很渴望能通过HoorayOS给我的生活带点收入，不用太多，至少能证明我这半年的努力不是一场闹剧。&lt;/p&gt;&lt;p&gt;开源后我把框架改名叫HoorayOS，因为近半年的开发，我发现这种模式不能局限于CMS，因为这种web桌面式的操作模式如果用在后台，那就大大失去了它的魅力，所以我将它改名，并美其名曰叫框架，因为我不做太多的功能，个性化的功能我一律摒弃，我只做框架本身可能会涉及到的功能。这样可以方便二次开发人员专注于系统开发，而不是修改框架。&lt;/p&gt;&lt;p&gt;开源后，得到了大部分人的支持，但这名字也惹来了一些人的吐槽。至今我也很后悔当初改名叫Hooray Desktop会不会更好，毕竟OS这个饼画的太大了，大到我自己都有点吃不下。&lt;/p&gt;&lt;p&gt;开源后的那一阵子，动力还是挺足的。原因在于有很多人联系我，说想和我合作，帮他们二次开发系统，因为工作原因，大部分我还是推了，因为二次开发的项目太大，加上我不能全职开发，只能抽下班时间进行开发，开发周期比正常开发要长一倍左右，所以只接了几个简单定制的系统，因为功能不多，加上价钱合理，顺理成章的就接了。那段时间是美好的，有人为你的梦想买单，我相信那种感觉你也有过。&lt;/p&gt;&lt;p&gt;开源让我得到了好多，不仅仅是物质上的。我建了QQ群，吸引了很多HoorayOS爱好者，大家提了很多意见，发现了很多bug，为了后期更新版本减少了很大工作量，让我能听取更多方面的意见，融会贯通之后整理出合适的方案，再进行开发，同时还不用我测试，新版本上线都会有一帮人在测试。开源让我的开发效率提升了一个档次，这要换在以前，在制作新功能前，要一个人想好久；开发好后，又要一个个浏览器去测试。&lt;/p&gt;&lt;p&gt;至今，HoorayOS已经更新了4个版本了，后续框架基本的功能大致都完善好后，我将会考虑引入第三方的产品，比如网盘，因为框架本身很难做到这类功能，通过第三方的api进行连接，以插件的形式接入，让开发者想使用的时候只需修改一个参数就可以实现各种不同的第三方api，大大提高开发效率。&lt;/p&gt;&lt;p&gt;HoorayOS具体能走多远我不知道，但我知道它是我第一个正式的作品，我希望让大家都知道它，因为它承载着我的一个未完成的梦想。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/hooray/aggbug/2521330.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/hooray/archive/2012/05/28/2521330.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jv9/archive/2012/05/28/2520731.html</id><title type="text">XAML实例教程系列 - 命名空间(NameSpace)</title><summary type="text">上一篇曾提及XAML中，每个对象元素的声明是对.NET类进行一次实例化操作。XAML作为声明类语言，如何识别对象元素，并如何在.NET Framework中找到对应映射类呢？本篇将引入命名空间（NameSpace）的概念,涉及内容如下：NameSpace命名空间格式核心NameSpace命名空间设计类NameSpace命名空间自定义NameSpace命名空间XAML命名空间的x:Class属性XAML命名空间的x:Name属性和x:Key属性XAML的x:ClassModifier属性和x:FieldModifier属性Silverlight命名空间和Windows 8命名空间的不同XAML命</summary><published>2012-05-28T06:14:00Z</published><updated>2012-05-28T06:14:00Z</updated><author><name>jv9</name><uri>http://www.cnblogs.com/jv9/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jv9/archive/2012/05/28/2520731.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jv9/archive/2012/05/28/2520731.html"/><content type="html">&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120514/2125155405-0.png" width="419" height="129" /&gt;&lt;/p&gt;&lt;p&gt;&lt;a style="text-decoration: none; color: #3366cc; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" href="http://www.cnblogs.com/jv9/archive/2012/05/22/2512899.html" target="_blank"&gt;上一篇&lt;/a&gt;曾提及XAML中，每个对象元素的声明是对.NET类进行一次实例化操作。XAML作为声明类语言，如何识别对象元素，并如何在.NET Framework中找到对应映射类呢？本篇将引入命名空间（NameSpace）的概念,涉及内容如下：&lt;/p&gt;&lt;ol&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;NameSpace命名空间格式&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;核心NameSpace命名空间&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;设计类NameSpace命名空间&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;自定义NameSpace命名空间&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML命名空间的x:Class属性&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML命名空间的x:Name属性和x:Key属性&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML的x:ClassModifier属性和x:FieldModifier属性&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;Silverlight命名空间和Windows 8命名空间的不同&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;XAML命名空间的概念和C#代码中的Using，VB.Net代码中的Import相似，其作用是为对象元素的实例化提供引用类库声明。&lt;/p&gt;&lt;p&gt;简单的理解，当在XAML页面中需要调用某控件对象时，需要提前对该控件对象的类库进行引用声明，而定义XAML命名空间是类库引用声明的一种方法。&lt;/p&gt;&lt;p&gt;本篇将使用Visual Studio&amp;nbsp;11创建一个简单的Silverlight 5项目，通过对比Windows 8和Silverlight项目的命名空间，帮助理解命名空间的使用。&lt;/p&gt;&lt;p&gt;项目名：XamlGuideSL&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img style="height: 408px; border-top-color: ; width: 626px; border-bottom-color: ; border-right-color: ; border-left-color: " border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/jv9/Image00036.jpg" width="626" longdesc="" height="408" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img style="height: 337px; border-top-color: ; width: 421px; border-bottom-color: ; border-right-color: ; border-left-color: " border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/jv9/Image00037.jpg" width="421" longdesc="" height="337" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Visual Studio 11生成的Silverlight 5默认命名空间代码如下：&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154413009-3.jpg" width="673" height="176" /&gt;&lt;/p&gt;&lt;p&gt;对比上一篇Windows 8实例的命名空间代码：&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154414393-4.jpg" width="672" height="171" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;通过比较以上两个命名空间定义，我们可以发现Windows 8和Silverlight 5具有类似的命名空间，例如：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;xmlns:mc=&lt;a style="text-decoration: none; color: #3366cc; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" href="http://schemas.openxmlformats.org/markup-compatibility/2006"&gt;http://schemas.openxmlformats.org/markup-compatibility/2006&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;在移植Silverlight项目到Windows 8平台过程中，WinRT XAML可以兼容Silverlight XAML代码，轻松实现应用平台移植。&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;NameSpace命名空间格式&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在以上代码中&amp;lt;UserControl&amp;gt;或&amp;lt;Page&amp;gt;作为页面Root对象元素被声明，其开始标签&amp;lt;UserControl&amp;gt;或&amp;lt;Page&amp;gt;中，包含了多个&amp;#8220;xmlns&amp;#8221;特性，在XAML语法规则中，&amp;#8220;xmlns&amp;#8221;是属于强制关键字，被用来声明一个命名空间。其语法结构为&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;#8220;xmlns:&amp;#8221;+&amp;#8220;命名空间前缀名&amp;#8221;，&lt;/strong&gt;而对于默认命名空间，无需定义命名空间前缀名。&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115617_1.jpg" width="524" height="191" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;div style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;xmlns:d="http://schemas.microsoft.com/expression/blend/2008"&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"&lt;/div&gt;&lt;/div&gt;&lt;p&gt;以上四个命名空间是Visual Studio 11创建默认项目时自动生成的，其中分别映射了实例化一个Silverlight或Windows 8空白页面所需要的公共类库。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;核心NameSpace命名空间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在以上四个命名空间中，&amp;#8220;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"&amp;#8221;和&amp;#8220;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"&amp;#8221;&lt;/strong&gt;是一个XAML页面的核心命名空间，&lt;/p&gt;&lt;p&gt;对于这两个命名空间的详细解释如下：&lt;/p&gt;&lt;ul&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; line-height: 18px; padding-right: 0px"&gt;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"是默认命名空间，其中包含Silverlight或Windows 8核心类，提供两者基础应用元素支持，作为核心类库命名空间，无需定义命名空间前缀名，该命名空间默认作用于整个页面，从上述代码中可以看出&amp;lt;UserControl&amp;gt;，&amp;lt;Page&amp;gt;都属于该命名空间下的元素对象。作为默认命名空间，直接映射多个.Net Framework核心类库，例如，System.Windows, System.Windows.UIElements, System.Windows.Controls 等类库。&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="font-size: 12pt; font-family: 新宋体; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; line-height: 18px; padding-right: 0px"&gt;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"引用默认XAML类库，其中包含大量XAML语言通用功能类，其作用对页面XAML提供基础以及扩展功能支持。这个命名空间使用&amp;#8220;x&amp;#8221;作为前缀名，表示在XAML页面中可以使用&amp;#8220;x:&amp;#8221;引用该类库。其常用语法结构如下：&amp;lt;x:元素名 /&amp;gt;。例如: &amp;lt;Grid x:Name=&amp;#8220;LayoutRoot&amp;#8221;/&amp;gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;一个完整的XAML页面必须具备以上两个命名空间，否则将无法正常实例化。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;设计类NameSpace命名空间&lt;/strong&gt;&lt;/p&gt;&lt;div align="left"&gt;在设计XAML页面时，Visual Studio和Expression Blend同样需要XAML命名空间支持，帮助实现设计工具内的视图设计模式。所用到的默认命名空间如下：&lt;/div&gt;&lt;ul&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;div style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" align="left"&gt;xmlns:d=http://schemas.microsoft.com/expression/blend/2008，该命名空间引用Expression Blend辅助设计类库，对Visual Studio和Expression Blend视图设计模式提供支持，其实际设计中主要提供设计视图页面尺寸定制。&lt;/div&gt;&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;div style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" align="left"&gt;xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"，该命名空间引用XAML语言辅助类库，对XAML提供辅助设计支持，主要功能是为XAML语法解析器提供辅助解释功能，例如，使用mc:Ignorable=&amp;#8220;d&amp;#8221;告知XAML解析器以&amp;#8220;xmlns:d&amp;#8221;为前缀的元素引用在运行时被忽略。从前文代码中可以看到，xmlns:d命名空间前缀名，使用Expression Blend辅助设计类库中的DesignHeight和DesignWidth，分别定义在设计工具下视图模式中页面显示尺寸，d:DesignHeight="300" d:DesignWidth="400"。正常来说，XAML语法解析器无法识别DesignHeight和DesignWidth，xmlns:mc命名空间则提供Ignorable标识在运行时忽略该引用声明，避免了在编译时XAML语法报错。&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;自定义NameSpace命名空间&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在实际项目中，经常会遇到调用自定义控件类库，其调用方法可以从默认XAML命名空间声明转换得来。&lt;/p&gt;&lt;p&gt;例如，如果需要添加DataGrid数据控件到XamlGuideSL项目中，首先需要添加System.Windows.Controls.Data.dll引用文件到Silverlight项目引用文件目录，&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115640_1.jpg" width="368" height="298" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154412B4-7.jpg" width="423" height="71" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;然后在页面头部声明DataGrid控件所需要的命名空间，XAML页面才能在.Net Framework中初始化该控件。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; height: 250px; border-right: medium none; width: 717px; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154416434-8.jpg" width="717" height="250" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从上图可以看出，添加命名空间引用时，Visual Studio 11自动智能感知，查询当前引用类库列表中所有可用引用，选择&amp;#8220;System.Windows.Controls&amp;#8221;,代码将自动填充到XAML页面。&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115715_1.jpg" width="878" height="190" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;自定义声明一个命名空间：&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns:datagrid="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"&lt;/strong&gt;这段代码中包含三部分的信息：&lt;/p&gt;&lt;ol&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;#8220;xmlns:datagrid&amp;#8221;命名空间前缀名，这个前缀名可以由开发人员自定义，但是必须由&amp;#8220;xmlns:&amp;#8221;作为起始，也就是说，datagrid可以被任何字符替换。根据开发命名标准，推荐开发人员使用简单的控件名表示，提高代码可读性；&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;#8220;clr-namespace:System.Windows.Controls&amp;#8221;表示该命名空间将映射到System.Windows.Controls 公共语言运行环境命名空间类；&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;#8220;assembly=System.Windows.Controls.Data"&amp;#8221;表示DataGrid隶属于System.Windows.Controls.Data.dll动态连接库中，在编译时，该DLL文件将被封装到XAP压缩文件包中。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;完成声明后，调用方法如下：&lt;/p&gt;&lt;p&gt;&amp;lt;datagrid:DataGrid /&amp;gt;&lt;/p&gt;&lt;p&gt;在本篇实例中，使用Expression Blend生成Sample DataSource，绑定到DataGrid控件作为演示（具体步骤这里不再重复，可参考：&lt;a style="text-decoration: none; color: #3366cc; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" href="http://silverlightchina.net/html/tips/2010/0325/896.html" target="_blank"&gt;Expression Blend实例中文教程(6) - 项目控件和用户交互控件快速入门&lt;/a&gt;），最终调用和显示效果如下：&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; height: 134px; border-right: medium none; width: 766px; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154413R8-10.jpg" width="766" height="134" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/1154414537-11.jpg" width="379" height="264" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML命名空间的x:Class属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Silverlight和基于C#,VB.NET的Windows 8 Metro应用是用户界面代码和后台逻辑代码分离的。其中XAML代码用于绘制用户界面，后台逻辑代码可由开发人员喜好选择C#或者Visual Basic。XAML既然继承自XML，也就是说, 其本身不具备事件控制的代码特性。而为了使XAML能够实现与后台逻辑代码交互，则需要在XAML页面代码开始时声明x:Class属性，使其赋值当前页面对应后台页面命名空间，Runtime语法解析器将根据x:Class提供的页面命名空间名自动创建一个类，该类继承自x:Class属性隶属对象元素。完成类创建后，将判断是否该页面是否具有同名后台代码类，如果有，将合并当前生成类到后台代码类中。XAML的x:Class属性只能在页面的根元素中声明一次，表示在页面创建时，保证其包含的所有元素对象仅能被实例化一次。其声明语法格式如下：&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;lt;元素对象 x:Class=&amp;#8220;命名空间.调用类名;assembly=程序集名称&amp;#8221;&amp;#8230;&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&amp;lt;/元素对象&amp;gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;下面我们尝试从实例中理解x:Class属性，在XamlGuideSL项目中,&amp;lt;UserControl&amp;gt;定义x:Class="XamlGuideSL.MainPage", 其含义是该XAML页面继承自UserControl对象元素，其对应的后台代码页面为&amp;#8220;XamlGuideSL.MainPage.cs&amp;#8221;,XAML语法解析器将自动检测并且链接该XAML页面到&amp;#8220;XamlGuideSL.MainPage.MainPage.cs&amp;#8221;，在XAML实例化时，将执行&amp;#8220;XamlGuideSL.MainPage.cs&amp;#8221;后台代码中的构造函数。&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115807_1.jpg" width="442" height="212" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;从Visual Studio 11默认生成后台代码中可以看出当前页面命名空间是&amp;#8220;XamlGuideSL&amp;#8221;，Mainpage类继承自UserControl。在构造函数MainPage()中，将执行InitializeComponent()方法，对XAML页面对象元素进行属性设置，数据绑定以及声明事件等操作。由此可见，InitializeComponent()方法在Silverlight应用初始化时具有非常重要的作用，不能从构造函数中删除。而在创建新的构造函数时，也必须调用该方法，对XAML对象元素进行实例化操作。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML命名空间的x:Name属性和x:Key属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在XAML代码设计时，经常需要对控件或者资源进行命名，所需要使用的属性是x:Name和x:Key。下面的表格对两者使用范围进行对比和描述：&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; height: 605px; border-right: medium none; width: 629px; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115823_1.jpg" width="713" height="665" /&gt;&lt;/div&gt;&lt;p&gt;在实际项目中，控件元素和资源的命名规则是只在需要的时候对控件和资源进行命名操作，这样的好处有以下几点：&amp;nbsp;&lt;/p&gt;&lt;ol&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;减小XAP文件或应用尺寸，加快InitializeComponent初始化调用速度;&lt;/li&gt;&lt;li style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;易于项目维护;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;XAML的x:ClassModifier属性和x:FieldModifier属性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;x:ClassModifier属性和x:FieldModifier属性主要功能是支持在XAML中设置后台对应代码类存取属性.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;x:ClassModifier属性仅能被用于根元素对象，例如，&amp;lt;UserControl&amp;gt;；&lt;/p&gt;&lt;p&gt;x:FieldModifier属性仅能被用于控件元素对象，例如,&amp;lt;TextBox&amp;gt;；&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;在XAML代码中使用x:ClassModifier属性和x:FieldModifier属性后，客户端编译后，会在.g.cs或者.g.vb自动生成代码中重新设置类存取属性。这里需要注意，对于x:ClassModifier根元素对象类存取属性的控制，在XAML代码中修改后，必须同时手工修改对应后台代码中对应元素对象类的存取属性。例如：在下面代码中修改UserControl类存取属性为internal,&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115914_1.jpg" width="873" height="191" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;同时也需要修改对应后台代码XamlGuideSL.MainPage类的存取属性，Visual Studio 11默认创建属性为Public，&lt;/p&gt;&lt;div&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://www.silverlightchina.net/uploads/allimg/120527/1_120527115953_1.jpg" width="451" height="215" /&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;查看.g.cs自动生成代码，&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/115441A20-16.jpg" width="368" height="307" /&gt;&lt;/p&gt;&lt;p&gt;MainPage的类存取属性被编译为internal。&lt;/p&gt;&lt;p&gt;&lt;img style="border-top: medium none; border-right: medium none; border-bottom: medium none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: medium none; padding-right: 0px" border="0" alt="" src="http://silverlightchina.net/uploads/allimg/120527/115441F64-17.jpg" width="628" height="23" /&gt;&lt;/p&gt;&lt;p&gt;由此，x:FieldModifier属性的使用不需要手工修改对应控件后台代码存取属性，直接由XAML设置即可。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;Silverlight命名空间和Windows 8命名空间的不同&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;例如，我们将添加新的引用&amp;#8220;MyAssembly.dll&amp;#8221;到项目，并且添加新的命名空间"MyAssembly.MyNamespace"到XAML代码， 在Silverlight中，命名空间定义：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3333ff; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns:local="clr-namespace:MyAssembly.MyNamespace;assembly:MyAssembly"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;在Windows 8中，命名空间将使用&amp;#8220;using&amp;#8221;替换&amp;#8220;clr-namespace&amp;#8220;，&lt;/p&gt;&lt;p&gt;&lt;span style="color: #3333ff; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;xmlns:local="using:MyAssembly.MyNamespace"&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;今天暂时介绍到这里，欢迎留言讨论。&lt;/p&gt;&lt;p&gt;&lt;a style="text-decoration: none; color: #3366cc; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" href="http://files.cnblogs.com/jv9/XamlGuideSL.zip" target="_blank"&gt;源代码下载&lt;/a&gt;&lt;/p&gt;&lt;p&gt;欢迎大家留言交流，或者加入QQ群交流学习：&lt;/p&gt;&lt;p&gt;&lt;span style="color: #333333; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;22308706(一群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;37891947(二群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;100844510(三群) 高级群200人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;32679922(四群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;23413513(五群) 高级群200人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;32679955(六群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;88585140(八群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;128043302(九群 企业应用开发推荐群) 高级群200人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;101364438(十群) 超级群500人&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /&gt;68435160(十一群 企业应用开发推荐群)超级群500人&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jv9/aggbug/2520731.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jv9/archive/2012/05/28/2520731.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/linxuanchen/archive/2012/05/28/2521272.html</id><title type="text">新浪微博SDK for .Net 4.0第二版正式发布了。</title><summary type="text">可以去此处查看第一版的特性和使用方法首先感谢各位热心博友提出了意见和建议，有了大家的支持，做起事情来就更有动力了^_^第二版SDK的一些新特性采用了新浪官方主推的OAuth2.0进行授权和认证所有接口都升级到了官方V2版的API，也就是说可以用官方V2版的API机型操作了参考了官方PHP版的SDK，将授权认证的方法和API操作的方法独立成了两个类，逻辑上更清晰了使用方法第一步：授权认证传统方式（适用于Web项目）初始化OAuth类获取Authorize地址访问Authorize地址并进行授权，取得code使用OAuth类的GetAccessTokenByAuthorizationCode方法获</summary><published>2012-05-28T06:10:00Z</published><updated>2012-05-28T06:10:00Z</updated><author><name>林选臣</name><uri>http://www.cnblogs.com/linxuanchen/</uri></author><link rel="alternate" href="http://www.cnblogs.com/linxuanchen/archive/2012/05/28/2521272.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/linxuanchen/archive/2012/05/28/2521272.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/linxuanchen/archive/2012/05/24/sina_weibo_sdk.html" target="_blank"&gt;可以去此处查看第一版的特性和使用方法&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;首先感谢各位热心博友提出了意见和建议，有了大家的支持，做起事情来就更有动力了^_^&lt;/p&gt;&lt;p&gt;第二版SDK的一些新特性&lt;/p&gt;&lt;ul&gt;&lt;li&gt;采用了新浪官方主推的OAuth2.0进行授权和认证&lt;/li&gt;&lt;li&gt;所有接口都升级到了官方V2版的API，也就是说可以用官方V2版的API机型操作了&lt;/li&gt;&lt;li&gt;参考了官方PHP版的SDK，将授权认证的方法和API操作的方法独立成了两个类，逻辑上更清晰了&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;使用方法&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一步：授权认证&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;传统方式（适用于Web项目）&lt;/p&gt;&lt;ul&gt;&lt;li&gt;初始化OAuth类&lt;/li&gt;&lt;li&gt;获取Authorize地址&lt;/li&gt;&lt;li&gt;访问Authorize地址并进行授权，取得code&lt;/li&gt;&lt;li&gt;使用OAuth类的GetAccessTokenByAuthorizationCode方法获得AccessToken&lt;/li&gt;&lt;li&gt;完成&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;模拟登录方式（适用于Winform项目和其他项目类型）&lt;/p&gt;&lt;ul&gt;&lt;li&gt;初始化OAuth类&lt;/li&gt;&lt;li&gt;调用OAuth类中的ClientLogin方法，传入账号、密码以及绑定回调地址（ClientLogin方法模拟了上述整个授权过程，实现了一件登录和授权）&lt;/li&gt;&lt;li&gt;完成&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;第二步：实例化操作类&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;至此，授权完成了。接下来用刚才的OAuth作为参数来实例化一个Client操作类。&lt;/p&gt;&lt;p&gt;Client实例化以后，通过API命名空间，即可调用各种方法。&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;&lt;strong&gt;基于正常的授权认证流程&lt;/strong&gt;&lt;/p&gt;&lt;div style="color: black; background-color: white;"&gt;&lt;span style="color: green;"&gt;//初始化oAuth，准备认证&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; oauth = &lt;span style="color: blue;"&gt;new&lt;/span&gt; NetDimension.Weibo.OAuth(&lt;span style="color: #a31515;"&gt;"1028898141"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"78be07c9bcfa30b7871788d3778ce131"&lt;/span&gt;);&lt;br/&gt;&lt;span style="color: green;"&gt;/*&lt;br/&gt; * 正常的流程或Web流程：&lt;br/&gt; * 1. 获取授权地址&lt;br/&gt; * 2. 访问授权地址&lt;br/&gt; * 3. 授权成功后自动跳转至callback指定的网站，并获得code&lt;br/&gt; * 4. 通过code换取access token&lt;br/&gt; */&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; url = oauth.GetAuthorizeURL(&lt;span style="color: #a31515;"&gt;"https://api.weibo.com/oauth2/default.html"&lt;/span&gt;, ResponseType.Code);&lt;span style="color: green;"&gt;//根据授权方法，获得授权地址。&lt;/span&gt;&lt;br/&gt;System.Diagnostics.Process.Start(url);&lt;span style="color: green;"&gt;//模拟弹窗，Console方式直接打开了浏览器，Web项目可以根据需求来使用iframe、新窗口等打开此页面。&lt;/span&gt;&lt;br/&gt;&lt;span style="color: green;"&gt;//打开浏览器，进行授权流程，之后会跳转到callback指定的网址，并获得code&lt;/span&gt;&lt;br/&gt;&lt;span style="color: green;"&gt;//填写刚才得到的code&lt;/span&gt;&lt;br/&gt;Console.Write(&lt;span style="color: #a31515;"&gt;"请填写浏览器地址中的Code参数："&lt;/span&gt;);&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; code = Console.ReadLine();&lt;br/&gt;&lt;span style="color: green;"&gt;//根据code获取AccessToken&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; accessToken = oauth.GetAccessTokenByAuthorizationCode(code, &lt;span style="color: #a31515;"&gt;"https://api.weibo.com/oauth2/default.html"&lt;/span&gt;);&lt;span style="color: green;"&gt;//注意：callback指定的url必须一致&lt;/span&gt;&lt;br/&gt;&lt;span style="color: green;"&gt;//看看我们获得的access token&lt;/span&gt;&lt;br/&gt;Console.WriteLine(accessToken);&lt;br/&gt;&lt;span style="color: green;"&gt;//至此，我们已经获得了AccessToken&lt;/span&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;使用简化流程之后的ClientLogin方法&lt;/strong&gt;&lt;/p&gt;&lt;div style="color: black; background-color: white;"&gt;&lt;span style="color: green;"&gt;//初始化oAuth，准备认证&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; oauth = &lt;span style="color: blue;"&gt;new&lt;/span&gt; NetDimension.Weibo.OAuth(&lt;span style="color: #a31515;"&gt;"1028898141"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"78be07c9bcfa30b7871788d3778ce131"&lt;/span&gt;);&lt;br/&gt;&lt;span style="color: green;"&gt;//简化的认证流程，直接调用ClientLogin。这个方法不需要去申请password方式的认证，只是模拟了上面的步骤并进行了封装&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; result = oauth.ClientLogin(&lt;span style="color: #a31515;"&gt;"&amp;lt;你的微博账号&amp;gt;"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"&amp;lt;你的微博地址&amp;gt;"&lt;/span&gt;, &lt;span style="color: #a31515;"&gt;"https://api.weibo.com/oauth2/default.html"&lt;/span&gt;);&lt;br/&gt;&lt;span style="color: green;"&gt;//返回值为bool型，为true则表示授权、登录成功。为false的话，要不密码错了，要不就是回调地址和新浪后台里面填写的不一样&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;Console.WriteLine(oauth.AccessToken);&lt;br/&gt;&lt;span style="color: green;"&gt;//看看这里获得的AccessToken，理论上应该是和上面那种方法获得的Token一样。&lt;/span&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;接口调用示例&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在上面的步骤中获得AccessToken后，直接将OAuth对象作为参数来实例化一个操作类Client实例。之后的事情，你懂的^_^&lt;/p&gt;&lt;div style="color: black; background-color: white;"&gt;&lt;span style="color: green;"&gt;//实例化一个操作类，用刚才成功获得了AccessToken的OAuth实例&lt;/span&gt;&lt;br/&gt;NetDimension.Weibo.Client Sina = &lt;span style="color: blue;"&gt;new&lt;/span&gt; NetDimension.Weibo.Client(oauth);&lt;br/&gt;&lt;span style="color: green;"&gt;//调用各种方法吧&lt;/span&gt;&lt;br/&gt;Console.WriteLine(Sina.API.Statuses.FriendsTimeline());&lt;span style="color: green;"&gt;//获取最新微博&lt;/span&gt;&lt;br/&gt;Console.WriteLine(Sina.API.Statuses.Update(&lt;span style="color: #a31515;"&gt;"发布一条微博来测试下火力！"&lt;/span&gt; + DateTime.Now.ToLongTimeString()));&lt;span style="color: green;"&gt;//发条微博测试下，不加后面的时间，会产生Exception，不能重复发微博&lt;/span&gt;&lt;br/&gt;&lt;span style="color: green;"&gt;//来个取数据的例子&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;var&lt;/span&gt; mentions = Sina.API.Statuses.Mentions();&lt;span style="color: green;"&gt;//通过&amp;ldquo;提到我的微博&amp;rdquo;接口来获得数据&lt;/span&gt;&lt;br/&gt;&lt;span style="color: green;"&gt;//到 http://open.weibo.com/wiki/2/statuses/mentions 查一下mentions的数据结构，接下来咱们操作下数据。&lt;/span&gt;&lt;br/&gt;&lt;span style="color: blue;"&gt;foreach&lt;/span&gt; (&lt;span style="color: blue;"&gt;var&lt;/span&gt; status &lt;span style="color: blue;"&gt;in&lt;/span&gt; mentions.statuses)&lt;br/&gt;{&lt;br/&gt;&lt;span style="color: blue;"&gt;if&lt;/span&gt; (status.IsDefined(&lt;span style="color: #a31515;"&gt;"user"&lt;/span&gt;))&lt;span style="color: green;"&gt;//这里要判断下是不是有user这个项，一般微博被删除了就不会返回user，直接xxx.user要出错。&lt;/span&gt;&lt;br/&gt;{&lt;br/&gt;Console.WriteLine(&lt;span style="color: blue;"&gt;string&lt;/span&gt;.Format(&lt;span style="color: #a31515;"&gt;"{0} 说：{1}"&lt;/span&gt;, status.user.screen_name, status.text));&lt;span style="color: green;"&gt;//打印用户名和他说的内容&lt;/span&gt;&lt;br/&gt;}&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;类及方法简要说明&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;SDK中的相关方法及方法中的返回值与官方API一致，因此不对此部分内容进行列举。详细的返回内容请参考&lt;a href="http://open.weibo.com/wiki/API%E6%96%87%E6%A1%A3_V2" target="_blank"&gt;官方的API文档&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;OAuth类，封装了授权、认证、登录等操作方法。&lt;/strong&gt;&lt;/p&gt;&lt;table style="border: 1px solid #cccccc; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="2"&gt;&lt;strong&gt;OAuth类&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width: 200px;"&gt;OAuth&lt;/td&gt;&lt;td&gt;构造函数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetAuthorize&lt;/td&gt;&lt;td&gt;获取应用授权地址，并设置返回方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetAccessTokenByAuthorizationCode&lt;/td&gt;&lt;td&gt;通过code方式获取AccessToken&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetAccessTokenByAuthorizationCode&lt;/td&gt;&lt;td&gt;通过password方式获得AccessToken，需要官方申请权限。&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;GetAccessTokenByRefreshToken&lt;/td&gt;&lt;td&gt;通过token方式获取AccessToken，也需要官方申请权限后才能获得RefreshToekn&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ClientLogin&lt;/td&gt;&lt;td&gt;客户端登录，使用模拟code授权的方式完成授权和登录过程（俗称一键登录）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VerifierAccessToken&lt;/td&gt;&lt;td&gt;验证AccessToken的有效性&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Client类，封装了官方API中微博各项操作方法。所有方法均按照分类封装在API命名空间中，方法按照官方的文档进行了分类。参数及返回值可参考官方文档，此处就不再一一列举。&lt;/strong&gt;&lt;/p&gt;&lt;table style="border: 1px solid #cccccc; border-collapse: collapse;" border="1" cellspacing="0" cellpadding="2"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="2"&gt;&lt;strong&gt;Client类&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width: 200px;"&gt;Client&lt;/td&gt;&lt;td&gt;构造函数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="width: 200px;"&gt;API&lt;/td&gt;&lt;td&gt;官方所有接口方法的封装。已经按照官方文档中的分类对各方法进行了封装，方法名称也基本和官方的API保持一致。返回值为JSON，使用DynamicJson进行了动态化，可直接使用xxx.xxx.xxx的形式获取内容，返回内容的数据结构请参考官方文档。&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;本人微博：&lt;a href="http://weibo.com/xuanchenlin"&gt;http://weibo.com/xuanchenlin&lt;/a&gt;&lt;/p&gt;&lt;p&gt;项目托管地址：&lt;a href="http://weibosdk.codeplex.com/"&gt;http://weibosdk.codeplex.com&lt;/a&gt;&lt;/p&gt;&lt;p&gt;欢迎关注，欢迎交流！&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/linxuanchen/aggbug/2521272.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/linxuanchen/archive/2012/05/28/2521272.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yourihua/archive/2012/05/28/2521053.html</id><title type="text">Cowboy 源码分析(十)</title><summary type="text">在上一篇中，由于我对 erlang:decode_packet/3 方法的不理解，所以造成了对 cowboy_http_protocol:request/2 方法的困惑，这一篇，我将结合 erlang Debugger 工具 和 HttpFox 工具来看看，究竟是怎么回事。Debugger 我就不多说了，了解erlang的朋友，应该都知道这个工具，如果你是初学，没用过这个工具，可以参考我之前的一篇文章，使用 debugger 简单调试 erlang 简单介绍了这个工具。HttpFox An HTTP analyzer addon for Firefox，HttpFox monitors a..</summary><published>2012-05-28T05:10:00Z</published><updated>2012-05-28T05:10:00Z</updated><author><name>yourihua</name><uri>http://www.cnblogs.com/yourihua/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yourihua/archive/2012/05/28/2521053.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yourihua/archive/2012/05/28/2521053.html"/><content type="html">&lt;p&gt;在上一篇中，由于我对 erlang:decode_packet/3 方法的不理解，所以造成了对 cowboy_http_protocol:request/2 方法的困惑，这一篇，我将结合 erlang Debugger 工具 和 HttpFox 工具来看看，究竟是怎么回事。Debugger 我就不多说了，了解erlang的朋友，应该都知道这个工具，如果你是初学，没用过这个工具，可以参考我之前的一篇文章，&lt;a id="ctl01_lnkTitle" href="http://www.cnblogs.com/yourihua/archive/2012/05/07/2489388.html"&gt;使用 debugger 简单调试 erlang&lt;/a&gt; 简单介绍了这个工具。HttpFox An HTTP analyzer addon for Firefox，HttpFox monitors and analyzes all incoming and outgoing HTTP traffic between the browser and the web servers. 简单说，HttpFox 可以用来 抓取 HTTP 包。&lt;/p&gt;&lt;p&gt;首先，启动 debugger：debugger:start(). 如果出现下图的界面，表示启动成功：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052811382051.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;接着，添加 cowboy_http_protocol 模块，并设置断点，如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052811425037.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;好了，接下来，我们启动 cowboy_examples：cowboy_examples:start(). 服务器启动完成，&lt;/p&gt;&lt;p&gt;我们打开火狐，同时启动 HttpFox，访问 &lt;a href="http://localhost:8080/"&gt;http://localhost:8080/&lt;/a&gt; 如下图:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052811574390.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;同时，debugger会出现如下界面：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052811590028.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;我们点击 Next 往下走，当我们程序走到 cowboy_http_protocol:wait_request/1 时，我们就可以从调试器中，右下角的监视器中看到从Socket中读取的数据Data了，如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052812065248.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这个Data完整的数据如下：&lt;/p&gt;&lt;p&gt;&amp;lt;&amp;lt;"GET / HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\n\r\n"&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;对比我们从 HttpFox 看到的数据，如下图：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052812173237.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;这里，我们发现，两者的内容是一模一样的，只不过 HttpFox 工具，把排版弄好看了，每一行的数据分开显示。&lt;/p&gt;&lt;p&gt;我们继续往下走，看下 cowboy_http_protocol:parse_request/1 方法：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052812270693.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;我们从监视器可以看到， Buffer，Request，Rest 的值，分别如下：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;Rest =&lt;/span&gt; &lt;/strong&gt;&amp;lt;&amp;lt;"Host: localhost:8080\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\n\r\n"&amp;gt;&amp;gt;&lt;br /&gt;&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;Request =&lt;/strong&gt; &lt;/span&gt;{http_request,'GET',{abs_path,&amp;lt;&amp;lt;"/"&amp;gt;&amp;gt;},{1,1}}&lt;br /&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;Buffer =&lt;/span&gt; &lt;/strong&gt;&amp;lt;&amp;lt;"GET / HTTP/1.1\r\nHost: localhost:8080\r\nUser-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/12.0\r\nAccept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\nAccept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\nAccept-Encoding: gzip, deflate\r\nConnection: keep-alive\r\nCache-Control: max-age=0\r\n\r\n"&amp;gt;&amp;gt;&lt;/p&gt;&lt;p&gt;现在来看，我们对 erlang:decode_packet(http_bin, Buffer, []) 这个方法，比以前是不是了解更多了，如果你觉得这样还不够，那么可以看下源码，欢迎大家跟我分享。&lt;/p&gt;&lt;p&gt;知道了 Request 和 Rest 的值，我们就可以很好的了解 cowboy_http_protocol:request/2 方法：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #000000;"&gt;request({http_request, Method, {abs_path, AbsPath}, Version},&lt;br/&gt;        State&lt;/span&gt;=#state{socket=Socket, transport=&lt;span style="color: #000000;"&gt;Transport,&lt;br/&gt;        req_keepalive&lt;/span&gt;=Keepalive, max_keepalive=&lt;span style="color: #000000;"&gt;MaxKeepalive,&lt;br/&gt;        onresponse&lt;/span&gt;=OnResponse, urldecode={URLDecFun, URLDecArg}=URLDec}) -&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    URLDecode &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;fun&lt;/span&gt;(Bin) -&amp;gt; URLDecFun(Bin, URLDecArg) &lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    {Path, RawPath, Qs} &lt;/span&gt;=&lt;span style="color: #000000;"&gt; cowboy_dispatcher:split_path(AbsPath, URLDecode),&lt;br/&gt;    ConnAtom &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;if&lt;/span&gt; Keepalive &amp;lt; MaxKeepalive -&amp;gt;&lt;span style="color: #000000;"&gt; version_to_connection(Version);&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;true&lt;/span&gt; -&amp;gt;&lt;span style="color: #000000;"&gt; close&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;end&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br/&gt;    parse_header(#http_req{socket&lt;/span&gt;=Socket, transport=&lt;span style="color: #000000;"&gt;Transport,&lt;br/&gt;        connection&lt;/span&gt;=ConnAtom, pid=self(), method=Method, version=&lt;span style="color: #000000;"&gt;Version,&lt;br/&gt;        path&lt;/span&gt;=Path, raw_path=RawPath, raw_qs=Qs, onresponse=&lt;span style="color: #000000;"&gt;OnResponse,&lt;br/&gt;        urldecode&lt;/span&gt;=URLDec}, State);&lt;/div&gt;&lt;p&gt;我们可以从 debugger工具上看到，这些参数的值：&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052813073063.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/40191/2012052813054825.png" alt="" /&gt;&lt;/p&gt;&lt;p&gt;好了，今天就到这，下一篇，我们将继续跟大家分享，接下来的代码，谢谢大家支持。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yourihua/aggbug/2521053.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yourihua/archive/2012/05/28/2521053.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/nixjojo/archive/2012/05/28/2521197.html</id><title type="text">Fetch XML Link Entity 数量限制10个，那就不用LinkEntity吧</title><summary type="text">页面上有一个Lookup field，当选择一个记录时，同时要把这个记录的其他值也带到本页面来，其中有好多是Lookup来的。开始我用LinkEntity来取得它们的名字值，但是后来发现LinkEntity有数量限制，每条查询语句只能有10个LinkEntity，超过就报错，Advanced Find里也是一样的。所以，用LinkEntity并不是一个好办法，而且我只是要取得一个名字的值而已，直觉告诉我不用那么麻烦的。研究了一下，其实Fetchxml取的Lookup的值，不仅有GUID,名字的值也取到了，只不过名字值要经过一定的步骤转化才能拿到。下面是具体方法：首先，我们从返回的xml对象中取</summary><published>2012-05-28T04:58:00Z</published><updated>2012-05-28T04:58:00Z</updated><author><name>Joy Zhong</name><uri>http://www.cnblogs.com/nixjojo/</uri></author><link rel="alternate" href="http://www.cnblogs.com/nixjojo/archive/2012/05/28/2521197.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/nixjojo/archive/2012/05/28/2521197.html"/><content type="html">&lt;p&gt;页面上有一个Lookup field，当选择一个记录时，同时要把这个记录的其他值也带到本页面来，其中有好多是Lookup来的。&lt;/p&gt;&lt;p&gt;开始我用LinkEntity来取得它们的名字值，但是后来发现LinkEntity有数量限制，每条查询语句只能有10个LinkEntity，超过就报错，Advanced Find里也是一样的。&lt;/p&gt;&lt;p&gt;所以，用LinkEntity并不是一个好办法，而且我只是要取得一个名字的值而已，直觉告诉我不用那么麻烦的。&lt;/p&gt;&lt;p&gt;研究了一下，其实Fetchxml取的Lookup的值，不仅有GUID,名字的值也取到了，只不过名字值要经过一定的步骤转化才能拿到。&lt;/p&gt;&lt;p&gt;下面是具体方法：&lt;/p&gt;&lt;p&gt;首先，我们从返回的xml对象中取出我们的要的元素：&lt;/p&gt;&lt;p&gt;var county = oXmlDoc.getElementsByTagName("my_county")[0];&lt;/p&gt;&lt;p&gt;调用一个方法来取得名字值：&lt;/p&gt;&lt;p&gt;var countyName= GetAttributeName(county);&lt;/p&gt;&lt;p&gt;GetAttributeName方法，其实就是把字符串转化为Xml Node，再对里面的属性进行分析，得到我们要的那个属性的值：&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;function&lt;/span&gt;&lt;span style="color: #000000;"&gt; GetAttributeName(xmlNode) {&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; xmlStr =&lt;span style="color: #000000;"&gt; xmlNode.xml;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt;&lt;span style="color: #000000;"&gt; doc;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt; (window.ActiveXObject) {&lt;br/&gt;      doc &lt;/span&gt;= &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; ActiveXObject('Microsoft.XMLDOM'&lt;span style="color: #000000;"&gt;);&lt;br/&gt;        doc.async &lt;/span&gt;= 'false'&lt;span style="color: #000000;"&gt;;&lt;br/&gt;        doc.loadXML(xmlStr);&lt;br/&gt;    } &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;else&lt;/span&gt;&lt;span style="color: #000000;"&gt; {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; parser = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DOMParser();&lt;br/&gt;        doc &lt;/span&gt;= parser.parseFromString(xmlStr, 'text/xml'&lt;span style="color: #000000;"&gt;);&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;var&lt;/span&gt; name = doc.documentElement.attributes.getNamedItem("name"&lt;span style="color: #000000;"&gt;).text;&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; name;&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;好的，这样Id和Name都有了，就可以给目标设值了。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/nixjojo/aggbug/2521197.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/nixjojo/archive/2012/05/28/2521197.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/John-Connor/archive/2012/05/28/2519321.html</id><title type="text">ASP.NET MVC 简单的分页思想与实现</title><summary type="text">作为一个程序猿，数据分页是每个人都会遇到的问题。解决方案更是琳琅满目，花样百出。但基本的思想都是差不多的。 下面给大家分享一个简单的分页器，让初学者了解一下最简单的分页思想，以及在ASP.NET MVC中的简单实现与应用。一，定义分页器类 在ASP.NET MVC中，分页的数据源可能是各种不同的类型，所以最好使用泛型来定义。public class PagingHelper&lt;T&gt; 二，基本三要素 实现分页人所共知的三个基本属性:DataSource：数据源，要知道数据源共计多少条数据，会对应一个数据源的方法－Count()，PageSize：来描述每页显示的记录的条数。PageI.</summary><published>2012-05-28T04:26:00Z</published><updated>2012-05-28T04:26:00Z</updated><author><name>菊花台泡茶</name><uri>http://www.cnblogs.com/John-Connor/</uri></author><link rel="alternate" href="http://www.cnblogs.com/John-Connor/archive/2012/05/28/2519321.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/John-Connor/archive/2012/05/28/2519321.html"/><content type="html">&lt;p&gt;作为一个程序猿，数据分页是每个人都会遇到的问题。解决方案更是琳琅满目，花样百出。但基本的思想都是差不多的。&lt;/p&gt;&lt;p&gt;下面给大家分享一个简单的分页器，让初学者了解一下最简单的分页思想，以及在ASP.NET MVC中的简单实现与应用。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;一，定义分页器类&lt;/strong&gt; &lt;/span&gt;&lt;/p&gt;&lt;p&gt;在ASP.NET MVC中，分页的数据源可能是各种不同的类型，所以最好使用泛型来定义。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; &lt;span style="color: #008080;"&gt;PagingHelper&lt;/span&gt;&amp;lt;T&amp;gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;二，基本三要素&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;实现分页人所共知的三个基本属性:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;DataSource&lt;/span&gt;：数据源，要知道数据源共计多少条数据，会对应一个数据源的方法－&lt;span style="color: #993300;"&gt;Count()&lt;/span&gt;，&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;PageSize：&lt;span style="color: #000000;"&gt;来描述每页显示的记录的条数。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;PageIndex&lt;/span&gt;：当前页的索引值，一般第一页的索引值为0，当然为了表示方便，可以从1开始，&lt;strong&gt;并且后面默认为从1开始。&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div class="cnblogs_code _mce_tagged_br"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;分页数据源&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #008080;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt; DataSource { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每页显示记录的数量&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageSize { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前页数&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageIndex { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;三，扩展属性&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;有了上述三要素，我们可以推论其他三个重要属性&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;PageCount&lt;/span&gt;：总页数，其值取大于或等于 &lt;/span&gt;&lt;span style="color: #000000;"&gt;DataSource.Count/PageSize 的最小整数&lt;/span&gt;&lt;span style="color: #000000;"&gt;，比如5.2页，其实就是6页。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;HasPrev&lt;/span&gt;：用来判断是否有上一页，如果索引 PageIndex 从1开始，那就是判断 PageIndex &amp;gt; 1 是否成立&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;HasNext&lt;/span&gt;：用力判断是否有下一页，如果索引 &lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;PageIndex &lt;/span&gt;&lt;/span&gt;从1开始，需判断 PageIndex &amp;lt; PageCount 是否成立。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;分页总页数&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageCount { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否有前一页&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; HasPrev { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PageIndex &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; } }&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否有下一页&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; HasNext { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PageIndex &amp;lt; PageCount; } }&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;四，核心方法&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;最后就是需要实现分页的核心－获取分页数据的方法:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: #993300;"&gt;GetPagingData()&lt;span style="color: #000000;"&gt;：获取当页的数据，一般常用的手段是跳过&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;PageIndex*PageSize条记录，然后取&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;PageSize&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;条数据。 &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;在.NET中有很多方法可以实现这一过程，这里介绍2个最简单的:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;方法1,从序列的指定位置返回指定数量的连续元素:&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #008080;"&gt;IEnumerable&lt;/span&gt;&amp;lt;TSource&amp;gt; Take&amp;lt;TSource&amp;gt;( &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt; &lt;span style="color: #008080;"&gt;IList&lt;/span&gt;&amp;lt;TSource&amp;gt; list, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; start, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; count )&lt;br/&gt;    {&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt; ( &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; index = start; index &amp;lt; &lt;span style="color: #008080;"&gt;Math&lt;/span&gt;.Min( start + count, list.Count ); index++&lt;span style="color: #000000;"&gt; )&lt;br/&gt;      {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;yield&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; list[index];&lt;span style="color: #008000;"&gt;//yield关键字的用法大家可以参详其他文章&lt;/span&gt;&lt;br/&gt;      }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;那么我们的&lt;span style="color: #993300;"&gt;GetPagingData()&lt;/span&gt;方法就要这么写:&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取当前页数据&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #008080;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt; GetPagingData()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; DataSource.ToList&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt;().Take((PageIndex-1)&amp;times;&lt;span style="color: #000000;"&gt;PageSize&lt;/span&gt;,PageSize);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;其实我更倾向与第二种方法，就是使用&lt;span style="color: #008080;"&gt;IEnumerable&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt;的扩展方法:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: #008080;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;Skip(int count)&lt;/span&gt;：跳过序列中指定数量的元素，然后返回剩余的元素&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: #008080;"&gt;&lt;span style="color: #000000;"&gt;&lt;span style="color: #993300;"&gt;Take(int count)&lt;/span&gt;：从序列的开头返回指定数量的连续元素。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;&lt;span style="color: #000000;"&gt;那么我们的&lt;span style="color: #993300;"&gt;GetPagingData()&lt;/span&gt;只需要这么写就完事:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取当前页数据&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt; GetPagingData()&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; DataSource.Skip((PageIndex - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) *&lt;span style="color: #000000;"&gt; PageSize).Take(PageSize);&lt;br/&gt;}&lt;/span&gt;&lt;/div&gt;&lt;p&gt;这句代码就是跳过 PageIndex - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) *&lt;span style="color: #000000;"&gt; PageSize 条数据&lt;/span&gt;，再取 &lt;span style="color: #000000;"&gt;PageSize 条数据 ，刚刚好就是我们需要的当前页的数据。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #008080;"&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;span style="color: #993300;"&gt;五，构造函数&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;strong&gt;&lt;/strong&gt;实例化一个分页器的时候，我们需要对它进行初始化:&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;  &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; PagingHelper(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageSize, &lt;span style="color: #008080;"&gt;IEnumerable&lt;/span&gt;&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt; dataSource)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.PageSize = pageSize &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ? pageSize : &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.DataSource =&lt;span style="color: #000000;"&gt; dataSource;&lt;br/&gt;            PageCount &lt;/span&gt;= (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)&lt;span style="color: #008080;"&gt;Math&lt;/span&gt;.Ceiling(dataSource.Count() / (&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;)pageSize);&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;p&gt;真正的使用中，你可以重写分页器类，根据你的需要来控制哪些字段是只读的。比如你想随时改变页面元素的数量，那么你可以把PageSize设置为可读写的属性。&lt;/p&gt;&lt;p&gt;至此，这个分页器我们就完工拉。&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;六，与ASP.NET MVC的简单结合&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;span style="color: #000000;"&gt;首先我们通过VS创建一个空的基于Razor视图引擎的ASP.NET MVC3 Web应用程序，命名为JohnConnor.Web&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;对&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;创建过程&lt;/span&gt;&lt;/span&gt;或Razor不太了解的看官，请移步 ASP.NET MVC Razor视图引擎攻略 &lt;a href="http://www.cnblogs.com/John-Connor/archive/2012/05/08/2487200.html" target="_blank"&gt;&amp;lt;传送门&amp;gt;&lt;/a&gt; ，这里就不再赘述了。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;然后我们需要进行以下几步&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;1，Models文件夹下，添加Student.cs文件，添加以下代码，为了演示方便这里模拟了一个数据源，实际中的数据源可能来自数据库。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('8c57bf9d-90a8-4efa-9b03-4c8c3f92c985')"&gt;&lt;div id="cnblogs_code_open_8c57bf9d-90a8-4efa-9b03-4c8c3f92c985" class="cnblogs_code_hide"&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Student&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Id { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Name { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;    }&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Students&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; IEnumerable&amp;lt;Student&amp;gt;&lt;span style="color: #000000;"&gt; data&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;            {&lt;br/&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; List&amp;lt;Student&amp;gt;&lt;span style="color: #000000;"&gt;()&lt;br/&gt;                {&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;0&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;John&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;1&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Marry&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Andy&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;3&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Tom&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;4&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Lydia&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;5&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Chris&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;6&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Justin&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;},&lt;br/&gt;                    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Student{ Id=&lt;span style="color: #800080;"&gt;7&lt;/span&gt;, Name=&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Susan&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;}&lt;br/&gt;                };&lt;br/&gt;            }&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;2，&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;Models文件夹下&lt;/span&gt;&lt;/span&gt;，添加PagingHelper.cs文件，添加我们上述分页器类。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('be91f7cf-4106-4e17-b823-d0b39bc3a73a')"&gt;&lt;div id="cnblogs_code_open_be91f7cf-4106-4e17-b823-d0b39bc3a73a" class="cnblogs_code_hide"&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; PagingHelper&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;分页数据源&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt; DataSource { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;每页显示记录的数量&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageSize { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前页数&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageIndex { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;分页总页数&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; PageCount { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br/&gt;&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否有前一页&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; HasPrev { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PageIndex &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;; } }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;是否有下一页&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; HasNext { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt; { &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; PageIndex &amp;lt;&lt;span style="color: #000000;"&gt; PageCount; } }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;构造函数&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; PagingHelper(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageSize, IEnumerable&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt; dataSource)&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.PageSize = pageSize &amp;gt; &lt;span style="color: #800080;"&gt;1&lt;/span&gt; ? pageSize : &lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.DataSource =&lt;span style="color: #000000;"&gt; dataSource;&lt;br/&gt;            PageCount &lt;/span&gt;= (&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;)Math.Ceiling(dataSource.Count() / (&lt;span style="color: #0000ff;"&gt;double&lt;/span&gt;&lt;span style="color: #000000;"&gt;)pageSize);&lt;br/&gt;        }&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;获取当前页数据&lt;/span&gt;&lt;br/&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;T&amp;gt;&lt;span style="color: #000000;"&gt; GetPagingData()&lt;br/&gt;        {&lt;br/&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; DataSource.Skip((PageIndex - &lt;span style="color: #800080;"&gt;1&lt;/span&gt;) *&lt;span style="color: #000000;"&gt; PageSize).Take(PageSize);&lt;br/&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;3，在Controller文件夹下添加控制器命名为HomeController，添加以下代码。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('20b1835f-ec24-40cb-a16b-4cb467b4130f')"&gt;&lt;div id="cnblogs_code_open_20b1835f-ec24-40cb-a16b-4cb467b4130f" class="cnblogs_code_hide"&gt; &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; HomeController : Controller&lt;br/&gt;    {&lt;br/&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; pageIndex=&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&lt;br/&gt;        {&lt;br/&gt;            PagingHelper&lt;/span&gt;&amp;lt;Student&amp;gt; StudentPaging = &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; PagingHelper&amp;lt;Student&amp;gt;(&lt;span style="color: #800080;"&gt;2&lt;/span&gt;, Students.data);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;初始化分页器&lt;/span&gt;&lt;br/&gt;            StudentPaging.PageIndex = pageIndex;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;指定当前页&lt;/span&gt;&lt;br/&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(StudentPaging);&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;返回分页器实例到视图&lt;/span&gt;&lt;br/&gt;&lt;span style="color: #000000;"&gt;        }&lt;br/&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;4，在View文件夹下添加Home文件夹，并新增视图文件Index.cshtml，添加以下代码。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('58301058-7ba0-463c-8a19-7382e3956db2')"&gt;&lt;div id="cnblogs_code_open_58301058-7ba0-463c-8a19-7382e3956db2" class="cnblogs_code_hide"&gt;&lt;span style="color: #000000;"&gt;@using JohnConnor.Web.Models&lt;br/&gt;@model PagingHelper&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;Student&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;@{&lt;br/&gt;    ViewBag.Title = "Index";&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;Index&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;h2&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;@foreach (var Data in Model.GetPagingData())&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;ID:@Data.Id Name:@Data.Name&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;@if (Model.HasPrev)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Action("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Index", "Home", new { pageIndex &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;= Model.PageIndex &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;- 1 })"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;em &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="color:Gray"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;上一页&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;em&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;@if (Model.HasNext)&lt;br/&gt;{&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;a &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="@Url.Action("&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;Index", "Home", new { pageIndex &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;= Model.PageIndex &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;+ 1 })"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;下一页&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;a&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;else&lt;br/&gt;{&lt;br/&gt;      &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;em &lt;/span&gt;&lt;span style="color: #ff0000;"&gt;style&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;="color:Gray"&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;下一页&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;em&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br/&gt;}&lt;br/&gt;&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;p&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;5，在Global.asax中配置路由，我们修改一下默认路由就可以了。&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;" onclick="cnblogs_code_show('c1994c53-7ef6-4bff-8abd-9b89aaeeacbc')"&gt;&lt;div id="cnblogs_code_open_c1994c53-7ef6-4bff-8abd-9b89aaeeacbc" class="cnblogs_code_hide"&gt;&lt;span style="color: #000000;"&gt;  public static void RegisterRoutes(RouteCollection routes)&lt;br/&gt;        {&lt;br/&gt;            routes.IgnoreRoute("{resource}.axd/{*pathInfo}");&lt;br/&gt;&lt;br/&gt;            routes.MapRoute(&lt;br/&gt;                "Default", // 路由名称&lt;br/&gt;                "{controller}/{action}/{pageIndex}", // 带有参数的 URL&lt;br/&gt;                new { controller = "Home", action = "Index", pageIndex = UrlParameter.Optional } // 参数默认值&lt;br/&gt;            );&lt;br/&gt;&lt;br/&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;现在保存之后F5运行，就可以看到一个简单的分页程序了。&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/396640/2012052812123876.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt; URL在进行了路由配置之后，也不会再是http://localhost:1234/Home/Index?pageIndex=1&lt;/p&gt;&lt;p&gt;而变成了http://localhost:1234/Home/Index/1 这样的静态URL，更简洁，更美观。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;---------------------------------------End---------------------------------------&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;这篇中的提到分页器，只是一个很简易的分页思想的实现，其实本身的性能还是有待提高的。&lt;/p&gt;&lt;p&gt;希望能抛砖引玉，哪位大神能分享出性能更强大的分页程序。&lt;/p&gt;&lt;p&gt;文章中最后提到了URL重写与优化，如果看官们有兴趣，可以参见我之前的文章：&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/John-Connor/archive/2012/04/28/2473911.html" target="_blank"&gt;ASP.NET MVC URL重写与优化(初级篇)-使用Global路由表定制URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/John-Connor/archive/2012/05/03/2478821.html" target="_blank"&gt;ASP.NET MVC URL重写与优化(进阶篇)-继承RouteBase玩转URL&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;span style="color: #000000;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #993300;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/John-Connor/aggbug/2519321.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/John-Connor/archive/2012/05/28/2519321.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/free--coder/archive/2012/05/28/2521135.html</id><title type="text">Ubuntu 12.04 LTS 上安装swift1.4.8</title><summary type="text">操作系统：ubuntu 12.04 LTS，swift版本：1.4.8。四台机器，IP地址分别为：  192.168.1.11,  192.168.1.12,  192.168.1.13,  192.168.1.14.由于swift的全分布式特点，故每个节点都作为存储节点，并选用192.168.1.11作为proxy server。</summary><published>2012-05-28T04:25:00Z</published><updated>2012-05-28T04:25:00Z</updated><author><name>free_coder</name><uri>http://www.cnblogs.com/free--coder/</uri></author><link rel="alternate" href="http://www.cnblogs.com/free--coder/archive/2012/05/28/2521135.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/free--coder/archive/2012/05/28/2521135.html"/><content type="html">&lt;p&gt;&lt;a id="KMContentPageTopID" name="KMContentPageTopID"&gt;&lt;/a&gt;&lt;/p&gt;&lt;div id="divKMOutline" style="border-bottom-style: groove; margin: 10px 0px; border-left-style: none; border-top-style: groove; border-right-style: none;"&gt;&lt;ul style="margin: 0px 0px 0px 20px;"&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732974"&gt;0.环境&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732485"&gt;1.安装依赖库&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732121"&gt;2.准备磁盘&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732668"&gt;3.构建ring&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732252"&gt;4.安装swift&lt;/a&gt;&lt;/li&gt;&lt;ul style="margin: 0px 0px 0px 30px;"&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732216"&gt;4.1 apt-get install安装&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732167"&gt;4.2源代码安装&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732269"&gt;5.更改配置文件&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#WizKMOutline_1338179961732312"&gt;6.启动服务&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;!--more--&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;0.环境&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;操作系统：ubuntu 12.04 LTS，swift版本：1.4.8。四台机器，IP地址分别为：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.11,&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.12,&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.13,&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;192.168.1.14.&lt;/div&gt;&lt;div&gt;由于swift的全分布式特点，故每个节点都作为存储节点，并选用192.168.1.11作为proxy server。&lt;/div&gt;&lt;div&gt;磁盘分区如下：&lt;/div&gt;&lt;div&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/free--coder/201205/201205281239429631.png" alt="" /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;1.安装依赖库&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有节点都需要安装的：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;python-netifaces&lt;div&gt;python-setuptools&lt;/div&gt;&lt;div&gt;python-eventlet&lt;/div&gt;&lt;div&gt;python-pastedeploy&lt;/div&gt;&lt;div&gt;python-xattr&lt;/div&gt;&lt;div&gt;xfsprogs&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;以上软件包可以直接使用apt-get install来安装。一个比较特殊的包：python-webob。该包在ubuntu软件源中的版本是1.1.1（ubuntu12.04）.而这个版本有个bug，会导致swift client使用HEAD无法正常的获取content-length。比如，获取文件尺寸，得到的结果永远是 13。解决方法是在ubuntu软件包网站下载1.0.8版本的deb安装包，然后手工安装。安装包我已经下载，见附件。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;2.准备磁盘&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;选取某一个磁盘分区做存储，本例使用sda5.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;&amp;nbsp;mkfs.xfs -i size=1024 /dev/sda5&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;在/etc/fstab中添加&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;&amp;nbsp;/dev/sda5 /srv/node/sda5 xfs noatime,nodiratime,nobarrier,logbufs=8&amp;nbsp; &amp;nbsp;0&amp;nbsp; &amp;nbsp;0&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;挂载磁盘分区&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;sudo mount /srv/node/sda5&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;3.构建ring&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;swift-ring-builder account.builder create 18 3 1&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;18: 用于指定分区数。分区数目为2的幂次，如18，则分区数是2的18次方。&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;3：文件副本数目&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1：分区移动的最小时间间隔，单位是小时。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;swift-ring-builder account.builder add z1-192.168.1.11:6002/sda5&amp;nbsp; 100&lt;div&gt;swift-ring-builder account.builder add z2-192.168.1.12:6002/sda5&amp;nbsp; 100&lt;/div&gt;&lt;div&gt;swift-ring-builder account.builder add z3-192.168.1.13:6002/sda5&amp;nbsp; 100&lt;/div&gt;&lt;div&gt;swift-ring-builder account.builder add z4-192.168.1.14:6002/sda5&amp;nbsp; 100&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;100 代表设备的权重。可以根据磁盘的容量设定对应值，比如2T的100，则1T的可以是50。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;swift-ring-builder account.builder可以检测配置，确认无误后，使用swift-ring-builder account.builder rebalance重新平衡。成功之后会在当前目录生成 account.ring.gz 文件。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;使用同样的方式构建 container和object的ring。container服务端口是6001，object的服务端口是6000。特别需要注意的是：一旦ring投入使用，更改配置的时候要针对该ring，不能重新构建，否则，很多数据可能会404.&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;最后将生成的account.ring.gz,container.ring.gz,object.ring.gz分发至各个节点的/etc/swift目录。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;4.安装swift&lt;/strong&gt;&lt;/p&gt;&lt;h2 id="WizKMOutline_1338179961732216"&gt;4.1 apt-get install安装&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sudo apt-get install swift即可。&lt;/p&gt;&lt;h2 id="WizKMOutline_1338179961732167"&gt;4.2源代码安装&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;从github上下载源代码。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;&amp;nbsp;git clone &lt;a href="https://github.com/openstack/swift.git"&gt;https://github.com/openstack/swift.git&lt;/a&gt;swift&lt;div&gt;&amp;nbsp;cd swift&lt;/div&gt;&lt;div&gt;&amp;nbsp;git checkout 1.4.8&amp;nbsp;&amp;nbsp; #使用git tag 可以查看所有的版本&lt;/div&gt;&lt;div&gt;&amp;nbsp;sudo python setup.py install --record log.txt&amp;nbsp;&amp;nbsp; # --record log.txt 可以记录安装信息，需要卸载的时候只需执行sudo cat file.txt | xargs rm -rf 。&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;注：使用apt-get install 安装的方式更利于维护和升级。如果要做二次开发的话，使用源代码安装比较好。&lt;/div&gt;&lt;p&gt;&lt;strong&gt;5.更改配置文件&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有的节点都需要配置文件如下：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/etc/rsyncd.conf&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #所有机器配置一样，系统中没有，见附件。&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/etc/default/rsync&amp;nbsp;&amp;nbsp; #系统自带，只需要将RSYNC_ENABLE=false更改为RSYNC_ENABLE=true。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/etc/swift/swift.conf&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;/etc/swift/account-server.conf&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;/etc/swift/container-server.conf&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;/etc/swift/object-server.conf&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;proxy server还要 /etc/swift/proxy-server.conf。除此之外，proxy-server需要安装memcached(sudo apt-get install memcached)做缓存。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;其他的配置见附件。&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;6.启动服务&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果采用源代码安装，则需要添加swift用户(当然也可以不添加，在配置文件里面指定相应的用户名即可)&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;sudo groupadd swift&lt;div&gt;sudo useradd swift -g swift.&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;更改文件的所有者：&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;sudo chown -R swift:swift /etc/swift&lt;div&gt;sudo chown -R swift:swift /srv/node&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;所有节点启动服务：&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;sudo swift-init object-server start&lt;div&gt;sudo swift-init object-replicator start&lt;/div&gt;&lt;div&gt;sudo swift-init object-updater start&lt;/div&gt;&lt;div&gt;sudo swift-init object-auditor start&lt;/div&gt;&lt;div&gt;sudo swift-init container-server start&lt;/div&gt;&lt;div&gt;sudo swift-init container-replicator start&lt;/div&gt;&lt;div&gt;sudo swift-init container-updater start&lt;/div&gt;&lt;div&gt;sudo swift-init container-auditor start&lt;/div&gt;&lt;div&gt;sudo swift-init account-server start&lt;/div&gt;&lt;div&gt;sudo swift-init account-replicator start&lt;/div&gt;&lt;div&gt;sudo swift-init account&lt;span style="font-size: small;"&gt;-auditor start&lt;/span&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;启动proxy-server :&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;blockquote style="text-align: left; widows: 2; text-transform: none; background-color: #eeeeee; text-indent: 0px; margin: 0px 0px 22px; letter-spacing: normal; font: 13px tahoma, arial, helvetica, sans-serif; white-space: normal; orphans: 2; color: #555555; vertical-align: baseline; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; border: #dddddd 1px solid; padding: 10px;"&gt;&amp;nbsp;sudo swift-init proxy-server start&lt;/blockquote&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;&amp;nbsp;&lt;/div&gt;&lt;div&gt;参考资料：&lt;/div&gt;&lt;div&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;1.openstack 官方文档&lt;a href="http://docs.openstack.org/trunk/openstack-object-storage/admin/content/ch_installing-openstack-object-storage.html"&gt;http://docs.openstack.org/trunk/openstack-object-storage/admin/content/ch_installing-openstack-object-storage.html&lt;/a&gt;&lt;/div&gt;&lt;div&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;2.&lt;span style="text-align: left; widows: 2; text-transform: none; background-color: #ffffff; text-indent: 0px; letter-spacing: normal; display: inline !important; font: 20px/30px 'Microsoft YaHei'; white-space: normal; orphans: 2; float: none; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px;"&gt;&lt;span class="Apple-converted-space"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;使用Swauth认证多节点安装Swift &lt;a href="http://blog.csdn.net/cywosp/article/details/7428769"&gt;http://blog.csdn.net/cywosp/article/details/7428769&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;a title="为知笔记" href="http://www.wiz.cn/"&gt;通过 为知笔记 发布&lt;/a&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;&lt;a href="http://files.cnblogs.com/free--coder/swift-config.zip"&gt;附件列表&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/free--coder/aggbug/2521135.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/free--coder/archive/2012/05/28/2521135.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/umbrella_yang/archive/2012/05/28/2521137.html</id><title type="text">[开源]KJFramework.Message 高性能二进制消息框架 -  多元素数组的高性能优化</title><summary type="text">框架的介绍:1. 已经完成了对于消息内部类型的支持(int, short, long, uint, ushort, ulong, bool ,float, double, byte, sbyte, byte[], decimal, DateTime, IntPtr, Guid)2. 支持内部序列化元数据(.NET可序列化的对象) 3. 对于智能对象内部的“智能对象”提供支持。 支持迭代元数据转换。 [说明：] KJFramework框架中内置了一套，可以将网络传输实体自动转换为二进制元数据的能力框架。 使用此框架，将使得用户不在关心底层传输时对于二进制编码/解码的繁琐过程，解放程序员的脑力劳动</summary><published>2012-05-28T04:25:00Z</published><updated>2012-05-28T04:25:00Z</updated><author><name>Kevin.Jee</name><uri>http://www.cnblogs.com/umbrella_yang/</uri></author><link rel="alternate" href="http://www.cnblogs.com/umbrella_yang/archive/2012/05/28/2521137.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/umbrella_yang/archive/2012/05/28/2521137.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;框架的介绍:&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;br /&gt;1. 已经完成了对于消息内部类型的支持(int, short, long, uint, ushort, ulong, bool ,float, double, byte, sbyte, byte[], decimal, DateTime, IntPtr, Guid)&lt;br /&gt;2. 支持内部序列化元数据(.NET可序列化的对象)&lt;br /&gt; 3. 对于智能对象内部的&amp;ldquo;智能对象&amp;rdquo;提供支持。 支持迭代元数据转换。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; [说明：]&lt;br /&gt; KJFramework框架中内置了一套，可以将网络传输实体自动转换为二进制元数据的能力框架。&lt;br /&gt; 使用此框架，将使得用户不在关心底层传输时对于二进制编码/解码的繁琐过程，解放程序员的脑力劳动。&lt;br /&gt; 目前此内置框架被初步定义在命名空间：KJFramework.Messages内，拥有独立Assembly.&lt;br /&gt; 对于智能二进制消息框架, 内部提供了对于诸多类型的支持，甚至可以用于在不编写序列化代码的情况下，&lt;br /&gt; 将一个网络传输实体转换为二进制操作。&lt;br /&gt; 这一切的操作，都全部由内部框架完成，通过简单的属性标签，就可以实现很强大的转换功能。&lt;br /&gt; 目前智能二进制消息框架中，仍保留了内部扩展能力，日后扩展后，将会通过配置文件来增强配置能力。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #ff0000;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;新优化&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #ff0000;"&gt;&lt;span style="font-family: '幼圆';"&gt;&lt;span style="font-family: '幼圆';"&gt;1. 我们不难发现，在数据的传输中，如果在特定的场景下，对于数组的元素数量需求很高，那这将是一个很大的性能瓶颈。&lt;br /&gt;&amp;nbsp; &amp;nbsp;经过测试，我们定义：数组元素个数10，为性能瓶颈的边界值，如果一个数组元素超过此数量则会产生非常大的性能瓶颈。&lt;br /&gt;&amp;nbsp; &amp;nbsp;所以，就在现在，我们特地为常用的数组类型增加了对于超大量数组元素个数的高性能支持，这是一个令人兴奋的优化点。&lt;br /&gt;&amp;nbsp; &amp;nbsp;此次优化所涉及的数组元素类型有： int[], short[], float[], double[], byte[]&lt;br /&gt;2. 除此之外，我们还发现，原来框架中对于byte[]类型的序列化/反序列化并没有提供很好的高性能支持，本次更新中，我们特地&lt;br /&gt;&amp;nbsp; &amp;nbsp;提供了对于这个类型的高性能序列化/反序列化实现。&lt;br /&gt;3. 为本次的更新提供了相关的单元测试&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆';"&gt;&lt;span style="font-family: '幼圆';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;新能力&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;1. 新增轻量级序列化/反序列化帮助器&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt; &amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&amp;nbsp; &amp;nbsp;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #000000;"&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;(1).&amp;nbsp;增加了DataHelper, 这是一个轻量级的序列化/反序列化帮助器&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;哦，是的，框架中除了需要为智能对象提供序列化/反序列化之外，我们的程序中&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;还会经常涉及到一些其余数据类型的二进制数据操作，在以往，我们不得不单独为&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;这些类型做数据处理， 现在，这一切都会变得容易起来，那就是我们提供了轻量级的&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;DataHelper! 好吧，当你的工作中涉及到int, long, array,等等小数据类型的二进制操作时，&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;就来尝试一下吧。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #888888;"&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #000000;"&gt;2. 新增对于.NET可空值类型的支持&lt;/span&gt;:&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #888888;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #000000;"&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(1). 这是一个令人振奋人心的消息，不是吗？ 当我们定制协议的时候，再也不会为了某些值类型的协议字段是否需要下发而苦恼了！现在，一切都变得更加美好，如果我们在定制自定义实体的时候，期望某些值类型字段在某些场景下不需要参与序列化，以省去&lt;br /&gt; 消息序列化的大小，那么，尝试把这些字段设置为可空类型吧(比如 int?,double?,short?......等等).&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;(2). 通过对于可空类型序列化/反序列化成本的评估，我们发现，为当前框架加入此能力，并不会明显的拖慢原有框架性能，&lt;br /&gt; 只会在原有速度上平均慢去 60~100ms+(量级序列化/反序列化的效果), 所以，我们认为这种成本是可以接受的。 &lt;br /&gt;2. 增加了对于可空类型序列化/反序列化的多个单元测试&lt;/span&gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;span style="color: #888888;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #000000;"&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;3. 可自定义的固定字节长度类型:&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;在我们的系统中，通常会存在一种可预知长度的小对象，而这种对象有的时候还是不可缺少的，比如如下这个例子:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;//这个UID类型只是一个例子，实际中可能还会包含多个能力字段&lt;br/&gt;public class UID : IntellectObject&lt;br/&gt;{&lt;br/&gt;  [IntellectProperty(0)]&lt;br/&gt;  public int UserId { get; set; }&lt;br/&gt;  [IntellectProperty(1)]&lt;br/&gt;  public bool IsDirty { get; set; }&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;从上述类定义我们不难看出，一个UID类型标示了一个唯一用户，这种对象，在很多业务场景下都是非常常见的。&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;然而，在服务间的通讯&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;协议&lt;/span&gt;&lt;/span&gt;上，这种类型的传递也是很频繁的。那么，如果通讯协议中频繁的包含此对象，其实是很消耗性能的，为什么呢？&lt;br /&gt;因为，按照此框架的规定，用户自定义的类型，在序列化/反序列化的时候是需要遵循TLV模式的。这样的话，每次每一个字段都会带有4个字节的长度(L).&lt;br /&gt;对于很多系统中的对象，TLV是没有问题的，但是总有类似于上述的自定义对象，在序列化的时候完全可以把这4个字节的长度给省去。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;br /&gt;&lt;br /&gt;那么，该怎么办呢？让我们来考虑以下消息场景，好吧，我们定义了一个消息，来传递该对象:&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;public class DemoMessage : IntellectObject&lt;br/&gt;{&lt;br/&gt;    [IntellectProperty(0)]&lt;br/&gt;    public UID Uid { get; set; }&lt;br/&gt;&lt;br/&gt;    /*Other properties.*/&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;每一次这种消息的传递，我们都不得不使用TLV的形式，将UID对象进行序列化，每次都有字节数量上的冗余。 那么，我们何不进行以下优化呢？&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;#新能力：&lt;br /&gt;&lt;br /&gt; 我们特地的考虑到了以上需求，为KJFramework.Message消息框架内部增加了对于此场景的支持。对于新版本的更新中，我们外露了一个类型&lt;br /&gt;"FixedTypeManager", 通过该类型，使得用户可以在程序初始化的时候打入自定义的固定字节数类型需求。&lt;br /&gt; 当然，我们需要为这个上述的自定义类型提供自身的处理器，并将处理器加入到框架内部的处理器集合中。 这一切看起来就像是这样：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;internal class UIDIntellectTypeProcessor : IntellectTypeProcessor&lt;br/&gt;{&lt;br/&gt;    #region Constructor&lt;br/&gt;&lt;br/&gt;    public UIDIntellectTypeProcessor()&lt;br/&gt;    {&lt;br/&gt;        _supportedType = typeof (UID);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    #endregion&lt;br/&gt;&lt;br/&gt;    #region Overrides of IntellectTypeProcessor&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    ///     从第三方客户数据转换为元数据&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="attribute"&amp;gt;当前字段标注的属性&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="value"&amp;gt;第三方客户数据&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;返回转换后的元数据&amp;lt;/returns&amp;gt;&lt;br/&gt;    /// &amp;lt;exception cref="Exception"&amp;gt;转换失败&amp;lt;/exception&amp;gt;&lt;br/&gt;    public override byte[] Process(IntellectPropertyAttribute attribute, object value)&lt;br/&gt;    {&lt;br/&gt;        UID uid = (UID) value;&lt;br/&gt;        //fixed data length.&lt;br/&gt;        byte[] data = new byte[5];&lt;br/&gt;        Buffer.BlockCopy(BitConverter.GetBytes(uid.UserId), 0, data, 0, 4);&lt;br/&gt;        data[4] = (byte) (uid.IsDirty ? 1 : 0);&lt;br/&gt;        return data;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    ///     从元数据转换为第三方客户数据&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="attribute"&amp;gt;当前字段标注的属性&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="data"&amp;gt;元数据&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;返回转换后的第三方客户数据&amp;lt;/returns&amp;gt;&lt;br/&gt;    /// &amp;lt;exception cref="Exception"&amp;gt;转换失败&amp;lt;/exception&amp;gt;&lt;br/&gt;    public override object Process(IntellectPropertyAttribute attribute, byte[] data)&lt;br/&gt;    {&lt;br/&gt;        return Process(attribute, data, 0, 5);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    /// &amp;lt;summary&amp;gt;&lt;br/&gt;    ///     从元数据转换为第三方客户数据&lt;br/&gt;    /// &amp;lt;/summary&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="attribute"&amp;gt;当前字段标注的属性&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="data"&amp;gt;元数据&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="offset"&amp;gt;元数据所在的偏移量&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;param name="length"&amp;gt;元数据长度&amp;lt;/param&amp;gt;&lt;br/&gt;    /// &amp;lt;returns&amp;gt;返回转换后的第三方客户数据&amp;lt;/returns&amp;gt;&lt;br/&gt;    /// &amp;lt;exception cref="Exception"&amp;gt;转换失败&amp;lt;/exception&amp;gt;&lt;br/&gt;    public override object Process(IntellectPropertyAttribute attribute, byte[] data, int offset, int length = 0)&lt;br/&gt;    {&lt;br/&gt;        int userId = BitConverter.ToInt32(data, offset);&lt;br/&gt;        bool isDirty = BitConverter.ToBoolean(data, offset + 4);&lt;br/&gt;        return new UID {UserId = userId, IsDirty = isDirty};&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    #endregion&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;当然，在程序初始化的时候还需要执行一句话，这句话看起来就像这样：&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;//add UID type to fixed binary data length type.&lt;br/&gt;FixedTypeManager.Add(typeof (UID), 5);&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;这句话的意思是说，我的系统中，我需要为UID类型 设定为支持&lt;strong&gt;固定字节数&lt;/strong&gt;的类型。以后，再遇到UID类型序列化/反序列化的时候，&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;就会使用&lt;strong&gt;给出的字节长度来解析&lt;/strong&gt;，整个的序列化/反序列化过程中，就不会存在L(4个字节的长度)了。 怎么样，这一切都变得更简洁了，不是吗？&lt;br /&gt;一个完整的Test Case,就像下面这样~&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;[TestMethod]&lt;br/&gt;[Description("对于自定义可固定字节数类型的测试")]&lt;br/&gt;public void FixedTypeManagaerTest()&lt;br/&gt;{&lt;br/&gt;    //regist customer type processor.&lt;br/&gt;    IntellectTypeProcessorMapping.Instance.Regist(new UIDIntellectTypeProcessor());&lt;br/&gt;    //add UID type to fixed binary data length type.&lt;br/&gt;    FixedTypeManager.Add(typeof (UID), 5);&lt;br/&gt;    FixedFieldMessage fieldMessage = new FixedFieldMessage{Uid = new UID {UserId = 1, IsDirty = true}};&lt;br/&gt;    fieldMessage.Bind();&lt;br/&gt;    Assert.IsTrue(fieldMessage.IsBind);&lt;br/&gt;    //head total length(4) + property 0 id(1) + property 0 value(5)&lt;br/&gt;    Assert.IsTrue(fieldMessage.Body.Length == 10);&lt;br/&gt;    PrintBytes(fieldMessage.Body);&lt;br/&gt;&lt;br/&gt;    FixedFieldMessage newObj = IntellectObjectEngine.GetObject&amp;lt;FixedFieldMessage&amp;gt;(fieldMessage.Body);&lt;br/&gt;    Assert.IsNotNull(newObj);&lt;br/&gt;    Assert.IsTrue(newObj.Uid.UserId == 1);&lt;br/&gt;    Assert.IsTrue(newObj.Uid.IsDirty);&lt;br/&gt;}&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;怎么样，还不错吧？ &amp;nbsp;快快来体验吧！&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;与此框架类似的通用组件:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;ProtoBuffer - Google.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;此框架的应用:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;可以将此框架应用到网络对象的传输上，也就是说，当我们做一个分布式系统的时候，&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;只需要使用此框架，我们将无需再关心底层消息对象的序列化和反序列化细节，这一切的&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;工作将会由框架内部来完成。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;性能指标:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;此框架的基于.NETFRAMEWORK 4.0开发&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;测试平台: &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;CPU: Intel(R)Xeon(R)CPU X5670 @2.93GHz &lt;/span&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;@2.93GHz&lt;/span&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;(2处理器)&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;System: Windows &lt;/span&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;Server&lt;/span&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;2008 R2 Enterprise&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;定义： &lt;span style="text-decoration: underline;"&gt;复杂对象&lt;/span&gt;，内部包含了多个数组类型的成员，比如string[], int[]，&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 内部还嵌套了其余类。&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;*想看看在这里测试的&lt;span style="text-decoration: underline;"&gt;复杂对象&lt;/span&gt;到底有多复杂吗？ &amp;nbsp;附上测试类的代码&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;*在我们的测试中，使用的是下列代码中的&lt;strong&gt;TestObject&lt;/strong&gt;. 从下列代码中可以看到，此类型拥有很多的数组，而且还包含了其他的子类型&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #888888;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;public class TestObject : IntellectObject&lt;br/&gt;    {&lt;br/&gt;        private TestObject1 _obj;&lt;br/&gt;        [IntellectProperty(7)]&lt;br/&gt;        public TestObject1 Obj&lt;br/&gt;        {&lt;br/&gt;            get { return _obj; }&lt;br/&gt;            set { _obj = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private int[] _mm;&lt;br/&gt;        [IntellectProperty(0)]&lt;br/&gt;        public int[] Mm&lt;br/&gt;        {&lt;br/&gt;            get { return _mm; }&lt;br/&gt;            set { _mm = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private TestObject1[] _pp;&lt;br/&gt;        [IntellectProperty(27)]&lt;br/&gt;        public TestObject1[] Pp&lt;br/&gt;        {&lt;br/&gt;            get { return _pp; }&lt;br/&gt;            set { _pp = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        private String[] _uu;&lt;br/&gt;        [IntellectProperty(28)]&lt;br/&gt;        public String[] Uu&lt;br/&gt;        {&lt;br/&gt;            get { return _uu; }&lt;br/&gt;            set { _uu = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        private TestObject2[] _nn;&lt;br/&gt;        [IntellectProperty(30)]&lt;br/&gt;        public TestObject2[] Nn&lt;br/&gt;        {&lt;br/&gt;            get { return _nn; }&lt;br/&gt;            set { _nn = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private String[] _jj;&lt;br/&gt;        [IntellectProperty(26)]&lt;br/&gt;        public String[] Jj&lt;br/&gt;        {&lt;br/&gt;            get { return _jj; }&lt;br/&gt;            set { _jj = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private int _wokao;&lt;br/&gt;        [IntellectProperty(4)]&lt;br/&gt;        public int Wokao&lt;br/&gt;        {&lt;br/&gt;            get { return _wokao; }&lt;br/&gt;            set { _wokao = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private int _wocao;&lt;br/&gt;        [IntellectProperty(2)]&lt;br/&gt;        public int Wocao&lt;br/&gt;        {&lt;br/&gt;            get { return _wocao; }&lt;br/&gt;            set { _wocao = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private string _woqunimade;&lt;br/&gt;        [IntellectProperty(3)]&lt;br/&gt;        public string Woqunimade&lt;br/&gt;        {&lt;br/&gt;            get { return _woqunimade; }&lt;br/&gt;            set { _woqunimade = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private byte[] _metadata;&lt;br/&gt;        [IntellectProperty(13)]&lt;br/&gt;        public byte[] Metadata&lt;br/&gt;        {&lt;br/&gt;            get { return _metadata; }&lt;br/&gt;            set { _metadata = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;        private byte _metadata1;&lt;br/&gt;        [IntellectProperty(15)]&lt;br/&gt;        public byte Metadata1&lt;br/&gt;        {&lt;br/&gt;            get { return _metadata1; }&lt;br/&gt;            set { _metadata1 = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private TestObject2 _obj2;&lt;br/&gt;        [IntellectProperty(16)]&lt;br/&gt;        public TestObject2 Obj2&lt;br/&gt;        {&lt;br/&gt;            get { return _obj2; }&lt;br/&gt;            set { _obj2 = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private DateTime _time;&lt;br/&gt;        [IntellectProperty(100)]&lt;br/&gt;        public DateTime Time&lt;br/&gt;        {&lt;br/&gt;            get { return _time; }&lt;br/&gt;            set { _time = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    public class TestObject1 : IntellectObject&lt;br/&gt;    {&lt;br/&gt;        private string _haha;&lt;br/&gt;        [IntellectProperty(0)]&lt;br/&gt;        public string Haha&lt;br/&gt;        {&lt;br/&gt;            get { return _haha; }&lt;br/&gt;            set { _haha = value; }&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        private Colors _colors;&lt;br/&gt;        [IntellectProperty(1)]&lt;br/&gt;        public Colors Colors&lt;br/&gt;        {&lt;br/&gt;            get { return _colors; }&lt;br/&gt;            set { _colors = value; }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;    [Serializable]&lt;br/&gt;    public class TestObject2 : IClassSerializeObject&lt;br/&gt;    {&lt;br/&gt;        private int _nice;&lt;br/&gt;        public int Nice&lt;br/&gt;        {&lt;br/&gt;            get { return _nice; }&lt;br/&gt;            set { _nice = value; }&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;/div&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;p&gt;&lt;span style="color: #888888;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #c0c0c0;"&gt;&amp;nbsp;*请注意: 由于性能的提升, 我们在&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;2012年02月28日&lt;/span&gt;&lt;/strong&gt;更新了性能指标!&lt;/span&gt;&lt;/p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;序列化复杂对象(DEBUG)：&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.次数 100000: 1100(ms) &lt;span style="color: #c0c0c0;"&gt;*此值根据测试机器的配置不同而不同，仅供参考&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen0回收次数: 30&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen1回收次数: 12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen2回收次数: 1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;strong&gt;反序列化复杂对象(DEBUG)：&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.次数 100000: 863(ms) &lt;span style="color: #c0c0c0;"&gt;*此值根据测试机器的配置不同而不同，仅供参考&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen0回收次数: 22&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen1回收次数: 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen2回收次数: 0&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;strong&gt;序列化复杂对象(RELEASE)：&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.次数 100000: 950(ms) &lt;span style="color: #c0c0c0;"&gt;*此值根据测试机器的配置不同而不同，仅供参考&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen0回收次数: 30&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen1回收次数: 12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen2回收次数: 1&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&lt;strong&gt;反序列化复杂对象(RELEASE)：&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.次数 100000: 610(ms) &lt;span style="color: #c0c0c0;"&gt;*此值根据测试机器的配置不同而不同，仅供参考&lt;/span&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen0回收次数: 22&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen1回收次数: 1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;.Gen2回收次数: 0&lt;br /&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="color: #c0c0c0;"&gt;*具体的测试截图, 请查看源代码Pictures目录下的图片.&lt;/span&gt; &amp;nbsp;&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;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;数据段格式图:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/44545/2011092813124468.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/44545/2011092813132633.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;更高的自定义需求:&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp; 在此框架中，对于每一个可以序列化的类型(int, string .....等等)，都会为其配备一个智能类型处理器&lt;span style="color: #888888;"&gt;(IIntellectTypeProcessor)&lt;/span&gt;，在框架的使用中，这些处理器都是默认的，如果，您感觉还有更好的实现能够加速&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;当前的序列化或者反序列化流程，那么，您可以在您的系统初始化的时候，使用自己的智能类型处理器来替换系统&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;现有的。 这样，就达到了可自定义类型序列化和反序列化的标准和算法 :) &amp;nbsp;当然，您也可以选择添加一个新的处理器。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp; 其次，在KJFramework.Message中，我们能看到，每一个可序列化的字段，都需要一个智能属性标记&lt;span style="color: #888888;"&gt;[IntellectPropery]&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;而每个这种标记都&lt;/span&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;需要&lt;/span&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;为序列化的字段提供一个唯一的数字序号，就比如：&lt;span style="color: #888888;"&gt;[IntellectProperty(0)]&lt;/span&gt; ，如果当您的自定义类型，需要为一个特殊的字段做特殊处理的时候，可以选择为一个特殊的编号字段来定制一个特殊的智能类型处理器。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;比如，我们的登录消息，如果有一个字段用来存储密码，而我们恰巧需要为此字段进行MD5加密。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp; 那么，该怎么办呢？ &amp;nbsp;当然，办法有很多种，我们可以选择先进行MD5的加密，然后再赋值，也可以选择如下的方式：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;/*以下为代码示例*/&lt;br/&gt;public class LogonMessage : IntellectObject&lt;br/&gt;{&lt;br/&gt;  [IntellectProperty(0)]&lt;br/&gt;  public string UserName{get;set;}&lt;br/&gt;  &lt;br/&gt;   //可以看到，Password字段的序号为1. &lt;br/&gt;   //我们就可以单独添加一个字段处理器 来处理每一个消息实体内包含有序号1的字段&lt;br/&gt;  [IntellectProperty(1)]&lt;br/&gt;  public string Password{get;set;}&lt;br/&gt;}&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;span style="font-family: '幼圆'; font-size: 13px; color: #888888;"&gt; *请不用担心，KJFramework.Message内部会对此操作做特殊的支持，好来完成您的特殊需求 :)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt; &lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;更专业的需求:&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '宋体'; font-size: 14px;"&gt;&amp;nbsp; &amp;nbsp;现在我们已经为一个智能对象(IntellectObject)加入了描述自身的能力&lt;span style="color: #ff0000;"&gt;&lt;strong&gt;&lt;span style="font-family: 'arial', 'helvetica', sans-serif;"&gt;(New)&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;。 也就是说，使用者随时随地&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '宋体'; font-size: 14px;"&gt;都可以通过如下调用 来得到当前对象的字符串形式描述信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #999999;"&gt;&lt;strong&gt;&lt;span style="font-size: 14px; font-family: 'courier new', 'courier';"&gt;&amp;nbsp; &amp;nbsp;IntellectObject.ToString();&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-family: 'courier new', 'courier';"&gt;&amp;nbsp; 当得到了一个对象的描述信息后，我们就能够很轻松的将其记录到日志文件中，这是不是很方便呢?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-family: 'courier new', 'courier';"&gt;在日后，我们将会不停地更新这套框架，这也就意味着，会有越来越多的功能在以后会被加入，&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-family: 'courier new', 'courier';"&gt;如果您感兴趣，我们希望您能够持续关注。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: #000000;"&gt;&lt;span style="font-family: 'courier new', 'courier';"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;附:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-family: '幼圆'; font-size: 14pt;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/strong&gt;&amp;nbsp; 此框架目前已经能够达到初步的商用层次，完全可以当做网络消息协议的序列化和反序列化转换层来使用，&lt;/p&gt;&lt;p&gt;&amp;nbsp; 相信使用过GOOGLE的ProtoBuffer的朋友都应该明白了。我会一直更新此框架，如果您的项目中有此类需求，&lt;/p&gt;&lt;p&gt;&amp;nbsp; 那么您可以选择尝试一下这套框架， 不会让您失望的 :)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;项目地址：&lt;a href="http://message.codeplex.com/" target="_blank"&gt;http://message.codeplex.com/&amp;nbsp;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;目前此项目已经发布了Release版本，您可以选择直接下载二进制文件使用，或者下载源代码 :)&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp;如果在使用此框架的途中，有任何问题，您也可以选择与我联系，我将提供最优的技术支持。&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; QQ:250623008&lt;/p&gt;&lt;p&gt;&amp;nbsp; &amp;nbsp; Email: Kevin.Jee@live.cn&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;p&gt;谢谢.&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: '幼圆'; font-size: 13px;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/umbrella_yang/aggbug/2521137.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/umbrella_yang/archive/2012/05/28/2521137.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/wangiqngpei557/archive/2012/05/28/2521138.html</id><title type="text">业务模型的价值(程序员的另外一条出路)</title><summary type="text">最近一直忙于新公司的基础库建设和一些业务系统的开发，接触到了一些比较有思想的技术人员，在他们身上发觉到了很多值的深思的话题，也领悟到了一些比较有价值的经验在此与同行们分享一下也算是探讨一下吧；[王清培版权所有，转载请给出署名]都说技术人员应该重视业务的学习和培养，只有精通业务了才能更好的发挥技术。其实我是不太赞成这句话的，为什么？从我的个人经历和经验来看，这是对的。当然世事无绝对，站在我们程序员的角度讲，我绝对建议技术人员始终要以技术为主业务为辅的观点。可能有些朋友要来火了，技术辅助业务应该是业务大于技术，凡事都是相对的。如果以业务为主，就等于把自己的小命送给公司管了，如果以技术为主那么小命还是自己保管的。这句话经历过的人才会懂，我就不解释了。</summary><published>2012-05-28T04:25:00Z</published><updated>2012-05-28T04:25:00Z</updated><author><name>南京.王清培</name><uri>http://www.cnblogs.com/wangiqngpei557/</uri></author><link rel="alternate" href="http://www.cnblogs.com/wangiqngpei557/archive/2012/05/28/2521138.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/wangiqngpei557/archive/2012/05/28/2521138.html"/><content type="html">&lt;p&gt;最近一直忙于新公司的基础库建设和一些业务系统的开发，接触到了一些比较有思想的技术人员，在他们身上发觉到了很多值的深思的话题，也领悟到了一些比较有价值的经验在此与同行们分享一下也算是探讨一下吧；&lt;span style="color: #6666cc;"&gt;[王清培版权所有，转载请给出署名]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;都说技术人员应该重视业务的学习和培养，只有精通业务了才能更好的发挥技术。其实我是不太赞成这句话的，为什么？从我的个人经历和经验来看，这是对的。当然世事无绝对，站在我们程序员的角度讲，我绝对建议技术人员始终要以技术为主业务为辅的观点。可能有些朋友要来火了，技术辅助业务应该是业务大于技术，凡事都是相对的。如果以业务为主，就等于把自己的小命送给公司管了，如果以技术为主那么小命还是自己保管的。这句话经历过的人才会懂，我就不解释了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1：业务、技术如何平衡&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;中国的行情我想我们都了解，对于一般的企业来说，技术不重要，重要的是能在最短的时间内出东西。80%的IT企业都是属于这种类型的，他们要求程序员快速的熟悉业务知识，然后就开始参与项目的开发。&lt;/p&gt;&lt;p&gt;大部分是重复劳动，程序员都在做些基本的增、删、改、查的工作。而且这些工作都是经过层层封装的，程序员接触到的技术面非常的窄。长期这样下去定力不足的程序员就会受到周围环境的影响。有的可能选择转行，有的可能选择做业务、做实施。其实这个时候我们应该勇于的选择，应该坚持自己的理想。当然这需要兴趣的支撑。&lt;/p&gt;&lt;p&gt;改行我就不发表看法了，毕竟人各有志。这篇文章讨论的主题是业务和技术的结合，如何在技术和业务之间提炼核心的领域模型，让我们的技术更有用武之地。&lt;/p&gt;&lt;p&gt;那么站在公司的角度讲我们应该多去学习业务知识，技术一般都是放在一些架构师手上，我们只要学会使用公司的框架就行了。&lt;/p&gt;&lt;p&gt;技术辅助于业务，搞业务的人始终觉得业务大于技术，技术人员应该听他们的。这种现象很普遍，至少我接触到的公司都是这样的。他们让程序员改什么就改什么，因为他们不懂程序的错综复杂，可能一点点的不合理都有可能造成程序的整体结构变动，带来的工作量可能是开发的几倍。领导又可能会说，你们能不能设计一个很模块化的，高内聚低耦合的插件系统或者又是什么新的名词。我们可能很无语，因为他们不懂技术？哪有一劳永逸的系统啊；&lt;/p&gt;&lt;p&gt;其实矛盾点就在于如果我们技术人员用大精力去学习业务知识，我们相对学习技术的时间会很少，那么我们就是把自己和公司绑在了一起。这个时候我们考虑的问题的角度是不同的，如果你重视业务那么你可能需要公司对你的提拔或者说是你的饭碗是捏在公司手上的，如果公司哪天看你不顺眼，你就失业了。如果我们的技术一直是领先的，那么我不怕你公司不要我，我到哪里都是能生活的。可能说这句话有点自私，但是我到觉得程序员应该学会保护自己。&lt;span style="color: #6666cc;"&gt;[王清培版权所有，转载请给出署名]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;如果真的觉得你的领导值得你去追随，那么你就好好学习业务吧；如果公司真的没有值得你付出的地方，那请你好好学习技术吧；&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2：程序员如何学习业务&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们程序员该如何学习业务？我觉得我们应该有选择的学习，不要所有东西都学。&lt;/p&gt;&lt;p&gt;一个公司的业务可能很简单也可能很复杂，我们要选择跟系统相关的业务，做哪块我们学习哪块，最重要的是有业务模型的概念在脑子里，这中模型化的思想可以看看《领域驱动设计》。&lt;/p&gt;&lt;p&gt;为什么要说有业务模型的概念呢？其实这是一种慢慢培养我们设计能力的方式。程序员学习业务知识在概念上一定要明确，不能模糊，因为这些概念都要在系统中体现的。如果我们理解上是模模糊糊的那么我们写的代码也是含糊不清的，在和同事交流的时候我们的模块可能造成其他模块的不明确，这时候瓶颈就来了。&lt;/p&gt;&lt;p&gt;我们学习业务知识一定要记得能否在代码中体现整体结构，能否提炼出业务模型；&lt;/p&gt;&lt;p&gt;图1:&lt;/p&gt;&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2012/202205/2012052812223948.jpg" alt="" /&gt;&lt;/p&gt;&lt;p&gt;我们学习业务知识要适当的归类，将某一条业务线上的对象抽象出来。&lt;/p&gt;&lt;p&gt;如果我们能善于在代码中表达业务，那么这和光使用技术来实现基本功能要强了很多。至少这是设计类的工作。(设计能力体现技术层次)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3：结合业务、技术提炼业务模型&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在和一些搞领域模型的人聊天的时候，能感受到很强烈的模型感。他们对业务的理解很苛刻，不允许存在半点模糊。为什么要强调这么细致呢？这能使他们的模型更加健壮稳固。往往他们的竞争力非常的明显，精通业务和技术。&lt;/p&gt;&lt;p&gt;但是又与我们所见到的业务不同，他们能将业务顺利的过度到代码上。他们能将业务梳理的很工整，我们只要稍微了解一点业务就可以参与项目的开发，在代码中完全是按照业务的模型来构造的。这种人一旦熟悉了某个行业之后，是绝对的领域专家了。&lt;/p&gt;&lt;p&gt;总结：&lt;/p&gt;&lt;p&gt;其实上面废话一堆，也算是我最近来的一点小小的感悟吧。&lt;/p&gt;&lt;p&gt;技术是我们程序员的生命线，只有在技术上占据绝对的优势才能保住饭碗。然后将我们的技术提升到一个建模境界，那就真的技术服务于人了。谢谢；&lt;/p&gt;&lt;img src="http://www.cnblogs.com/wangiqngpei557/aggbug/2521138.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/wangiqngpei557/archive/2012/05/28/2521138.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
