<?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/u/13626/rss</id><updated>2011-12-19T09:23:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/13626/rss"/><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293615.html</id><title type="text">松耦合服务调用利器-服务分发器</title><summary type="text">引言 对象和对象之间是通过消息来进行通信的。具体过程如下： 创建对象a 创建对象b 创建请求消息request 调用对象b的方法 对象b返回对应的response通过上面的过程可以看出通信的调用方需要依赖如下元素：被调用方 （服务契约）请求消息request( 数据契约）被调用方的方法（操作契约）响应消息（数据契约）那么我们可以把通信的过程通过引入一个间接层-服务分发器来解耦对象间的之间通信，具体过程如下： 创建对象a 创建服务分发器dipatcher 创建请求消息request 调用分发器的分发方法 分发器创建对象b,并调用对象b的方法 对象b返回对应的response 给分发器，分发器把.</summary><published>2011-12-19T09:23:00Z</published><updated>2011-12-19T09:23:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293615.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293615.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;引言&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对象和对象之间是通过消息来进行通信的。具体过程如下：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建对象a&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建对象b&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建请求消息request&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 调用对象b的方法&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; 对象b返回对应的response&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;通过上面的过程可以看出通信的调用方需要依赖如下元素：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;被调用方 （服务契约）&lt;/li&gt;&#xD;
&lt;li&gt;请求消息request( 数据契约）&lt;/li&gt;&#xD;
&lt;li&gt;被调用方的方法（操作契约）&lt;/li&gt;&#xD;
&lt;li&gt;响应消息（数据契约）&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;那么我们可以把通信的过程通过引入一个间接层-&lt;strong&gt;服务分发器&lt;/strong&gt;来解耦对象间的之间通信，具体过程如下：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建对象a&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建服务分发器dipatcher&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 创建请求消息request&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 调用分发器的分发方法&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 分发器创建对象b,并调用对象b的方法&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; 对象b返回对应的response 给分发器，分发器把response结果返回给对象a&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;服务分发器接口定义&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;定义服务分发器接口&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;[Contract]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; IServiceDispatcher&lt;br /&gt;    {&lt;br /&gt;        IServiceResponse Dispatch(IServiceRequest req);&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;定义请求接口&lt;/pre&gt;&#xD;
&lt;pre &gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; inter  IServiceRequest&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; ServiceName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&#xD;
        &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; OperationName { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&#xD;
        IDictionary&amp;lt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;,&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&amp;gt; Arguments { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&#xD;
    }&lt;/pre&gt;&#xD;
&lt;pre &gt;定义响应接口&lt;/pre&gt;&#xD;
&lt;div&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; IServiceResponse &#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;bool&lt;/span&gt; Success { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&#xD;
        &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; Result { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&#xD;
        Exception[] Exceptions { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; }&#xD;
    }&lt;br /&gt;&amp;nbsp;&amp;nbsp; 定义服务分发器门面类ServiceDispatcher &lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre&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; ServiceDispatcher&#xD;
    {&#xD;
      &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; IServiceResponse Dispatch(IServiceRequest req);&#xD;
      &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; TResult Dispatch&amp;lt;TResult&amp;gt;(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; serviceName, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; operationName);&#xD;
      &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;static&lt;/span&gt; TResult Dispatch&amp;lt;TResult&amp;gt;(&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; serviceName, &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; operationName, &lt;span style="color: #0000ff;"&gt;object&lt;/span&gt; requestArgs)&#xD;
     }&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;服务分发器功能特征&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul style="list-style-type: square;"&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务类不能是抽象的&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务类必须以&amp;ldquo;Service&amp;rdquo;结尾（效仿mvc控制器的约定）&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务类支持别名&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务Action必须是BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 如果服务Action上含有IgnoreAttribute标签则忽略&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务Action支持方法重载&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务Action支持别名&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 服务Action暂不支持引用参数和输出参数&amp;nbsp;&amp;nbsp;&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 支持参数模型绑定机制&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 支持Filter机制&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp; 支持分布式调用&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;支持和MVC进行整合（把控制器的功能整合到服务中，不需要开发控制器）&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;整合Mini容器&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Demo &lt;strong&gt;例子&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;添加NLite.dll 引用（可以从&lt;a href="http://nlite.codeplex.com"&gt;NLite 官网&lt;/a&gt;下载)&lt;/li&gt;&#xD;
&lt;li&gt;添加Ndf.dll 引用 （可以从 &lt;a href="http://ndf.codeplex.com"&gt;Ndf官网&lt;/a&gt;下载）&lt;/li&gt;&#xD;
&lt;li&gt;创建一个CalculateService&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;div&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; NLite;&#xD;
&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; ConsoleDemo&#xD;
{&#xD;
    [Component]&#xD;
    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; CalculateService&#xD;
    {&#xD;
        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Add(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a + b;&#xD;
        }&#xD;
        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Sub(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a - b;&#xD;
        }&#xD;
        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Multiply(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a * b;&#xD;
        }&#xD;
        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; Divide(&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; a, &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; b)&#xD;
        {&#xD;
            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; a / b;&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;4. 添加测试程序&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; System;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; NLite;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; NLite.Cfg;&#xD;
&lt;span style="color: #0000ff;"&gt;using&lt;/span&gt; NLite.Domain;&#xD;
&#xD;
&lt;span style="color: #0000ff;"&gt;namespace&lt;/span&gt; ConsoleDemo&#xD;
{&#xD;
    &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Program&#xD;
    {&#xD;
        &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;[] args)&#xD;
        {&#xD;
            &lt;span style="color: #008000;"&gt;//Config Ndf 组件&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; Configuration().Configure();&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;//Registery CalculteService in current assembly&lt;/span&gt;&#xD;
            ServiceRegistry.RegisteryFromAssemblyOf&amp;lt;Program&amp;gt;();&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;//call CalculteService.Add method&lt;/span&gt;&#xD;
            &lt;span style="color: #0000ff;"&gt;int&lt;/span&gt; result = &lt;strong&gt;ServiceDispatcher.Dispatch&lt;/strong&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;("&lt;span style="color: #8b0000;"&gt;calculate&lt;/span&gt;", "&lt;span style="color: #8b0000;"&gt;add&lt;/span&gt;", &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { a = 2, b = 3 });&#xD;
            Console.WriteLine("&lt;span style="color: #8b0000;"&gt;2 + 3 = &lt;/span&gt;" + result.ToString());&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;//call CalculteService.Sub method&lt;/span&gt;&#xD;
            result = &lt;strong&gt;ServiceDispatcher.Dispatch&lt;/strong&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;("&lt;span style="color: #8b0000;"&gt;calculate&lt;/span&gt;", "&lt;span style="color: #8b0000;"&gt;sub&lt;/span&gt;", &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { a = 2, b = 3 });&#xD;
            Console.WriteLine("&lt;span style="color: #8b0000;"&gt;2 - 3 = &lt;/span&gt;" + result.ToString());&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;//call CalculteService.Multiply method&lt;/span&gt;&#xD;
            result = &lt;strong&gt;ServiceDispatcher.Dispatch&lt;/strong&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;("&lt;span style="color: #8b0000;"&gt;calculate&lt;/span&gt;", "&lt;span style="color: #8b0000;"&gt;multiply&lt;/span&gt;", &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { a = 2, b = 3 });&#xD;
            Console.WriteLine("&lt;span style="color: #8b0000;"&gt;2 * 3 = &lt;/span&gt;" + result.ToString());&#xD;
&#xD;
            &lt;span style="color: #008000;"&gt;//call CalculteService.Divide method&lt;/span&gt;&#xD;
            result = &lt;strong&gt;ServiceDispatcher.Dispatch&lt;/strong&gt;&amp;lt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&amp;gt;("&lt;span style="color: #8b0000;"&gt;calculate&lt;/span&gt;", "&lt;span style="color: #8b0000;"&gt;divide&lt;/span&gt;", &lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; { a = 2, b = 3 });&#xD;
            Console.WriteLine("&lt;span style="color: #8b0000;"&gt;2 / 3 = &lt;/span&gt;" + result.ToString());&#xD;
&#xD;
            Console.Read();&#xD;
        }&#xD;
    }&#xD;
}&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;运行结果如下：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/10072/2011121916573224.png" alt="" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;最后附上&lt;a href="http://files.cnblogs.com/netcasewqs/%E6%9C%8D%E5%8A%A1%E5%88%86%E5%8F%91%E5%99%A8-Demo.zip"&gt;Demo代码&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2293615.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293615.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293144.html</id><title type="text">为ASP.NET MVC创建一个基于Mini容器的ControllerFactory</title><summary type="text">背景 随着Asp.net mvc的越来越流行，关于和Mvc整合的DI容器也非常的多，而Mini容器一致没有把整合的方案发布出来，以至于不时的收到有些网友询问这些事，于是便有了该文。[源代码从这里下载，Mini容器官方地址]解决方案 创建自定义工厂 public class NLiteControllerFactory : DefaultControllerFactory { private IServiceLocator ServiceLocator; public NLiteControllerFactory(IServiceLocator s...</summary><published>2011-12-19T04:13:00Z</published><updated>2011-12-19T04:13:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293144.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293144.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;strong&gt;背景&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;随着Asp.net mvc的越来越流行，关于和Mvc整合的DI容器也非常的多，而Mini容器一致没有把整合的方案发布出来，以至于不时的收到有些网友询问这些事，于是便有了该文。[&lt;a href="http://files.cnblogs.com/netcasewqs/Mini_ControllerFactory_Demo.zip"&gt;源代码&lt;/a&gt;从这里下载，&lt;a href="http://nlite.codeplex.com"&gt;Mini容器&lt;/a&gt;官方地址]&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;解决方案&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 创建自定义工厂 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; NLiteControllerFactory : DefaultControllerFactory&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;private&lt;/span&gt; IServiceLocator ServiceLocator;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; NLiteControllerFactory(IServiceLocator serviceLocator)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.ServiceLocator = serviceLocator;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;override&lt;/span&gt; IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; (IController)ServiceLocator.Get(controllerType);&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;Demo 例子&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了演示效果效果, 用Artech兄的&lt;a href="http://www.cnblogs.com/artech/archive/2011/12/13/ASP-mvc-unity.html"&gt;为ASP.NET MVC创建一个基于Unity的ControllerFactory&lt;/a&gt;这篇博客的例子了. 要创建一个维护联系人的应用，我们通过具有如下定义的Contact类型表示联系人，而IContactRepository接口定义了一个从存储中获取所有联系人的GetAllContacts方法，DefaultContactRepository是对IContactRepository接口的实现&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; Contact&lt;br /&gt;    {&lt;br /&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;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Gender { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;string&lt;/span&gt; Address { &lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;; &lt;span style="color: #0000ff;"&gt;set&lt;/span&gt;; }&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    [Contract]&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt; IContactRepository&lt;br /&gt;    {&lt;br /&gt;        IEnumerable&amp;lt;Contact&amp;gt; GetAllContacts();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; DefaultContactRepository : IContactRepository&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IEnumerable&amp;lt;Contact&amp;gt; GetAllContacts()&lt;br /&gt;        {&lt;br /&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: #0000ff;"&gt;new&lt;/span&gt; Contact&lt;br /&gt;            {&lt;br /&gt;                Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Zhang San&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                Gender = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Male&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                Address = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#328, XingHu Street, Su Zhou, Jiang Su Province, PRC.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;            };&lt;br /&gt;&lt;br /&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: #0000ff;"&gt;new&lt;/span&gt; Contact&lt;br /&gt;            {&lt;br /&gt;                Name = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Li Si&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                Gender = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Female&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;,&lt;br /&gt;                Address = &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;#328, Jin Ji Hu Road, Su Zhou, Jiang Su Province, PRC.&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;br /&gt;            };&lt;br /&gt;        }&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;我们在Web应用的主页显示联系人列表，为此我创建了如下一个HomeController。在这里我们演示的是构造器注入，所以我们通过构造函数指定的IContactRepository对象来初始化Repository属性。在Action方法Index中调用IContactRepository的GetAllContacts方法为对应的View指定Model。  &lt;/pre&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; HomeController : Controller&lt;br /&gt;    {&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; IContactRepository Repository { &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;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; HomeController(IContactRepository repository)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Repository = repository;&lt;br /&gt;        }&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; ActionResult Index()&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: #0000ff;"&gt;return&lt;/span&gt; View(&lt;span style="color: #0000ff;"&gt;this&lt;/span&gt;.Repository.GetAllContacts());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;    }&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre &gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;在Global 文件中注册Mvc 的自定义控制器工厂&lt;/pre&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;class&lt;/span&gt; MvcApplication : System.Web.HttpApplication&lt;br /&gt;    {&lt;br /&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; RegisterGlobalFilters(GlobalFilterCollection filters)&lt;br /&gt;        {&lt;br /&gt;            filters.Add(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; HandleErrorAttribute());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&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; RegisterRoutes(RouteCollection routes)&lt;br /&gt;        {&lt;br /&gt;           routes.IgnoreRoute(&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;favicon.ico&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;);&lt;br /&gt;           routes.IgnoreRoute(&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;br /&gt;&lt;br /&gt;            routes.MapRoute(&lt;br /&gt;                &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Default&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; Route name&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;{controller}/{action}/{id}&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 with parameters&lt;/span&gt;&lt;span style="color: #008000;"&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 = UrlParameter.Optional } &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt; Parameter defaults&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            );&lt;br /&gt;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff;"&gt;void&lt;/span&gt; Application_Start()&lt;br /&gt;        {&lt;br /&gt;            AreaRegistration.RegisterAllAreas();&lt;br /&gt;&lt;br /&gt;            RegisterGlobalFilters(GlobalFilters.Filters);&lt;br /&gt;            RegisterRoutes(RouteTable.Routes);&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建Mini容器&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            NLiteEnvironment.Refresh();&lt;br /&gt;            &lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置组件的生命周期缺省是临时的&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            LifestyleType.Default = LifestyleFlags.Transient;&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;注册联系人仓储组件&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            ServiceRegistry.Register&amp;lt;DefaultContactRepository&amp;gt;();&lt;br /&gt;&lt;br /&gt;            &lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;设置自定义控制器工厂&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;            ControllerBuilder.Current.SetControllerFactory(&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt; NLiteControllerFactory(ServiceLocator.Current));&lt;br /&gt;        }&lt;br /&gt;    }&amp;nbsp;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre &gt;Index.cshtml代码如下所示，这是一个Model类型为IEnumerable&amp;lt;Contact&amp;gt;的View，它将所有的联系人信息列出来。 &lt;/pre&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;@model IEnumerable&lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt; NLite&lt;/span&gt;&lt;span style="color: #ff0000;"&gt;.Mvc.Models.Contact&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   @{&lt;br /&gt;       ViewBag.Title = "Index";&lt;br /&gt;   }&lt;br /&gt;    &lt;br /&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;Contact List&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;br /&gt;    &lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   @foreach (var contact in this.Model)&lt;br /&gt;   { &lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;h3&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;@contact.Name&lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;h3&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&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;Gender: @contact.Gender&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;br /&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;Address: @contact.Address&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;br /&gt;           &lt;span style="color: #0000ff;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;hr &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;li&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;ul&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: #0000ff;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000;"&gt;div&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;pre &gt;运行浏览器显示效果&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/artech/201112/201112131639191766.png" alt="" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2293144.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/12/19/2293144.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085252.html</id><title type="text">数据库性能优化-摘录</title><summary type="text">1. 树表设计，建议在树表中增加字段TreePath 2. 记录超过一百万的表要考虑是否需要使用分区表。对于能够明确确定分区字段，并且经常通过分区访问记录的。分区表会提高查询性能。 3. 反范式 在第三范式设计的基础上，针对具体的数据情况和应用访问数据情况进行的设计，使用适当的数据冗余和数据不一致风险，提供更高的数据访问性能，以保障应用的性能要求。 4. 避免使用Select * 5. 使用Set代替Select进行赋值 6.必要的时候，使用关键字”NOLOCK”避免锁定 7.不需要排序的时候，不要使用关键字”Order 8.字符列字节长度小于等于10时，使用char或者nchar 9.字符.</summary><published>2011-06-20T07:12:00Z</published><updated>2011-06-20T07:12:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085252.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085252.html"/><content type="html">&lt;p&gt;1. 树表设计，建议在树表中增加字段TreePath&lt;/p&gt;&#xD;
&lt;p&gt;2. 记录超过一百万的表要考虑是否需要使用分区表。对于能够明确确定分区字段，并且经常通过分区访问记录的。分区表会提高查询性能。&lt;/p&gt;&#xD;
&lt;p&gt;3. 反范式&lt;/p&gt;&#xD;
&lt;p&gt;在第三范式设计的基础上，针对具体的数据情况和应用访问数据情况进行的设计，使用适当的数据冗余和数据不一致风险，提供更高的数据访问性能，以保障应用的性能要求。&lt;/p&gt;&#xD;
&lt;p&gt;4. 避免使用Select *&lt;/p&gt;&#xD;
&lt;p&gt;5. 使用Set代替Select进行赋值&lt;/p&gt;&#xD;
&lt;p&gt;6.&amp;nbsp;必要的时候，使用关键字&amp;rdquo;NOLOCK&amp;rdquo;避免锁定&lt;/p&gt;&#xD;
&lt;p&gt;7.&amp;nbsp;不需要排序的时候，不要使用关键字&amp;rdquo;Order&lt;/p&gt;&#xD;
&lt;p&gt;8.&amp;nbsp;字符列字节长度小于等于&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;10&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;时，使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;char&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;或者&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;nchar&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 9.&amp;nbsp;&lt;/span&gt;字符列字节长度大于&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;10&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;时，使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;varchar&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;或者&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;nvarchar&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;（实际长度设置需要根据业务需要仔细规划，长度关系到存储空间，关系到缓存占用）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&amp;nbsp; &amp;nbsp; 10.&amp;nbsp;&lt;/span&gt;需要使用小数时，不要使用数据类型&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;float&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，而使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;decimal&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;11.&amp;nbsp;&lt;/span&gt;日期存储时，使用&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;datetime&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，不要使用字符类型&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&amp;nbsp; &amp;nbsp; 12.&amp;nbsp;&lt;/span&gt;请不要使用&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;ntext&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;text&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;image&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;数据类型，而使用&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;nvarchar(max)&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;varchar(max)&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;，&lt;/span&gt;&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;varbinary(max)&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;类型&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&amp;nbsp; &amp;nbsp; 13.&amp;nbsp;&lt;/span&gt;考虑自增长列的长度（例如：部件关系表数据量会溢出&lt;span face="Times New Roman" style="font-family: 'Times New Roman';"&gt;int&lt;/span&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;类型数据的范围）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;14. &amp;nbsp;索引&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;*&lt;/span&gt;组合或者引用关系的子表（数据量较大的时候），需要在关联主表的列上建立非聚集索引（如订单明细表中的产品ID字段、订单明细表中关联的订单ID字段）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;索引键的大小不能超过900个字节，当列表的大小超过900个字节或者若干列的和超过900个字节时，数据库将报错。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;表中如果建有大量索引将会影响INSERT、UPDATE和DELETE语句的性能，因为在表中的数据更改时，所有的索引都将必须进行适当的调整。需要避免对经常更新的表进行过多的索引，并且索引应保持较窄，就是说：列要尽可能的少。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;为经常用于查询的谓词创建索引，如用于下拉参照快速查找的code、name等。在平台现有下拉参照的查询sql语句中的like条件语句要改成不带前置通配符。还有需要关注Order By和Group By谓词的索引设计，Order By和Group By的谓词是需要排序的，某些情况下为Order By和Group By的谓词建立索引，会避免查询时的排序动作。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;对于内容基本重复的列，比如只有1和0，禁止建立索引，因为该索引选择性极差，在特定的情况下会误导优化器做出错误的选择，导致查询速度极大下降。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;当一个索引有多个列构成时，应注意将选择性强的列放在前面。仅仅前后次序的不同，性能上就可能出现数量级的差异。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&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 size="3" style="font-size: small;"&gt;对小表进行索引可能不能产生优化效果，因为查询优化器在遍历用于搜索数据的索引时，花费的时间可能比执行简单的表扫描还长，设计索引时需要考虑表的大小。记录数不大于100的表不要建立索引。频繁操作的小数量表不建议建立索引（记录数不大于5000条）&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;阻塞原因&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在默认事务隔离情况下，数据库事务越长，一方面独占锁被持有的时间越长，写操作阻塞读操作的机会就越多；另一方面，在默认的读提交隔离模式下，读操作使用共享锁与独占锁不兼容，读操作也会阻塞写操作。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;阻塞也是死锁产生的基本条件，改善了阻塞就能有效减少死锁。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在软件开发后期，在对大数据量的集成测试工程中，通过活动查看器可以观察到阻塞情况，主要产生阻塞的原因就是读和写相互阻塞在对同一个大表的操作上。因此对于读写阻塞问题需要加以足够考虑。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;减少阻塞一些指导原则&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;整体原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;归结起来也依赖于代码、sql的优化，一方面要使逻辑代码优化到最快。另一方面，一个耗时较长的sql语句将会阻塞全部用户等待几十秒甚至几分钟，针对查询sql语句的优化也是最重要的。&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;修改批量操作的需求，批量操作耗时和记录数量是成正比的。为此设计时要避免在同一个自动事务服务方法中做批量的循环操作，可以将循环操作放到UI控制端，这一就使一个长事务变成多个短小的事务，将减少阻塞的机会。&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;减少读写操作使用锁的数量，比如减少批更新操作中修改行的数量，保证行锁定少，同时减少锁升级至表锁的机会。&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;一些耗时大、锁定数据多的操作需要避免和正常业务操作冲突，可以使用调度计划在系统闲置的时候来运行，或者使用互斥机制来保证其它用户暂退出操作独立运行，视业务情况而定。&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span&gt;读写锁阻塞的处理原则&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;减少读操作需要的共享锁&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;1、将事务隔离级别由默认读提交（ReadCommited）修改成读未提交（ReadUnCommited）,将不会有读写阻塞，但是会造成读取其它事务未提交的数据。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;方法一：如果服务方法为自动事务，则在服务方法特性SerivceMethod指定IsolationLevel属性为ReadUnCommited&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;方法二：对于使用手工事务的情况，使用DBSession接口带隔离级别参数的方法session.beginTransaction(IsolationLevel), level值为&amp;nbsp; ReadUnCommited.&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;2、在select语句中带NoLock提示，事务内无锁提示也不会有读写阻塞，与上面一样也会有脏读。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;Select上加无锁控制，在执行select操作时加 with(nolock)。如：SELECT * FROM person WITH(NoLock)&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;上面两种方式需要平台和业务涉及人员根据情况使用。事务隔离级别控制粒度较粗，使用时需要考虑对多个select语句的影响，NoLock提示控制单个select语句，粒度更细。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;&lt;span size="3" style="font-size: small;"&gt;&lt;span&gt;&lt;span&gt;*&lt;/span&gt;&lt;/span&gt;在sqlserver2005中使用基于行版本的快照隔离模式&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在快照模式下，读取数据不再使用共享锁，阻塞的现象能大大减少。&lt;/p&gt;&#xD;
&lt;p&gt;方法：在建立数据库后执行下面命令：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;ALTER DATABASE 替换的数据库名 SET READ_COMMITIED_SNAPSHOT ON;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ALTER DATABASE 替换的数据库名 SET ALLOW_SNAPSHOT_ISOLATION ON;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;注意：sqlserver2005和with(no lock)语句，这两种方案都能够避免阻塞，但是这两种方式是有区别的。&lt;/p&gt;&#xD;
&lt;p&gt;举个小例子说明一下：比如数据库表T1中有两个字段Col1且其默认值为1.此时恰好有个A事务通过Update语句修改表T1的Col字段值为2，但还未提交，如下：&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;A事务：&lt;/p&gt;&#xD;
&lt;p&gt;{&lt;/p&gt;&#xD;
&lt;p&gt;Begion tran&lt;/p&gt;&#xD;
&lt;p&gt;Update T1 set Col1=2&lt;/p&gt;&#xD;
&lt;p&gt;//Commit;//注释掉此句，模拟A事务未提交。&lt;/p&gt;&#xD;
&lt;p&gt;}&lt;/p&gt;&#xD;
&lt;p&gt;这时如果另一个事务如果使用Sql server2005的快照模式获取T1表Col1字段的值则取到的值是之前默认的1；而使用with（no lock）的方式获取到Col1字段的值为2.&lt;/p&gt;&#xD;
&lt;p&gt;其实不管使用哪种方式，得到的数据都不确保是准确的，这要取决于A事务是否执行并提交成功。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;==============================================================================================&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;死锁原因：&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;死锁是由两个相互阻塞的线程组成，它们互相等待对方完成，一般死锁情况下两个数据库事务之间存在着相反的操作。sqlserver中死锁监视器定时检查死锁，如果发现死锁，将选择其中回滚消耗最小的任务，这时候发生1025数据库错误。可以通过启用sqlserver2005快照模式，避免一些读/写的逆向阻塞造成的死锁.但是对于一些写/写阻塞的死锁可能无法解决，很多时候需要从业务的角度来避免一些写/写的逆向操作阻塞情况。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 死锁问题的解决很困难，但是可以通过一些手段来使死锁最小化。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;死锁最小化方法：&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 从理论上讲，数据库死锁无法避免，但是可以遵循一定原则使死锁发生的概率尽量降低。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;写/写死锁&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;*&lt;/span&gt;用相同的顺序访问对象，如果涉及到多于一张表的操作，要保证事务中都按照相同的顺序访问这些表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;*&lt;/span&gt;减少一个事务中的大批量更新的操作，大批量操作写操作涉及记录独占锁太多而且一直到事务结束才能释放，更容易与其它事务造成死锁。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;读/写死锁（&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;原则上与前面提到的减少读/写阻塞方式一致&lt;/span&gt;&lt;/span&gt;）&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span&gt;*&lt;/span&gt;去掉读操作的共享锁&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 最佳方式是使用sql2005的快照模式，其次方式是使用读未提交隔离模式或使用NOLock提示，需要平台和业务设计时依据情况进行sql组织的设计。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 按照相同的顺序访问对象可以避免相互持有对方请求资源的情况发生。例如一个操作主从表的处理流程，涉及查询和修改两个步骤。如果查询时是先查主表再查从表，则修改也应先修改主表再修改从表。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;span size="3" style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 另一个降低事务大小的一个主要手段，是将查询操作尽可能地提前（包括使用一些中间变量记录下查询结果提供后续使用），而把插入、修改等操作集中在方法靠后的部分。这样，可以让一个事务需要持有独占锁的时间尽可能缩短，减少死锁的发生概率。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;==============================================================================================&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span size="5" style="font-size: large;"&gt;1、参数化sql&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于一般简单查询，数据库能自动参数啊以重用计划缓存，如：&lt;/p&gt;&#xD;
&#xD;
&#xD;
&#xD;
&lt;p&gt;在sqlserver内部能自动参数化这个查询，SELECT * FROM table WHERE id=@1&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;但是一旦sql语句中带有join、union、top&amp;hellip;&amp;hellip;等关键字，sqlserver内部将不会自动参数化。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;在sql2005中，通过alter database XXX set paramenterization forced的强制参数化命令能够将所有sql中的常量参数化，但是强制参数化会因为常量类型不一致造成查询结果误差。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span size="5" style="font-size: large;"&gt;2、使用查询中的索引有效&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; a）、单列索引使用原则&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;单列索引能响应大部分的简单比较，包括等价和不等价。对于like操作无前置通配符也是有效的。如：&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div align="left"&gt;&#xD;
&lt;table cellspacing="0" cellpadding="2" border="1"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&lt;strong&gt;能有效使用索引的条件语句：&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;[col1]=1&amp;nbsp;&lt;br /&gt;[col1]&amp;gt;100&amp;nbsp;&lt;br /&gt;[col1] between 0 and 100&amp;nbsp;&lt;br /&gt;[col1] like 'abc%'&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&#xD;
&lt;pre&gt;&lt;strong&gt;下列条件语句不会有效利用索引:&lt;/strong&gt;&lt;/pre&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&#xD;
&lt;pre&gt;ABS([col1])=1&lt;/pre&gt;&#xD;
&lt;pre&gt;[col1]+1&amp;gt;100 &lt;/pre&gt;&#xD;
&lt;pre&gt;[col1]+10 between 0 and 100 &lt;/pre&gt;&#xD;
&lt;pre&gt;[col1] like '%abc%' &lt;/pre&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;&#xD;
&lt;pre&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; b)、避免在WHERE字句中对字段进行函数或表达式操作&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;看一下下面效率低下的例子和其解决方法&lt;/p&gt;&#xD;
&#xD;
&lt;table cellspacing="0" cellpadding="2" border="1"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&lt;strong&gt;效率低下的写法：&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE SafetystockLevel/2=100&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&lt;strong&gt;高效写法：&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="400"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE SafetystockLevel=2*100&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&#xD;
&#xD;
&lt;p&gt;下面是SQLServer2005的优化报告&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lijun198504/WindowsLiveWriter/Sql_128BC/image_4.png" target="_blank"&gt;&lt;img title="image" height="183" alt="image" src="http://images.cnblogs.com/cnblogs_com/lijun198504/WindowsLiveWriter/Sql_128BC/image_thumb_1.png" width="644" border="0" /&gt;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 类似的例子：&lt;/p&gt;&#xD;
&#xD;
&lt;table cellspacing="0" cellpadding="2" border="1"&gt;&#xD;
&lt;tbody&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="430"&gt;&lt;strong&gt;效率低下的写法&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;td valign="top" width="574"&gt;&lt;strong&gt;高效的写法&lt;/strong&gt;&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="430"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE SubString(name,1,3)=&amp;rsquo;abc&amp;rsquo;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="574"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE name like &amp;rsquo;abc%&amp;rsquo;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;tr&gt;&#xD;
&lt;td valign="top" width="430"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE datediff(day ,modifiedDate,&amp;rsquo;2005-11-30&amp;rsquo;)=0&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;td valign="top" width="574"&gt;&#xD;
&lt;p&gt;SELECT&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&lt;br /&gt;FROM&amp;nbsp; Production.Product&lt;br /&gt;WHERE modifiedDate&amp;gt;=&amp;rsquo;2005-11-30&amp;rsquo; andmodifiedDate&amp;lt;&amp;rsquo;2005-12-1&amp;rsquo;&lt;/p&gt;&#xD;
&lt;/td&gt;&#xD;
&lt;/tr&gt;&#xD;
&lt;/tbody&gt;&#xD;
&lt;/table&gt;&#xD;
&#xD;
&#xD;
&#xD;
&lt;p&gt;任何对列的操作都将导致表扫描，它包括数据库函数、计算表达式等等，查询时要尽可能将操作移至等号右边。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;避免使用&lt;strong&gt;！=或&amp;lt;&amp;gt;、is null 或is not null、 in、not in&lt;/strong&gt;等这样的操作符，因为这会是系统无法使用索引，而只能直接搜索表中数据。&lt;/p&gt;&#xD;
&lt;p&gt;例如：&lt;/p&gt;&#xD;
&lt;p&gt;select id from employee where id!=&amp;rsquo;B%&amp;rsquo;&lt;/p&gt;&#xD;
&lt;p&gt;优化器将无法通过索引来确定将要命中的行数，因此需要搜索该表的所有行。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp; c)、多列索引使用原则&lt;/strong&gt;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;则应考虑列的顺序。用于等于(=)、大于(&amp;gt;)、小于(&amp;lt;)或between搜索条件的where 字句或者参与联接的列应该放在最前面。其它列应该基于其非重要级别进行排序，就是说，从最不重复的列到最重复的列。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;例如：&lt;/p&gt;&#xD;
&lt;p&gt;如果表中存在索引定义为LastName、FirstName,则该索引在搜索条件为where LastName=&amp;rsquo;Smith&amp;rsquo;或where LastName=Smith and FirstName like &amp;rsquo;j%&amp;rsquo;时将很有用。不过，查询优化器不会将此索引用于基于FirstName(where FirstName=&amp;rsquo;Jane&amp;rsquo;)而搜索的查询。&lt;/p&gt;&#xD;
&lt;p&gt;==============================================================================================&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span size="5" style="font-size: large;"&gt;一、SQL拼写建议&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1、查询时不返回不需要的行、列&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;业务代码要根据实际情况尽量减少对表的访问行数，最小化结果集，在查询时，不要过多地使用通配符如：select * from table1语句，要用到几列就选择几列，如：select col1,col2 from table1;在可能的情况下尽量限制结果集行数如：select top 100 col1,col2,col3 from talbe2,因为某些情况下用户是不需要那么多的数据的。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2、合理使用EXISTS, NOT EXISTS字句&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如下所示：&lt;/p&gt;&#xD;
&lt;p&gt;SELECT SUM(T1.C1) FROM T1 WHERE ((SELECT COUNT(*) FROM T2 WHERE T2.C2=T1.C2)&amp;gt;0)&lt;/p&gt;&#xD;
&lt;p&gt;SELECT SUM(T1.C1) FROM T1 WHERE EXISTS(SELECT * FROM T2 WHERE T2.C2=T1.C2)&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;两种产生相同的结果，但是后者的效率显然要高过于前者。银行后者不会产生大量锁定的表扫描或是索引扫描。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;经常需要些一个T_SQLL语句比较一个父结果集和子结果集，从而找到是否存在在父结果集中有而在子结果集中乜嘢的记录，如：&lt;/p&gt;&#xD;
&lt;p&gt;SELECT _a.hdr_key FROM hdr_tb1 a&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; -----------tb1 a 表示tb1用别名a代替&lt;/p&gt;&#xD;
&lt;p&gt;WHERE NOT EXISTS (SELECT * FROM dt1_tb1 b WHERE a.hdr_key = b.hdr_key)&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;SELECT _a.hdr_key FROM hdr_tb1 a&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; -----------tb1 a 表示tb1用别名a代替&lt;/p&gt;&#xD;
&lt;p&gt;LEFT JION dt1_tb1 b ON&amp;nbsp; a.hdr_key = b.hdr_key WHERE b.hdr_key IS NULL&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;SELECT hdr_key&amp;nbsp; FROM hdr_tb1&lt;/p&gt;&#xD;
&lt;p&gt;WHERE hdr_key NOT IN (SELECT hdr_key FROM dt1_tb1)&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;三种写法都可以得到同样的结果集，但是效率是&lt;strong&gt;依次降低&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3、充分利用连接条件&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;在某种情况下，两个表之间可能不止一个的连接条件，这时在where 字句中将谅解条件完整的写上，有可能大大提高查询速度。&lt;/p&gt;&#xD;
&lt;p&gt;例：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;a)、&lt;/strong&gt;SELECT SUM(A.AMOUNT) FROM ACCOUNT A left jion CARD B on A.CARD_NO = B.CARD_NO&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;strong&gt;b)、&lt;/strong&gt;SELECT SUM(A.AMOUNT) FROM ACCOUNT A left jion CARD B on A.CARD_NO = B.CARD_NO AND A.ACCOUNT_NO = B.ACCOUNT_NO&lt;/p&gt;&#xD;
&lt;p&gt;第二句将比第一句执行&lt;strong&gt;快得多&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4、WHERE 字句中关系运算符的选择&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;a)、&lt;/strong&gt;在关系运算中，尽量使用=，尽量不要使用&amp;lt;&amp;gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;b)、&lt;/strong&gt;WHERE字句中尽量不要使用NOT运算符，如：NOT IN ,NOT EXISTS, NOT&amp;gt;、NOT&amp;lt;等等NOT运算符一般可以去除。如NOT SALARY &amp;gt;10000K可以改为：salary&amp;lt;=100,如避免使用NOT IN,可以使用 left outer jion代替它。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;c)、&lt;/strong&gt;where 字句中条件表达式间逻辑关系为AND时，将条件为假的概率高的放在前面，概率相同、条件计算简单的放在前面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;d)、&lt;/strong&gt;尽可能不要用Order by字句。使用Order by时，尽量减少列数、尽量减少排序数据行数、排序字段尽量是数字型（尽量不要是字符型）。GROUP BY、 SELECT DITINCT、UNION等字句，也经常导致Order运算。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;e)、&lt;/strong&gt;不要使用Select count(*)方式来判断记录是否存在，建议使用Select top 1 from table1 where &amp;hellip;&amp;hellip;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;f)、&lt;/strong&gt;不要使用Group by而没有聚合列。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;g)、&lt;/strong&gt;避免Select 语句的Where 字句条件用于假。如：where 1=0;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;h)、&lt;/strong&gt;如果有多表连接时，应该有主从表之分，并尽量从一个表读取数，如select a.col1,a.col2 from a jion b on a.col3=b.col4 where b.col5=&amp;rsquo;a&amp;rsquo;.&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;i)、&lt;/strong&gt;在where 字句中，如果有多个过滤条件，应将所有列或过滤记录数量最多的条件应该放在前面。&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span size="5" style="font-size: large;"&gt;二、使用Truncate清空表&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Truncate会将表中记录全部清空，而不能有选择性的删除指定记录。而DELETE可以指定删除的记录。由于Truncate操作在TransactionLog中只记录被Truncate的页号，而DELETE需要记载被删除记录的详细内容，因此Truncate会比DELETE更迅速。对大数据表使用Truncate，效果更加明显。Truncate Table只会删除表中记录。而不会对表的索引和结构造成影响。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;strong&gt;&lt;span size="5" style="font-size: large;"&gt;三、Union和Union all&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;Union将两个结果集合并后，会消除重复记录，而Union all不会消除重复记录，而是直接将两个结果集直接合并。明确得知两个结果集中没有重复记录或者重复记录不影响使用，建议使用Union all 代替Union。因为Union在消除重复记录的过程中需要进行排序过滤操作，对大结果集这种排序操作会非常影响性能。下面是Union 和Union all的简单性能比较：&lt;/p&gt;&#xD;
&lt;p&gt;---------------Union&lt;/p&gt;&#xD;
&lt;p&gt;select * from table1 where code=&amp;rsquo;01&amp;rsquo;&lt;/p&gt;&#xD;
&lt;p&gt;Union&lt;/p&gt;&#xD;
&lt;p&gt;select * from table1 where code=&amp;rsquo;02&amp;rsquo;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;---------------Union all&lt;/p&gt;&#xD;
&lt;p&gt;select * from table1 where code=&amp;rsquo;01&amp;rsquo;&lt;/p&gt;&#xD;
&lt;p&gt;union all&lt;/p&gt;&#xD;
&lt;p&gt;select * from talbe1 where code=&amp;rsquo;02&amp;rsquo;&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lijun198504/WindowsLiveWriter/Sql_13F74/image_4.png" target="_blank"&gt;&lt;img title="image" height="396" alt="image" src="http://images.cnblogs.com/cnblogs_com/lijun198504/WindowsLiveWriter/Sql_13F74/image_thumb_1.png" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;==============================================================================================&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span face="宋体" style="font-family: 宋体;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2085252.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085252.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085245.html</id><title type="text">Web 高性能开发汇总</title><summary type="text">以下内容收集了Web高性能开发的相关文章1. Http服务器：让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求大规模网站架构实战之体系结构（一）大规模网站架构之WEB加速器SQUID(二)iis负载均衡 Nginx 常见配置总结nginx实现网站负载均衡(windows+IIS负载实测)玩玩负载均衡---在window与linux下配置nginxWindows版本nginx大型架构.net平台篇(WEB层均衡负载nginx)2、性能测试工具推荐3、图片篇.4、如何加载JS，JS应该放在什么位置.5、为什么要减少请求数，如何减少请求数.6、减少请求，响应.</summary><published>2011-06-20T06:53:00Z</published><updated>2011-06-20T06:53:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085245.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085245.html"/><content type="html">&lt;p&gt;以下内容收集了Web高性能开发的相关文章&lt;/p&gt;&#xD;
&lt;h1 &gt;1. Http服务器：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h4 &gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/1852394.html"  id="ctl02_TitleUrl"&gt;让Windows Server 2008+IIS 7+ASP.NET支持10万个同时请求&lt;/a&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span style="font-size: 14px;"&gt;&lt;a id="ctl02_TitleUrl"  href="http://www.cnblogs.com/design-life/archive/2010/02/24/1672529.html"&gt;大规模网站架构实战之体系结构（一）&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;&lt;span style="font-size: 14px;"&gt;&lt;a id="ctl02_TitleUrl"  href="http://www.cnblogs.com/design-life/archive/2010/03/15/1686196.html"&gt;大规模网站架构之WEB加速器SQUID(二)&lt;/a&gt;&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://wenku.baidu.com/view/625fa33283c4bb4cf7ecd1f6.html"&gt;i&lt;wbr&gt;&lt;/wbr&gt;i&lt;wbr&gt;&lt;/wbr&gt;s&lt;wbr&gt;&lt;/wbr&gt;负&lt;wbr&gt;&lt;/wbr&gt;载&lt;wbr&gt;&lt;/wbr&gt;均&lt;wbr&gt;&lt;/wbr&gt;衡&lt;wbr&gt;&lt;/wbr&gt; &lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/2079982.html"  id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_0"&gt;Nginx 常见配置总结&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/2079980.html"  id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_1"&gt;nginx实现网站负载均衡(windows+IIS负载实测)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/2079977.html"  id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_2"&gt;玩玩负载均衡---在window与linux下配置nginx&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/2079976.html"  id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_3"&gt;Windows版本nginx&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-size: 14px;"&gt;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/rob0121/articles/2079974.html"  id="CategoryEntryList1_EntryStoryList_Entries_TitleUrl_4"&gt;大型架构.net平台篇(WEB层均衡负载nginx)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;br /&gt;2、&lt;a title="性能测试工具推荐" href="http://www.blogjava.net/BearRui/archive/2010/04/28/web_performance_tools.html" target="_blank"&gt;性能测试工具推荐&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;3、&amp;nbsp;&lt;a href="http://www.blogjava.net/BearRui/archive/2010/02/22/web_performance_image.html" target="_blank"&gt;图片篇.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;4、&amp;nbsp;&lt;a title="如何加载JS，JS应该放在什么位置" href="http://www.blogjava.net/BearRui/archive/2010/04/08/web_performance_js_where.html" target="_blank"&gt;如何加载JS，JS应该放在什么位置&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;5、&amp;nbsp;&lt;a title="为什么要减少请求数，如何减少请求数." href="http://www.blogjava.net/BearRui/archive/2010/04/18/reduce_number_of_request.html" target="_blank"&gt;为什么要减少请求数，如何减少请求数.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;6、&amp;nbsp;&lt;a title="高性能WEB开发(5) - 减少请求，响应的数据量." href="http://www.blogjava.net/BearRui/archive/2010/04/26/web_performance_reduce_weight.html" target="_blank"&gt;减少请求，响应的数据量.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;7、&lt;a href="http://www.blogjava.net/BearRui/archive/2010/05/04/js_css_merge_compress_cache.html" target="_blank"&gt;JS、CSS的合并、压缩、缓存管理&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;8、&lt;a href="http://www.blogjava.net/BearRui/archive/2010/05/10/web_performance_repaint_relow.html" target="_blank"&gt;页面呈现、重绘、回流。&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;9、&lt;a href="http://www.cnblogs.com/BearsTaR/archive/2010/05/12/best_use_google_analytics.html" target="_blank"&gt;该如何加载google-analytics(或其他第三方)的JS.&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;10、&lt;a href="http://www.cnblogs.com/BearsTaR/archive/2010/05/17/html_compressor.html" target="_blank"&gt;疯狂的HTML压缩.&lt;/a&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;11、&lt;a href="http://www.cnblogs.com/BearsTaR/archive/2010/05/19/flush_chunk_encoding.html" target="_blank"&gt;flush让页面分块,逐步呈现&lt;/a&gt;（典型应用是Facebook的BigPipe技术）&lt;br /&gt;&lt;br /&gt;12、&lt;a href="http://www.cnblogs.com/BearsTaR/archive/2010/06/07/efficient_css.html" target="_blank"&gt;了解CSS的查找匹配原理，让CSS更简洁、高效&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2010/07/16/1778986.html"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;span&gt;构建高性能&lt;/span&gt;ASP.NET&lt;span&gt;站点&lt;/span&gt;&amp;nbsp;&lt;span&gt;开篇&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p align="left" dir="ltr"&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2010/07/22/1782670.html"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;span&gt;构建高性能&lt;/span&gt;ASP.NET&lt;span&gt;站点之一&lt;/span&gt;&amp;nbsp;&lt;span&gt;剖析页面的处理过程（前端）&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2010/07/28/1786720.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点之二 优化HTTP请求(前端)&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #333333;" color="#333333"&gt;&lt;span style="color: #333333;" color="#333333"&gt;　　&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2010/08/17/1801129.html"&gt;&lt;span style="color: #333333;" color="#333333"&gt;构建高性能ASP.NET站点之三 细节决定成败&lt;/span&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/09/1950201.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第五章&amp;mdash;性能调优综述（前篇）&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/09/1950299.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;大型高性能ASP.NET系统架构设计&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/10/1950493.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第五章&amp;mdash;性能调优综述（中篇）&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/11/1951055.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第五章&amp;mdash;性能调优综述（后篇）&lt;/span&gt;&lt;/a&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/14/1954005.html"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第六章&amp;mdash;性能瓶颈诊断与初步调优（上篇）&amp;mdash;识别性能瓶颈&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/15/1954804.html"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第六章&amp;mdash;性能瓶颈诊断与初步调优（下前篇）&amp;mdash;简单的优化措施&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/16/1955693.html"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第六章&amp;mdash;性能瓶颈诊断与初步调优（下后篇）&amp;mdash;减少不必要的请求&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/17/1956768.html"  id="ctl02_TitleUrl"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;构建高性能ASP.NET站点 第七章 如何解决内存的问题(前篇)&amp;mdash;托管资源优化&amp;mdash;垃圾回收机制深度剖析&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p dir="ltr"&gt;&lt;span style="color: #075db3;" color="#075db3"&gt;&lt;a href="http://www.cnblogs.com/yanyangtian/archive/2011/02/21/1959462.html"  id="ctl02_TitleUrl"&gt;构建高性能ASP.NET站点 第七章 如何解决内存的问题(前中篇)&amp;mdash;托管资源优化&amp;mdash;监测CLR性能&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;a href="http://www.cnblogs.com/mikelij/archive/2010/11/30/1892261.html" id="ctl01_TitleUrl"&gt;关&lt;strong&gt;于大型asp.net应用系统的架构&amp;mdash;如何做到高性能高可伸缩性&lt;/strong&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2085245.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085245.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085178.html</id><title type="text">数据库大型应用解决方案总结 - 笔记</title><summary type="text">数据库大型应用解决方案总结，这篇文章非常详细的总结了在大型项目中，关于数据库的解决方案。负载均衡技术读写分离技术分库（垂直，按功能模块）分表（水平，顺序拆分，hash取模分，在认证库中保存数据库配置）技术 当数据库读取压力太大时应当考虑读写分离技术。 当master负载太高时就要垂直分区-分库 当系统中特定的表异常大时就要考虑进行水平分区（分表） 大型的应用必然会经过一个从单一DB server,到Master/salve,再到垂直分区（分 库），然后再到水平分区（分表，sharding）的过程，而在这个过程中，Master/salve 以 及垂直分区相对比较容易，对应用的影响也不是很大，但.</summary><published>2011-06-20T05:48:00Z</published><updated>2011-06-20T05:48:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085178.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085178.html"/><content type="html">&lt;p&gt;&lt;strong&gt;&lt;span style="font-weight: normal;"&gt;　　&lt;a href="http://www.cnblogs.com/ejiyuan/archive/2010/10/29/1796292.html"&gt;数据库大型应用解决方案总结&lt;/a&gt;，这篇文章非常详细的总结了在大型项目中，关于数据库的解决方案。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;负载均衡技术&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;读写分离技术&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;分库（垂直，按功能模块）分表（水平，顺序拆分，hash取模分，在认证库中保存数据库配置）技术&lt;/strong&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&#xD;
&lt;p&gt;当数据库读取压力太大时应当考虑读写分离技术。&lt;/p&gt;&#xD;
&lt;p&gt;当master负载太高时就要垂直分区-分库&lt;/p&gt;&#xD;
&lt;p&gt;当系统中特定的表异常大时就要考虑进行水平分区（分表）&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;大型的应用必然会经过一个从单一DB server,到Master/salve,再到垂直分区（分 库），然后再到水平分区（分表，sharding）的过程，而在这个过程中，Master/salve 以 及垂直分区相对比较容易，对应用的影响也不是很大，但是分表会引起一些棘手的问题，比如不能跨越多个分区join查 询数据，如何平衡各个shards的 负载等等，这个时候就需要一个通用的DAL框架来屏蔽底层数据存储对应用逻辑的影响，使得底层数据的访问对应用透明化&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2085178.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/06/20/2085178.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/04/22/2024967.html</id><title type="text">DI 容器-Mini容器工作机制剖析(下篇）</title><summary type="text">上篇介绍了DI容器最基本功能，组件注册和组件创建和组件获取。这里将陆续把依赖注入进行详细介绍。 1. 看看组件工厂接口-IActivator的代码： /// &amp;lt;summary&amp;gt; /// 组件工厂 /// &amp;lt;/summary&amp;gt; public interface IActivator { /// &amp;lt;summary&amp;gt; /// 创建组件 /// &amp;lt;/summary&amp;gt; /// &amp;lt;param name=&amp;quot;ctx&amp;quot;&amp;gt;创建上下文&amp;lt;/param&amp;gt; /// &amp;lt;returns&amp;gt;返回所创建的组件&amp;lt;/retur</summary><published>2011-04-22T09:12:00Z</published><updated>2011-04-22T09:12:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/22/2024967.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/22/2024967.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html"&gt;上篇&lt;/a&gt;介绍了DI容器最基本功能，组件注册和组件创建和组件获取。这里将陆续把依赖注入进行详细介绍。&lt;/p&gt;&#xD;
&lt;p&gt;1. &amp;nbsp;看看组件工厂接口-IActivator的代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;    &lt;/span&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: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IActivator&lt;br /&gt;    {&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&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: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&gt;///&lt;/span&gt;&lt;span style="color: #008000;"&gt; &lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;param name="ctx"&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;span style="color: #008000;"&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #808080;"&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;span style="color: #008000;"&gt;返回所创建的组件&lt;/span&gt;&lt;span style="color: #808080;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;span style="color: #808080;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; Create(IPreCreationContext ctx);&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;2. AbstractActivator 抽象组件工厂定义了创建组件的一系列模板步骤，具体的子类只要实现各自的具体步骤即可，下面是抽象组件工厂的源代码：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// 抽象组件工厂&#xD;
    /// &amp;lt;/summary&amp;gt;&#xD;
    [Serializable]&#xD;
    public abstract class AbstractActivator : BooleanDisposable, IActivator&#xD;
    {&#xD;
        private readonly object SyncRoot = new object();&#xD;
        private bool hasLock;&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 创建组件&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="context"&amp;gt;创建上下文&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;returns&amp;gt;返回所创建的组件&amp;lt;/returns&amp;gt;&#xD;
        public virtual object Create(IPreCreationContext context)&#xD;
        {&#xD;
&#xD;
            //1. 记录并跟踪组件创建的对象图&#xD;
            Tracker.Track(context);&#xD;
&#xD;
            //2. 检查是否循环依赖创建组件,如果是Throw LoopDependencyException&#xD;
            if (hasLock)&#xD;
                throw ExceptionManager.HandleAndWrapper&amp;lt;LoopDependencyException&amp;gt;(Tracker.CallStack);&#xD;
&#xD;
            object instance = null;&#xD;
&#xD;
            lock (SyncRoot)&#xD;
            {&#xD;
                hasLock = true;&#xD;
&#xD;
                //3. 得到组件监听管理器&#xD;
                var componentListner = context.Kernel.ListenerManager as IComponentListener;&#xD;
&#xD;
                //4. 在组件创建前进行监听&#xD;
                if (componentListner != null)&#xD;
                    componentListner.OnPreCreation(context);&#xD;
               &#xD;
                //5. 具体的 Create instance&#xD;
                instance = InternalCreate(context);&#xD;
&#xD;
                if (componentListner != null)&#xD;
                {&#xD;
                    //6. 在组件创建后进行监听（这里就是依赖注入的扩张点）&#xD;
                    var postCreateContext = new PostCreationContext(context.Kernel, context.Component, instance);&#xD;
                    componentListner.OnPostCreation(postCreateContext);&#xD;
&#xD;
                    //7. 在组件创建后对组件初始化进行监听&#xD;
                    componentListner.OnInitialization(postCreateContext);&#xD;
                    //8. 在组件初始化后进行监听&#xD;
                    componentListner.OnPostInitialization(postCreateContext);&#xD;
                }&#xD;
&#xD;
                Tracker.Clear();&#xD;
&#xD;
                hasLock = false;&#xD;
            }&#xD;
&#xD;
            return instance;&#xD;
        }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// &#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="context"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
        protected virtual object InternalCreate(IPreCreationContext context) { throw new NotImplementedException(); }&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;通过代码可以看出组件工厂里面并没有提供任何依赖注入的扩展，但是有一系列组件监听器的监听方法：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;OnPreCreation&lt;/li&gt;&#xD;
&lt;li&gt;OnPostCreation&lt;/li&gt;&#xD;
&lt;li&gt;OnInitialization&lt;/li&gt;&#xD;
&lt;li&gt;OnPostInitialization&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;通过这些监听方法可以非常方便的对组件内部的字段，属性进行初始化（也就是依赖注入）&lt;/p&gt;&#xD;
&lt;p&gt;3.&amp;nbsp;完整的组件监听器接口定义：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
    /// 组件监听阶段枚举&#xD;
    /// &amp;lt;/summary&amp;gt;&#xD;
    [Flags]&#xD;
    public enum ComponentListenStage&#xD;
    {&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 空&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        None = 1,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件元数据注册后阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        MetadataRegistered = None * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件创建前阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        PreCreation = MetadataRegistered * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件创建后阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        PostCreation = PreCreation * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 初始化阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        Initialization = PostCreation * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 初始化后阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        PostInitialization = Initialization * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件释放前阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        PreDestroy = PostInitialization * 2,&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件释放后阶段&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        PostDestroy = PreDestroy * 2,&#xD;
    }&#xD;
&#xD;
&#xD;
    /// &amp;lt;summary&amp;gt;&#xD;
    /// 组件监听器接口，在组件元数据注册，组件创建前后，组件初始化前后以及组件释放前后进行监听&#xD;
    /// &amp;lt;/summary&amp;gt;&#xD;
    [Contract]&#xD;
    public interface IComponentListener:IListener&amp;lt;ComponentListenStage&amp;gt;&#xD;
    {&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 初始化监听器&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="kernel"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void Init(IKernel kernel);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 得到内核容器对象&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        IKernel Kernel { get;  }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件元数据注册后进行监听，例如Aop监听器&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="info"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnMetadataRegistered(IComponentInfo info);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件创建前进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="ctx"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnPreCreation(IPreCreationContext ctx);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件创建后进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="ctx"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnPostCreation(IPostCreationContext ctx);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件创建后对组件初始化进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="ctx"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnInitialization(IPostCreationContext ctx);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件初始化后进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="ctx"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnPostInitialization(IPostCreationContext ctx);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件释放前进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="info"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;param name="instance"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnPreDestroy(IComponentInfo info, object instance);&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 在组件释放后进行监听&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="info"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        void OnPostDestroy(IComponentInfo info);&#xD;
    }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;4. Mini容器构造函数里面默认注册的组件监听器：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;public Kernel(&#xD;
            IComponentListenerManager listnerManager,&#xD;
            ILifestyleManagerFactory lifestyleManagerRegistry,&#xD;
            IActivatorFactory activatorFactory,&#xD;
            IClassLoader classLoader)&#xD;
        {&#xD;
            ListenerManager = listnerManager;&#xD;
            LifestyleManagerRegistry = lifestyleManagerRegistry;&#xD;
            ActivatorRegistry = activatorFactory;&#xD;
&#xD;
            IdStores = new ConcurrentMap&amp;lt;string, ComponentPair&amp;gt;(StringComparer.OrdinalIgnoreCase);&#xD;
            TypeStores = new ConcurrentMap&amp;lt;Type, List&amp;lt;ComponentPair&amp;gt;&amp;gt;();&#xD;
&#xD;
            Listner = ListenerManager as IComponentListener;&#xD;
&#xD;
            RegisterInstance("ServiceLocator", typeof(IServiceLocator), this);&#xD;
            RegisterInstance("ServiceRegistry", typeof(IServiceRegistry), this);&#xD;
            &#xD;
&#xD;
            if (classLoader != null)&#xD;
                RegisterInstance(AppDomain.CurrentDomain.Id.ToString() + ":" + classLoader.GetType(), typeof(IClassLoader), classLoader);&#xD;
&#xD;
            if (ListenerManager != null)&#xD;
                ListenerManager.Init(this);&#xD;
&#xD;
            RegisterListners();&#xD;
        }&#xD;
&#xD;
        //注册默认监听器&#xD;
        private void RegisterListners()&#xD;
        {&#xD;
            ListenerManager.Register(new AopListener());//Aop监听器&#xD;
            ListenerManager.Register(new DisposalListener());//Dispose监听器&#xD;
            ListenerManager.Register(new InitializationListener());//初始化监听器&#xD;
            ListenerManager.Register(new SupportInitializeListener());//Support初始化监听器&#xD;
            ListenerManager.Register(new StartableListener());//启动停止监听器&#xD;
            ListenerManager.Register(new SubscribeListener());//消息总线的订阅监听器&#xD;
            ListenerManager.Register(new InjectionListener());//注入监听器&#xD;
            ListenerManager.Register(new InjectionManyListener());//批量注入监听器&#xD;
            ListenerManager.Register(new ComponentMemberRegisterListner());//组件成员导出与注入监听器&#xD;
            ListenerManager.Register(new AppSettingInjectionListener());//AppSetting注入监听器&#xD;
        }&#xD;
&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 父容器&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        public IKernel Parent { get; set; }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// 组件监听管理器&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        public IComponentListenerManager ListenerManager { get; private set; }&#xD;
       &#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;5. Mini容器提供了很多监听器，下面看看注入监听器的代码：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;using System.Linq;&#xD;
using NLite.Mini.Context;&#xD;
using NLite.Reflection;&#xD;
using NLite.Collections;&#xD;
using System.Reflection;&#xD;
using NLite.Mini.Internal;&#xD;
using NLite.Mini.Listener.Internal;&#xD;
using NLite.Reflection.Internal;&#xD;
&#xD;
namespace NLite.Mini.Listener&#xD;
{&#xD;
    /// &amp;lt;summary&amp;gt;&#xD;
    /// 注入监听器&#xD;
    /// &amp;lt;/summary&amp;gt;&#xD;
    public sealed class InjectionListener:ComponentListenerAdapter&#xD;
    {&#xD;
        private const BindingFlags Flags = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic;&#xD;
        private const BindingFlags FieldFlags = BindingFlags.SetField | Flags;&#xD;
        private const BindingFlags PropertyFlags = BindingFlags.SetProperty | Flags;&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// &#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        public InjectionListener():base(ComponentListenStage.PostCreation)&#xD;
        {&#xD;
        }&#xD;
&#xD;
        /// &amp;lt;summary&amp;gt;&#xD;
        /// &#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="ctx"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        public override void OnPostCreation(NLite.Mini.Context.IPostCreationContext ctx)&#xD;
        {&#xD;
            if (ctx.Instance == null)&#xD;
                return;&#xD;
&#xD;
            const string Key = "InjectionMany";&#xD;
            Lazy&amp;lt;InjectionInfo[]&amp;gt; lazy = null;&#xD;
            if (ctx.Component.ExtendedProperties.Contains(Key))&#xD;
                lazy = ctx.Component.ExtendedProperties[Key] as Lazy&amp;lt;InjectionInfo[]&amp;gt;;&#xD;
&#xD;
            if (lazy == null)//基于Lazy的方式创建组件的注入元数据&#xD;
            {&#xD;
                lazy = new Lazy&amp;lt;InjectionInfo[]&amp;gt;(() =&amp;gt;&#xD;
                {&#xD;
                    var instanceType = ctx.Instance.GetType();&#xD;
                    return (from f in instanceType.GetFields(FieldFlags)&#xD;
                            let att = f.GetAttribute&amp;lt;InjectAttribute&amp;gt;(true)//字段上有InjectAttribute标签&#xD;
                            let ignoreAtt = f.GetAttribute&amp;lt;IgnoreInjectAttribute&amp;gt;(true)&#xD;
                            let id = att != null ? att.Id : string.Empty&#xD;
                            where ignoreAtt == null&#xD;
                            where att != null&#xD;
                            where !f.HasAttribute&amp;lt;InjectManyAttribute&amp;gt;(false)&#xD;
                            select new InjectionInfo//字段注入元数据&#xD;
                            {&#xD;
                                Id = id&#xD;
                                ,&#xD;
                                Source = InjectionSource.Container&#xD;
                                ,&#xD;
                                Setter = f.ToMemberSetter()//通过Emit的方式进行注入&#xD;
                                ,&#xD;
                                MemberType = f.FieldType&#xD;
                            }&#xD;
&#xD;
                       )&#xD;
                       .Union(&#xD;
                       from p in instanceType.GetProperties(PropertyFlags)&#xD;
                       let ps = p.GetIndexParameters()&#xD;
                       let att = p.GetAttribute&amp;lt;InjectAttribute&amp;gt;(false)&#xD;
                       let ignoreAtt = p.GetAttribute&amp;lt;IgnoreInjectAttribute&amp;gt;(false)&#xD;
                       let id = att != null ? att.Id : string.Empty&#xD;
                       where ignoreAtt == null || ps == null || ps.Length == 0&#xD;
                       where att != null&#xD;
                       where !p.HasAttribute&amp;lt;InjectManyAttribute&amp;gt;(false)&#xD;
                       select new InjectionInfo//属性注入元数据&#xD;
                       {&#xD;
                           Id = id&#xD;
                           ,&#xD;
                           Setter = p.ToMemberSetter()//通过Emit的方式进行注入&#xD;
&#xD;
                           ,&#xD;
                           MemberType = p.PropertyType&#xD;
                           ,&#xD;
                           Source = InjectionSource.Container&#xD;
                       })&#xD;
                       .Union(&#xD;
                       from m in instanceType.GetMethods(Flags)&#xD;
                       let ps = m.GetParameters()&#xD;
                       let att = m.GetAttribute&amp;lt;InjectAttribute&amp;gt;(false)&#xD;
                       let ignoreAtt = m.GetAttribute&amp;lt;IgnoreInjectAttribute&amp;gt;(false)&#xD;
                       where ignoreAtt == null&#xD;
                             &amp;amp;&amp;amp; m.ReturnType == Types.Void&#xD;
                             &amp;amp;&amp;amp; att != null&#xD;
                             &amp;amp;&amp;amp; ps.TrueForAll(p =&amp;gt; !p.HasAttribute&amp;lt;InjectManyAttribute&amp;gt;(false))&#xD;
                       select new InjectionInfo//方法注入元数据&#xD;
                       {&#xD;
                           Id = att.Id&#xD;
                           ,&#xD;
                           Method = DynamicMethodFactory.GetProc(m)&#xD;
                           ,&#xD;
                           Parameters = ps&#xD;
                           ,&#xD;
                           Source = InjectionSource.Container&#xD;
                       }&#xD;
                       ).ToArray();&#xD;
                });&#xD;
&#xD;
                ctx.Component.ExtendedProperties[Key] = lazy;&#xD;
            }&#xD;
&#xD;
            if (lazy.Value.Length == 0)//没有注入元数据则返回&#xD;
                return;&#xD;
&#xD;
            foreach (var item in lazy.Value)&#xD;
            {&#xD;
                if (item.MemberType != null)//是字段或属性注入吗&#xD;
                    InjectMember(ctx, item);&#xD;
                else&#xD;
                    InjectMemberByMethod(ctx, item);//方法注入&#xD;
            }&#xD;
        }&#xD;
&#xD;
        //执行方法注入&#xD;
        private static void InjectMemberByMethod(IPostCreationContext ctx, IInjectionInfo item)&#xD;
        {&#xD;
            item.Method(ctx.Instance, ReflectionHelper.GetParameters(ctx.Kernel, item.Parameters));&#xD;
        }&#xD;
&#xD;
        //执行字段注或属性注入&#xD;
        private static void InjectMember(IPostCreationContext ctx, IInjectionInfo item)&#xD;
        {&#xD;
            if (!MemberMatcher.Match(item.MemberType, ctx.Kernel))&#xD;
                return;&#xD;
            item.Setter(ctx.Instance, InjectService.Get(item.Id, item.MemberType, ctx.Kernel, false));&#xD;
        }&#xD;
    }&#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;从注入监听器的代码中可以看出，当组件创建后，注入监听器将扫描组件的所有字段，属性和方法，找出所有可以被注入的成员，然后对这些成员进行注入。&lt;/p&gt;&#xD;
&lt;p&gt;具体注入的过程就是，通过注入的元数据找到依赖的组件类型或组件Id，然后根据组件类型或Id从DI容器中找出对应的依赖组件，然后把该依赖的组件通过字段，属性或方法调用的方式进行初始化，这样就完成了注入。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html"&gt;上篇&lt;/a&gt;文章全是文字没有代码，这篇基本上全是用代码堆起来的，文字很少，不过代码中有很多注释，通过代码注释基本上可以了解整个被注入的过程。通过这两篇文章已经把Mini容器的整个精髓和骨架勾勒出来，&lt;strong&gt;注册组件-&amp;gt;创建组件元数据（Id,组件类型，组件契约，生命周期管理器，组件工厂），获取组件-&amp;gt;组件生命周期管理器-&amp;gt;组件工厂-&amp;gt;组件监听器（依赖注入等）&lt;/strong&gt;，通过&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html"&gt;上篇&lt;/a&gt;的脑图可以更详细的了解Mini容器的内部结构， 望能够给那些对DI容器不太了解或对DI容器工作机制不太了解的朋友给些帮助，这样就够了！　　&lt;/p&gt;&#xD;
&lt;p&gt;为了加深大家对Mini容器DI容器更进一步了解，下面提供3个有关字段注入，属性注入，方法注入等的链接&lt;/p&gt;&#xD;
&lt;h4 style="text-align: left; padding-left: 30px;"&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772168.html"&gt;Mini 容器学习笔记7&amp;mdash;&amp;mdash;构造函数注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h4 style="text-align: left; padding-left: 30px;"&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772168.html"&gt;&lt;/a&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772286.html"&gt;Mini 容器学习笔记8&amp;mdash;&amp;mdash;字段注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h4 style="text-align: left; padding-left: 30px;"&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772303.html"&gt;Mini 容器学习笔记9&amp;mdash;&amp;mdash;属性注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h4 style="text-align: left; padding-left: 30px;"&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772312.html"&gt;Mini 容器学习笔记10&amp;mdash;&amp;mdash;方法注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;h4 style="text-align: left; padding-left: 30px;"&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772326.html"&gt;Mini 容器学习笔记11&amp;mdash;&amp;mdash;Lazy注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2024967.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/22/2024967.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html</id><title type="text">DI 容器-Mini容器工作机制剖析(上篇）</title><summary type="text">DI容器在DotNet 中已经不是什么稀罕东西了，如Castle，Unity，Ninject，StructureMap，Spring，MEF等等，这些DI容器都是老外设计的，国内开发的DI容器是少之又少，Mini容器便是少之又少中的一员。关于Mini容器的介绍,请参考去年7月份写的这篇文章：Mini容器介绍。 DI容器核心功能包含2大件，服务注册表和服务定位器。 服务注册表：掌管服务的配置或注册，服务注册成功后，DI容器会生成组件的元数据信息包含： 组件Id标志（服务定位器根据该标志获取组件实例），如果组件在注册时未提供标志，那么系统根据组件类型动态生成一个标志 组件类型 契约接口集合，一个.</summary><published>2011-04-21T09:45:00Z</published><updated>2011-04-21T09:45:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html"/><content type="html">&lt;p&gt;DI容器在DotNet 中已经不是什么稀罕东西了，如Castle，Unity，Ninject，StructureMap，Spring，MEF等等，这些DI容器都是老外设计的，国内开发的DI容器是少之又少，&lt;a href="http://nlite.codeplex.com"&gt;Mini容器&lt;/a&gt;便是少之又少中的一员。关于&lt;a href="http://nlite.codeplex.com"&gt;Mini容器&lt;/a&gt;的介绍,请参考去年7月份写的这篇文章：&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772255.html"&gt;Mini容器介绍&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;DI容器核心功能包含2大件，&lt;strong&gt;服务注册表&lt;/strong&gt;和&lt;strong&gt;服务定位器&lt;/strong&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;服务注册表：&lt;/strong&gt;掌管服务的配置或注册，服务注册成功后，DI容器会生成组件的元数据信息包含：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;　 &amp;nbsp;组件Id标志（服务定位器根据该标志获取组件实例），如果组件在注册时未提供标志，那么系统根据组件类型动态生成一个标志&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 组件类型&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 契约接口集合，一个组件可以实现多个契约接口，契约接口必须贴上ContractAttribute方可有效，这和WCF的服务契约一样&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 组件工厂，用来创建组件的 &amp;nbsp;，分为：1）：缺省工厂（Emit反射创建对象），2）：Instance工厂（如果注册了一个组件对象那么就用实例工厂），3):委派工厂（如注册代理对象等），4:)动态代理工厂(供Aop使用）&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;生命周期管理器（管理组件生命周期的，是组件的容器），分为：单利，临时，线程内单利，泛型单利，泛型临时，泛型线程内单利&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;扩展属性，用来扩展元数据的，常常供监听器使用。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&amp;nbsp;服务定位器：&lt;/strong&gt;用来查找组件的。这个查找功能是DI容器中最核心也是最复杂的。下面将详细描述一下细节，关于嵌套容器暂不陈述。&lt;/p&gt;&#xD;
&lt;p&gt;DI的查找接口有很多：具体请参看：&lt;a href="http://nlite.codeplex.com/SourceControl/changeset/view/76470#1519585"&gt;http://nlite.codeplex.com/SourceControl/changeset/view/76470#1519585&lt;/a&gt;,在这里以一个最简单的接口方法：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;object&lt;/span&gt;&lt;span style="color: #000000;"&gt; Get(Type serviceType);&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;为例进行细述（仅仅叙述常规路径）&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 根据serviceType找到组件元数据，然后定位到生命周期管理器&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 从生命周期管理器获取组件进行返回。&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;组件生命周期怎样获取组件并返回的，这需要看具体的组件生命周期管理器了：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;单利管理器&lt;/strong&gt;，首先判断容器内是否有已经创建好的组件，如果有直接返回，没有则委托&lt;strong&gt;组件工厂&lt;/strong&gt;进行创建，然后存储并返回&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;临时管理器&lt;/strong&gt;，每次都委派&lt;strong&gt;组件工厂&lt;/strong&gt;进行创建然后直接返回创建好的组件&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;&amp;nbsp;线程管理器，&lt;/strong&gt;首先从线程局部存储容器中获取已经创建好的组件，如果有直接返回，没有则委托&lt;strong&gt;组件工厂&lt;/strong&gt;进行创建，然后存储到TLS中并返回&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;泛型单利/l临时/线程管理器，&lt;/strong&gt;和前三种类似，不过是基于泛型的创建而已，在这里先不做陈述。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;组件生命周期管理器仅仅是一个组件生命容器，不做具体的创建工作的，而具体的创建工作是由组件工厂完成的。组件工厂有分很多种，不同的组件工厂其创建策略都不同。&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;strong&gt;实例工厂&lt;/strong&gt;，直接返回组件实例（因为组件实例是在注册组件是提供的）&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;委派工厂&lt;/strong&gt;，通过委托函数（组件在注册时自己提供了基于委托函数的工厂）创建并返回&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;缺省工厂&lt;/strong&gt;，通过一定的算法进行选择合适的构造函数进行创建并返回，具体算法请参见：&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772168.html"&gt;Mini容器学习笔记7-构造函数注入&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;strong&gt;动态代理工厂&lt;/strong&gt;，比较复杂，以后将单独开篇进行细述。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;到这里为止介绍了DI容器最基本功能，组件注册和组件创建和组件获取，但是缺少了依赖注入功能，依赖注入功能将在下篇进行详细介绍，这里附上我花了很大功夫才画好的Mini容器脑图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://pic002.cnblogs.com/images/2011/10072/2011042117365453.gif" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;关于Mini容器的其它相关文章介绍：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772255.html"&gt;Mini 容器介绍&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a id="x_x_x_ctl04_lnkTitle" href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772176.html"&gt;Mini 容器学习目录&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772031.html"&gt;Mini 容器学习笔记1&amp;mdash;&amp;mdash;环境搭建(基础篇)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&#xD;
&lt;div id="x_x_x_cnblogs_post_body"&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772030.html"&gt;Mini 容器学习笔记2&amp;mdash;&amp;mdash;组件元数据(基础篇)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772047.html"&gt;Mini 容器学习笔记3&amp;mdash;&amp;mdash;组件的注册(基础篇)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772085.html"&gt;Mini 容器学习笔记4&amp;mdash;&amp;mdash;组件的生命周期(应用篇)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772105.html"&gt;Mini 容器学习笔记5&amp;mdash;&amp;mdash;组件的获取&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772133.html"&gt;Mini 容器学习笔记6&amp;mdash;&amp;mdash;组件的获取(应用)&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772168.html"&gt;Mini 容器学习笔记7&amp;mdash;&amp;mdash;构造函数注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772286.html"&gt;Mini 容器学习笔记8&amp;mdash;&amp;mdash;字段注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772303.html"&gt;Mini 容器学习笔记9&amp;mdash;&amp;mdash;属性注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772312.html"&gt;Mini 容器学习笔记10&amp;mdash;&amp;mdash;方法注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2010/07/06/1772326.html"&gt;Mini 容器学习笔记11&amp;mdash;&amp;mdash;Lazy注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/07/2007031.html"&gt;Mini 容器学习笔记12&amp;mdash;&amp;mdash;组合实例&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/07/2007027.html"&gt;Mini 容器学习笔记13&amp;mdash;&amp;mdash;插件注入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;div&gt;&lt;/div&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/div&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2023787.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/21/2023787.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/04/19/2020659.html</id><title type="text">Struct 创建性能大比拼（反射，泛型反射，泛型创建，缓存Emit）</title><summary type="text">上篇介绍了 Class 创建性能大比拼（反射，泛型反射，泛型创建，缓存Emit，非缓存Emit), 在这里做一个总结（执行10万次）直接创建Class对象最快 5ms缓存Emit 6ms (不包含Emit时间）泛型反射147ms泛型创建159ms(其实是编译器的语法糖，内部仍然调用泛型反射）反射340ms非缓存Emit 12786ms 经过上面的对比应该很清楚了Class创建原则： 直接创建-&amp;gt;用缓存Emit-&amp;gt;泛型反射-&amp;gt;泛型创建-&amp;gt;反射（反射大约比直接调用慢68倍左右），避免非缓存Emit 这篇就来一个Struct创建性能大比拼。因为Struct和Class一个是值</summary><published>2011-04-19T03:18:00Z</published><updated>2011-04-19T03:18:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/19/2020659.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/19/2020659.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html"&gt;上篇&lt;/a&gt;介绍了 &lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html"&gt;Class 创建性能大比拼（反射，泛型反射，泛型创建，缓存Emit，非缓存Emit)&lt;/a&gt;, 在这里做一个总结（执行10万次）&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;直接创建Class对象最快 5ms&lt;/li&gt;&#xD;
&lt;li&gt;缓存Emit 6ms (不包含Emit时间）&lt;/li&gt;&#xD;
&lt;li&gt;泛型反射147ms&lt;/li&gt;&#xD;
&lt;li&gt;泛型创建159ms(其实是编译器的语法糖，内部仍然调用泛型反射）&lt;/li&gt;&#xD;
&lt;li&gt;反射340ms&lt;/li&gt;&#xD;
&lt;li&gt;非缓存Emit 12786ms&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;经过上面的对比应该很清楚了Class创建原则：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;直接创建-&amp;gt;用缓存Emit-&amp;gt;泛型反射-&amp;gt;泛型创建-&amp;gt;反射&lt;/strong&gt;（反射大约比直接调用慢68倍左右），&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;避免非缓存Emit&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这篇就来一个Struct创建性能大比拼。因为Struct和Class一个是值类型一个是引用类型，一个是分配在栈上一个是分配在堆上，用在Class上创建原则未必都和在Struct上的创建原则一致。咱们仍然以代码来说话。&lt;/p&gt;&#xD;
&lt;p&gt;被测试的Struct：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;struct&lt;/span&gt;&lt;span style="color: #000000;"&gt; TestEntity { }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;1. 手工创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Struct.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; DirectInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&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; TestEntity();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2. 反射创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Struct.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reflect&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ReflectInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Activator.CreateInstance(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TestEntity));&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3. 泛型反射创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Struct.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GenericReflect&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericReflectInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Activator.CreateInstance&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TestEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;4. 泛型直接创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Struct.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Generic Create&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericCreateInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Create&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TestEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; T Create&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; T : &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;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; T();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;5. 缓存Emit创建：因为结构体没有缺省构造函数，不能用IL 进行emit,这里用ExpressionTree进行Emit&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;/// &amp;lt;summary&amp;gt;&#xD;
        /// 得到缺省构造函数委托&#xD;
        /// &amp;lt;/summary&amp;gt;&#xD;
        /// &amp;lt;param name="type"&amp;gt;&amp;lt;/param&amp;gt;&#xD;
        /// &amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&#xD;
        public static DefaultConstructorHandler GetDefaultCreator(this Type type)&#xD;
        {&#xD;
            if(type == Types.String)&#xD;
            {&#xD;
                DefaultConstructorHandler s = ()=&amp;gt;null;&#xD;
                return s;&#xD;
            }&#xD;
&#xD;
            var ctorExpression = Expression.Lambda&amp;lt;DefaultConstructorHandler&amp;gt;(Expression.Convert(Expression.New(type), typeof(object)));&#xD;
            var ctor = ctorExpression.Compile();&#xD;
&#xD;
            DefaultConstructorHandler handler = () =&amp;gt;&#xD;
            {&#xD;
                try&#xD;
                {&#xD;
                    return ctor();&#xD;
                }&#xD;
                catch (TargetInvocationException ex)&#xD;
                {&#xD;
                    throw ex.InnerException.Handle();&#xD;
                }&#xD;
                catch (Exception ex)&#xD;
                {&#xD;
                    throw ex.Handle();&#xD;
                }&#xD;
            };&#xD;
&#xD;
            return handler;&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;基于上面Emit代码进行创建的Struct，代码如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;[TestInfo(Category = "Struct.Constructor", Name = "Emit")]&#xD;
        class EmitInvokeMode : IRunable&#xD;
        {&#xD;
            //结构体没有缺省构造函数&#xD;
            static readonly DefaultConstructorHandler Ctor = typeof(TestEntity).GetDefaultCreator();&#xD;
&#xD;
            public void Run()&#xD;
            {&#xD;
                Ctor();&#xD;
            }&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;br /&gt;&#xD;
&lt;p&gt;测试函数：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt; (&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i &lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800080;"&gt;3&lt;/span&gt;&lt;span style="color: #000000;"&gt;; i&lt;/span&gt;&lt;span style="color: #000000;"&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;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Mappers)&lt;br /&gt;                    CodeTimer.Time(item.Metadata.Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Metadata.Name, &lt;/span&gt;&lt;span style="color: #800080;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;, () &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Value.Run());&lt;br /&gt;            }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;输出结果如下：&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;------ Test started: Assembly: NLite.Test.dll ------&#xD;
&#xD;
Struct.Constructor-&amp;gt;Direct&#xD;
	Time Elapsed:	4ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Reflect&#xD;
	Time Elapsed:	330ms&#xD;
	CPU Cycles:	2,968,750&#xD;
	Gen 0: 		1&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;GenericReflect&#xD;
	Time Elapsed:	26ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		1&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Generic Create&#xD;
	Time Elapsed:	3ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Emit&#xD;
	Time Elapsed:	7ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		1&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Direct&#xD;
	Time Elapsed:	1ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Reflect&#xD;
	Time Elapsed:	329ms&#xD;
	CPU Cycles:	3,281,250&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;GenericReflect&#xD;
	Time Elapsed:	22ms&#xD;
	CPU Cycles:	312,500&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Generic Create&#xD;
	Time Elapsed:	4ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Emit&#xD;
	Time Elapsed:	3ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Direct&#xD;
	Time Elapsed:	1ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Reflect&#xD;
	Time Elapsed:	339ms&#xD;
	CPU Cycles:	3,437,500&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;GenericReflect&#xD;
	Time Elapsed:	22ms&#xD;
	CPU Cycles:	312,500&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Generic Create&#xD;
	Time Elapsed:	2ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Struct.Constructor-&amp;gt;Emit&#xD;
	Time Elapsed:	3ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		0&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
&#xD;
1 passed, 0 failed, 0 skipped, took 2.53 seconds (NUnit 2.5.5).&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;从测试结果可以看出一个非常离奇的问题，泛型创建超过Emit超过泛型反射，这在Class的创建测试中，Emit超过泛型反射，泛型反射超过泛型创建。&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;span style="color: #ff0000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2020659.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/19/2020659.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html</id><title type="text">Class 创建性能大比拼（反射，泛型反射，泛型创建，缓存Emit，非缓存Emit）</title><summary type="text">一说到反射，很多人都想到了性能，更有甚者直接说“慎用反射，遗患无穷”，“用反射，感觉怎么像是退步啊～”，看到这种言论，直接把反射妖魔化了，如果这种言论长此以往，势必会对很多对反射初学者造成负面影响。反射是一把双刃剑，看你怎样使用了，下面我就用代码说话。class TestEntity { } 1. 手工创建TestEntity [TestInfo(Category = &amp;quot;Class.Constructor&amp;quot;, Name = &amp;quot;Direct&amp;quot;)] class DirectInvokeMode:IRunable { public void Run() { n</summary><published>2011-04-18T08:37:00Z</published><updated>2011-04-18T08:37:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html"/><content type="html">&lt;p&gt;一说到反射，很多人都想到了性能，更有甚者直接说&amp;ldquo;慎用反射，遗患无穷&amp;rdquo;，&amp;ldquo;用反射，感觉怎么像是退步啊～&amp;rdquo;，看到这种言论，直接把反射妖魔化了，如果这种言论长此以往，势必会对很多对反射初学者造成负面影响。反射是一把双刃剑，看你怎样使用了，下面我就用代码说话。&lt;/p&gt;&#xD;
&lt;div &gt;&#xD;
&lt;pre &gt;class TestEntity { }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;1. 手工创建TestEntity&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;      [TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Direct&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; DirectInvokeMode:IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&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; TestEntity();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;2. 反射创建TestEntity&amp;nbsp;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Reflect&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ReflectInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Activator.CreateInstance(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TestEntity));&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;3. 泛型反射创建TestEntity&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;GenericReflect&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericReflectInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Activator.CreateInstance&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TestEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;4. Generic 直接创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Generic Create&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; GenericCreateInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Create&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;TestEntity&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; T Create&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;T&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;() &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;where&lt;/span&gt;&lt;span style="color: #000000;"&gt; T : &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;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; T();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
5. Emit创建&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Emit&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; EmitInvokeMode : IRunable&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;readonly&lt;/span&gt;&lt;span style="color: #000000;"&gt; ConstructorHandler Ctor &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator();&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                Ctor();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;6. 不缓存Emit的创建&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[TestInfo(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NoCacheEmit&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;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; NoCacheEmitInvokeMode : IRunable&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;typeof&lt;/span&gt;&lt;span style="color: #000000;"&gt;(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator()();&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;测试程序：（执行10万次创建Class对象）&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Mappers)&lt;br /&gt;   CodeTimer.Time(item.Metadata.Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Metadata.Name, &lt;/span&gt;&lt;span style="color: #800080;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;, () &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Value.Run());&lt;br /&gt;            &lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;输出结果：&#xD;
&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;------&lt;/span&gt;&lt;span style="color: #000000;"&gt; Test started: Assembly: NLite.Test.dll &lt;/span&gt;&lt;span style="color: #000000;"&gt;------&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Direct&lt;br /&gt;    Time Elapsed:    5ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Reflect&lt;br /&gt;    Time Elapsed:    320ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;968&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;750&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;GenericReflect&lt;br /&gt;    Time Elapsed:    147ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;250&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;000&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Generic Create&lt;br /&gt;    Time Elapsed:    159ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;406&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;250&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Emit&lt;br /&gt;    Time Elapsed:    6ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;Class.Constructor&lt;/span&gt;&lt;span style="color: #000000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;NoCacheEmit&lt;br /&gt;    Time Elapsed:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;12&lt;/span&gt;&lt;span style="color: #000000;"&gt;,786ms&lt;br /&gt;    CPU Cycles:    &lt;/span&gt;&lt;span style="color: #800080;"&gt;119&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;218&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;/span&gt;&lt;span style="color: #800080;"&gt;750&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;162&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;81&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;    Gen &lt;/span&gt;&lt;span style="color: #800080;"&gt;2&lt;/span&gt;&lt;span style="color: #000000;"&gt;:         &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #800080;"&gt;1&lt;/span&gt;&lt;span style="color: #000000;"&gt; passed, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; failed, &lt;/span&gt;&lt;span style="color: #800080;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt; skipped, took &lt;/span&gt;&lt;span style="color: #800080;"&gt;67.77&lt;/span&gt;&lt;span style="color: #000000;"&gt; seconds (NUnit &lt;/span&gt;&lt;span style="color: #800080;"&gt;2.5&lt;/span&gt;&lt;span style="color: #000000;"&gt;.&lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;).&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;性能比较结果应该是一目了然了！&lt;/p&gt;&#xD;
&lt;p&gt;附上源代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;using System;&#xD;
using System.Collections.Generic;&#xD;
using System.Linq;&#xD;
using System.Text;&#xD;
using NUnit.Framework;&#xD;
using System.Reflection;&#xD;
using NLite.Reflection;&#xD;
&#xD;
namespace NLite.Test.Reflection&#xD;
{&#xD;
    [Contract]&#xD;
    public interface IRunable&#xD;
    {&#xD;
        void Run();&#xD;
    }&#xD;
&#xD;
    //测试器元数据&#xD;
    public interface ITestInfo&#xD;
    {&#xD;
        //目录&#xD;
        string Category { get; }&#xD;
        //名称&#xD;
        string Name { get; }&#xD;
    }&#xD;
&#xD;
    //映射器元数据注解&#xD;
    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]&#xD;
    [MetadataAttributeAttribute]&#xD;
    public class TestInfoAttribute : ComponentAttribute&#xD;
    {&#xD;
        public string Category { get; set; }&#xD;
        public string Name { get; set; }&#xD;
    }&#xD;
&#xD;
&#xD;
    [TestFixture]&#xD;
    public class SpecBase&#xD;
    {&#xD;
        public SpecBase()&#xD;
        {&#xD;
        }&#xD;
&#xD;
        [SetUp]&#xD;
        public void SetUp()&#xD;
        {&#xD;
            Given();&#xD;
            When();&#xD;
        }&#xD;
&#xD;
        public virtual void Given() { }&#xD;
        public virtual void When()&#xD;
        {&#xD;
        }&#xD;
&#xD;
        [Test]&#xD;
        public void Test()&#xD;
        {&#xD;
            &#xD;
        }&#xD;
    }&#xD;
&#xD;
    public abstract class PerformanceSpecBase : SpecBase&#xD;
    {&#xD;
        [InjectMany]&#xD;
        protected Lazy&amp;lt;IRunable, ITestInfo&amp;gt;[] Mappers;&#xD;
&#xD;
        protected abstract void RegisterComponents();&#xD;
&#xD;
        public virtual int Times&#xD;
        {&#xD;
            get { return 100000; }&#xD;
        }&#xD;
&#xD;
        public override void Given()&#xD;
        {&#xD;
            RegisterComponents();&#xD;
            ServiceRegistry.Compose(this);&#xD;
        }&#xD;
&#xD;
&#xD;
        public override void When()&#xD;
        {&#xD;
            for (int i = 0; i &amp;lt; 3; i++)&#xD;
            {&#xD;
                foreach (var item in Mappers)&#xD;
                    CodeTimer.Time(item.Metadata.Category + "-&amp;gt;" + item.Metadata.Name, Times, () =&amp;gt; item.Value.Run());&#xD;
            }&#xD;
        }&#xD;
    }&#xD;
&#xD;
    public class InvokeConstructorPerformanceSpec : PerformanceSpecBase&#xD;
    {&#xD;
        class TestEntity { }&#xD;
&#xD;
        protected override void RegisterComponents()&#xD;
        {&#xD;
            ServiceRegistry&#xD;
                .Register&amp;lt;DirectInvokeMode&amp;gt;()&#xD;
                .Register&amp;lt;ReflectInvokeMode&amp;gt;()&#xD;
                .Register&amp;lt;GenericReflectInvokeMode&amp;gt;()&#xD;
                .Register &amp;lt;GenericCreateInvokeMode&amp;gt;()&#xD;
                .Register&amp;lt;EmitInvokeMode&amp;gt;()&#xD;
                .Register &amp;lt; NoCacheEmitInvokeMode&amp;gt;()&#xD;
                .Register &amp;lt; GenericReflectInvokeMode2&amp;gt;()&#xD;
                ;&#xD;
        }&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "Direct")]&#xD;
        class DirectInvokeMode:IRunable&#xD;
        {&#xD;
            public void Run()&#xD;
            {&#xD;
                new TestEntity();&#xD;
            }&#xD;
        }&#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "Reflect")]&#xD;
        class ReflectInvokeMode : IRunable&#xD;
        {&#xD;
            public void Run()&#xD;
            {&#xD;
                Activator.CreateInstance(typeof(TestEntity));&#xD;
            }&#xD;
        }&#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "GenericReflect")]&#xD;
        class GenericReflectInvokeMode : IRunable&#xD;
        {&#xD;
            public void Run()&#xD;
            {&#xD;
                Activator.CreateInstance&amp;lt;TestEntity&amp;gt;();&#xD;
            }&#xD;
        }&#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "Reflect-&amp;gt;Reflect")]&#xD;
        class GenericReflectInvokeMode2 : IRunable&#xD;
        {&#xD;
            static readonly MethodInfo CreateMethod = typeof(Activator)&#xD;
                .GetMethod("CreateInstance", Type.EmptyTypes)&#xD;
                .MakeGenericMethod(typeof(TestEntity));&#xD;
&#xD;
            public void Run()&#xD;
            {&#xD;
                CreateMethod.Invoke(null,null);&#xD;
            }&#xD;
&#xD;
&#xD;
        }&#xD;
&#xD;
        &#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "Generic Create")]&#xD;
        class GenericCreateInvokeMode : IRunable&#xD;
        {&#xD;
            public void Run()&#xD;
            {&#xD;
                Create&amp;lt;TestEntity&amp;gt;();&#xD;
            }&#xD;
&#xD;
            static T Create&amp;lt;T&amp;gt;() where T : new()&#xD;
            {&#xD;
                return new T();&#xD;
            }&#xD;
        }&#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "Emit")]&#xD;
        class EmitInvokeMode : IRunable&#xD;
        {&#xD;
            static readonly ConstructorHandler Ctor = typeof(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator();&#xD;
&#xD;
            public void Run()&#xD;
            {&#xD;
                Ctor();&#xD;
            }&#xD;
        }&#xD;
&#xD;
&#xD;
        [TestInfo(Category = "Class.Constructor", Name = "NoCacheEmit")]&#xD;
        class NoCacheEmitInvokeMode : IRunable&#xD;
        {&#xD;
            public void Run()&#xD;
            {&#xD;
                typeof(TestEntity).GetConstructor(Type.EmptyTypes).GetCreator()();&#xD;
            }&#xD;
        }&#xD;
&#xD;
&#xD;
    }&#xD;
&#xD;
   &#xD;
}&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;最后给大家一个思考题：&lt;span style="color: #ff0000;"&gt;Struct 创建性能大比拼的结果是怎样的？（注意Struct是值类型，Class是引用类型，值类型是分配在栈上的，引用类型是分配在堆上的）&lt;/span&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2019999.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/18/2019999.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/netcasewqs/archive/2011/04/13/2014684.html</id><title type="text">EmitMapper,AutoMapper,NLiteMapper和手工映射性能大比拼</title><summary type="text">在大比拼之前先讲一个小插曲，我这个人以前比较低调，做了很多好东西仅仅在公司内的朋友圈项目圈内分享，很少在博客园内进行分享，后来在dudu 老大的文章博客园现代化建设——AutoMapper有感便推荐一下OOMapper 组件,于是乎接连写了几篇入门性的介绍使用文章：开发人员必备工具：OOMapperOO Mapper 实践（上篇）OO Mapper 实践（下篇） 在园友Repository兄的NLiteMapper与EmitMapper性能简单比较中了解到NLiteMapper与EmitMapper的性能巨大差距，于是乎进行了两天的性能优化，同时总结了优化过程：一次性能优化最佳实践。在这里非.</summary><published>2011-04-13T04:49:00Z</published><updated>2011-04-13T04:49:00Z</updated><author><name>风云</name><uri>http://www.cnblogs.com/netcasewqs/</uri></author><link rel="alternate" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/13/2014684.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/netcasewqs/archive/2011/04/13/2014684.html"/><content type="html">&lt;p&gt;在大比拼之前先讲一个小插曲，我这个人以前比较低调，做了很多好东西仅仅在公司内的朋友圈项目圈内分享，很少在博客园内进行分享，后来在dudu 老大的文章&lt;a id="homepage1_HomePageDays_DaysList_DayItem_8_DayList_8_TitleUrl_2"  href="http://www.cnblogs.com/dudu/archive/2011/03/28/entity_framework_automapper.html"&gt;博客园现代化建设&amp;mdash;&amp;mdash;AutoMapper&lt;/a&gt;有感便推荐一下&lt;a href="http://nlite.codeplex.com"&gt;OOMapper&lt;/a&gt; 组件,于是乎接连写了几篇入门性的介绍使用文章：&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/08/2009236.html"&gt;开发人员必备工具：OOMapper&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/08/2009278.html"&gt;OO Mapper 实践（上篇）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/08/2009403.html"&gt;OO Mapper 实践（下篇）&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;在园友&lt;a href="http://repository.cnblogs.com"&gt;Repository&lt;/a&gt;&amp;nbsp;兄的&lt;a href="http://www.cnblogs.com/repository/archive/2011/04/08/2009713.html"&gt;NLiteMapper与EmitMapper性能简单比较&lt;/a&gt;中了解到&lt;a href="http://nlite.codeplex.com"&gt;NLiteMapper&lt;/a&gt;与EmitMapper的性能巨大差距，于是乎进行了两天的性能优化，同时总结了优化过程：&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/11/2012249.html"&gt;一次性能优化最佳实践&lt;/a&gt;。在这里非常感谢&lt;a href="http://repository.cnblogs.com"&gt;Repository&lt;/a&gt;&amp;nbsp;兄的测试，也非常感谢他把&lt;a href="http://nlite.codeplex.com"&gt;OOMapper&lt;/a&gt;纠正为&lt;a href="http://nlite.codeplex.com"&gt;NLiteMapper&lt;/a&gt;,否则NLiteMapper的性能是非常低下的，同时感谢dudu,感谢博客园给大家一个平台，在这个平台使我学到了很多很多......&lt;/p&gt;&#xD;
&lt;p&gt;不说废话进入主题。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;准备工作：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;　　软硬件环境：VS2008，.net3.5, xp 双核&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 测试组件（都是最新Release版本）：AutoMapper.dll(v2.0), EmitMappe.dll (V1.0),NLite.dll(V1.0)&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;性能测试工具：&lt;/strong&gt;老赵的CodeTimer&lt;/p&gt;&#xD;
&lt;p&gt;测试接口代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;    [Contract]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IObjectToObjectMapper&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Initialize();&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Map();&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;为了输出更友好的结果定义一下测试元数据代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;测试映射器元数据&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;interface&lt;/span&gt;&lt;span style="color: #000000;"&gt; IMapperMetadata&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Category { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Name { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; }&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Descrption { &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;br /&gt;    &lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;映射器元数据注解&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;    [AttributeUsage(AttributeTargets.Class, AllowMultiple &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;)]&lt;br /&gt;    [MetadataAttributeAttribute]&lt;br /&gt;    &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MapperAttribute : ComponentAttribute&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Category { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Name { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Descrption { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;利用NLite的Mini容器书写测试框架代码如下：测试次数10万次&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;   &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program&lt;br /&gt;    {&lt;br /&gt;        [InjectMany]&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt; Lazy&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;IObjectToObjectMapper,IMapperMetadata&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] Mappers;&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Init()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Mappers)&lt;br /&gt;            {&lt;br /&gt;                item.Value.Initialize();&lt;br /&gt;                item.Value.Map();&lt;br /&gt;            }&lt;br /&gt;&lt;br /&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;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Run()&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;foreach&lt;/span&gt;&lt;span style="color: #000000;"&gt; (var item &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;in&lt;/span&gt;&lt;span style="color: #000000;"&gt; Mappers)&lt;br /&gt;                CodeTimer.Time(item.Metadata.Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Metadata.Name , &lt;/span&gt;&lt;span style="color: #800080;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;,() &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; item.Value.Map());&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Main(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt;[] args)&lt;br /&gt;        {&lt;br /&gt;            ServiceRegistry.RegisteryFromAssemblyOf&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Program&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;&lt;br /&gt;            var host &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; Program();&lt;br /&gt;            ServiceRegistry.Compose(host);&lt;br /&gt;&lt;br /&gt;            host.Init();&lt;br /&gt;            host.Run();&lt;br /&gt;&lt;br /&gt;            Console.Read();&lt;br /&gt;        }&lt;br /&gt;    }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;这样完成了测试框架的搭建，现在就开始书写测试代码了。&lt;/p&gt;&#xD;
&lt;p&gt;定义测试数据：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #0000ff;"&gt;        public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelObject&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; DateTime BaseDate { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; ModelSubObject Sub { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; ModelSubObject Sub2 { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; ModelSubObject SubWithExtraName { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubObject&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; ProperName { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; ModelSubSubObject SubSub { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubSubObject&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; IAmACoolProperty { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;br /&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelDto&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; DateTime BaseDate { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; SubProperName { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; Sub2ProperName { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; SubWithExtraNameProperName { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;string&lt;/span&gt;&lt;span style="color: #000000;"&gt; SubSubSubIAmACoolProperty { &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;get&lt;/span&gt;&lt;span style="color: #000000;"&gt;; &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;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;定义测试基类：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; MapperBase : IObjectToObjectMapper&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelObject _source;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelDto _target;&lt;br /&gt;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;virtual&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnInitialize() { }&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Initialize()&lt;br /&gt;            {&lt;br /&gt;                OnInitialize();&lt;br /&gt;&lt;br /&gt;                _source &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelObject&lt;br /&gt;                {&lt;br /&gt;                    BaseDate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; DateTime(&lt;/span&gt;&lt;span style="color: #800080;"&gt;2007&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;4&lt;/span&gt;&lt;span style="color: #000000;"&gt;, &lt;/span&gt;&lt;span style="color: #800080;"&gt;5&lt;/span&gt;&lt;span style="color: #000000;"&gt;),&lt;br /&gt;                    Sub &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubObject&lt;br /&gt;                    {&lt;br /&gt;                        ProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Some name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&lt;br /&gt;                        SubSub &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubSubObject&lt;br /&gt;                        {&lt;br /&gt;                            IAmACoolProperty &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Cool daddy-o&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;                    Sub2 &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubObject&lt;br /&gt;                    {&lt;br /&gt;                        ProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Sub 2 name&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                    },&lt;br /&gt;                    SubWithExtraName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelSubObject&lt;br /&gt;                    {&lt;br /&gt;                        ProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Some other name&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;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;abstract&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Map();&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;手工映射代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;       [Mapper(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Flattening.Class&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Manual&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; ManualMapper : MapperBase&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; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Map()&lt;br /&gt;            {&lt;br /&gt;                var destination &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelDto&lt;br /&gt;                {&lt;br /&gt;                    BaseDate &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _source.BaseDate,&lt;br /&gt;                    Sub2ProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _source.Sub2.ProperName,&lt;br /&gt;                    SubProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _source.Sub.ProperName,&lt;br /&gt;                    SubSubSubIAmACoolProperty &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _source.Sub.SubSub.IAmACoolProperty,&lt;br /&gt;                    SubWithExtraNameProperName &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; _source.SubWithExtraName.ProperName&lt;br /&gt;                };&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;AutoMapper 映射代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;  [Mapper(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Flattening.Class&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;AutoMapper&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; AutoMapperWrapper : MapperBase&lt;br /&gt;        {&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt;  &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnInitialize()&lt;br /&gt;            {&lt;br /&gt;                AutoMapper.Mapper.Initialize(cfg &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;                {&lt;br /&gt;                    cfg.CreateMap&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;();&lt;br /&gt;                });&lt;br /&gt;                AutoMapper.Mapper.AssertConfigurationIsValid();&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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Map()&lt;br /&gt;            {&lt;br /&gt;                _target &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;AutoMapper.Mapper.Map&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(_source);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;EmitMapper映射代码：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;        [Mapper(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Flattening.Class&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;EmitMapper&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; EmitMapperWrapper : MapperBase&lt;br /&gt;        {&lt;br /&gt;            ObjectsMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; mapper;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnInitialize()&lt;br /&gt;            {&lt;br /&gt;                mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; ObjectMapperManager.DefaultInstance.GetMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(&lt;/span&gt;&lt;span style="color: #0000ff;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt; FlatteringConfig());&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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; ModelDto MapImp()&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt; mapper.Map(Source);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;EmitMapper映射器默认不支持Flatter 映射，如果支持需要写自定义配置:&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;class FlatteringConfig : DefaultMapConfig&#xD;
        {&#xD;
            protected Func&amp;lt;string, string, bool&amp;gt; nestedMembersMatcher;&#xD;
&#xD;
            public FlatteringConfig()&#xD;
            {&#xD;
                nestedMembersMatcher = (m1, m2) =&amp;gt; m1.StartsWith(m2);&#xD;
            }&#xD;
&#xD;
            public override IMappingOperation[] GetMappingOperations(Type from, Type to)&#xD;
            {&#xD;
                var destinationMembers = GetDestinationMemebers(to);&#xD;
                var sourceMembers = GetSourceMemebers(from);&#xD;
                var result = new List&amp;lt;IMappingOperation&amp;gt;();&#xD;
                foreach (var dest in destinationMembers)&#xD;
                {&#xD;
                    var matchedChain = GetMatchedChain(dest.Name, sourceMembers).ToArray();&#xD;
                    if (matchedChain == null || matchedChain.Length == 0)&#xD;
                    {&#xD;
                        continue;&#xD;
                    }&#xD;
                    result.Add(&#xD;
                        new ReadWriteSimple&#xD;
                        {&#xD;
                            Source = new MemberDescriptor(matchedChain),&#xD;
                            Destination = new MemberDescriptor(new[] { dest })&#xD;
                        }&#xD;
                    );&#xD;
                }&#xD;
                return result.ToArray();&#xD;
            }&#xD;
&#xD;
            public DefaultMapConfig MatchNestedMembers(Func&amp;lt;string, string, bool&amp;gt; nestedMembersMatcher)&#xD;
            {&#xD;
                this.nestedMembersMatcher = nestedMembersMatcher;&#xD;
                return this;&#xD;
            }&#xD;
&#xD;
            private List&amp;lt;MemberInfo&amp;gt; GetMatchedChain(string destName, List&amp;lt;MemberInfo&amp;gt; sourceMembers)&#xD;
            {&#xD;
                var matches = sourceMembers.Where(s =&amp;gt; MatchMembers(destName, s.Name) || nestedMembersMatcher(destName, s.Name));&#xD;
                int len = 0;&#xD;
                MemberInfo match = null;&#xD;
                foreach (var m in matches)&#xD;
                {&#xD;
                    if (m.Name.Length &amp;gt; len)&#xD;
                    {&#xD;
                        len = m.Name.Length;&#xD;
                        match = m;&#xD;
                    }&#xD;
                }&#xD;
                if (match == null)&#xD;
                {&#xD;
                    return null;&#xD;
                }&#xD;
                var result = new List&amp;lt;MemberInfo&amp;gt; { match };&#xD;
                if (!MatchMembers(destName, match.Name))&#xD;
                {&#xD;
                    result.AddRange(&#xD;
                        GetMatchedChain(destName.Substring(match.Name.Length), GetDestinationMemebers(match))&#xD;
                    );&#xD;
                }&#xD;
                return result;&#xD;
            }&#xD;
&#xD;
            private static List&amp;lt;MemberInfo&amp;gt; GetSourceMemebers(Type t)&#xD;
            {&#xD;
                return GetMemebers(t)&#xD;
                    .Where(&#xD;
                        m =&amp;gt;&#xD;
                            m.MemberType == MemberTypes.Field ||&#xD;
                            m.MemberType == MemberTypes.Property ||&#xD;
                            m.MemberType == MemberTypes.Method&#xD;
                    )&#xD;
                    .ToList();&#xD;
            }&#xD;
&#xD;
            private static List&amp;lt;MemberInfo&amp;gt; GetDestinationMemebers(MemberInfo mi)&#xD;
            {&#xD;
                Type t;&#xD;
                if (mi.MemberType == MemberTypes.Field)&#xD;
                {&#xD;
                    t = mi.DeclaringType.GetField(mi.Name).FieldType;&#xD;
                }&#xD;
                else&#xD;
                {&#xD;
                    t = mi.DeclaringType.GetProperty(mi.Name).PropertyType;&#xD;
                }&#xD;
                return GetDestinationMemebers(t);&#xD;
            }&#xD;
&#xD;
            private static List&amp;lt;MemberInfo&amp;gt; GetDestinationMemebers(Type t)&#xD;
            {&#xD;
                return GetMemebers(t).Where(m =&amp;gt; m.MemberType == MemberTypes.Field || m.MemberType == MemberTypes.Property).ToList();&#xD;
            }&#xD;
&#xD;
            private static List&amp;lt;MemberInfo&amp;gt; GetMemebers(Type t)&#xD;
            {&#xD;
                BindingFlags bindingFlags = BindingFlags.Instance | BindingFlags.Public;&#xD;
                return t.GetMembers(bindingFlags).ToList();&#xD;
            }&#xD;
        }&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&#xD;
&lt;p&gt;NLiteMapper映射代码：&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;pre&gt;&lt;div&gt;&lt;span style="color: #000000;"&gt;[Mapper(Category &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;Flattening.Class&lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;, Name &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #800000;"&gt;"&lt;/span&gt;&lt;span style="color: #800000;"&gt;NLiteMapper&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;public&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt; NLiteMaperWrapper : MapperBase&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; NLite.Mapping.IMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt; mapper;&lt;br /&gt;            &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;protected&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; OnInitialize()&lt;br /&gt;            {&lt;br /&gt;                &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;base&lt;/span&gt;&lt;span style="color: #000000;"&gt;.OnInitialize();&lt;br /&gt;&lt;br /&gt;                mapper &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; NLite.Mapper.CreateMapper&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;ModelObject, ModelDto&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&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: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;override&lt;/span&gt;&lt;span style="color: #000000;"&gt; &lt;/span&gt;&lt;span style="color: #0000ff;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt; Map()&lt;br /&gt;            {&lt;br /&gt;                _target &lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt; mapper.Map(_source);&lt;br /&gt;            }&lt;br /&gt;        }&lt;/span&gt;&lt;/div&gt;&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;p&gt;Ok，完成代码用Release编译，然后再输出bin中找到exe文件，连续执行三次，下面是三次执行结果的截图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;------ Test started: Assembly: NLite.Test.dll ------&#xD;
&#xD;
Flattening.Class-&amp;gt;AutoMapper&#xD;
	Time Elapsed:	1,112ms&#xD;
	CPU Cycles:	6,718,750&#xD;
	Gen 0: 		173&#xD;
	Gen 1: 		1&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;NLiteMapper&#xD;
	Time Elapsed:	68ms&#xD;
	CPU Cycles:	781,250&#xD;
	Gen 0: 		4&#xD;
	Gen 1: 		1&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;EmitMapper&#xD;
	Time Elapsed:	23ms&#xD;
	CPU Cycles:	156,250&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;Manual&#xD;
	Time Elapsed:	8ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		1&#xD;
	Gen 2: 		0&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;------ Test started: Assembly: NLite.Test.dll ------&#xD;
&#xD;
Flattening.Class-&amp;gt;AutoMapper&#xD;
	Time Elapsed:	1,701ms&#xD;
	CPU Cycles:	10,468,750&#xD;
	Gen 0: 		173&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;NLiteMapper&#xD;
	Time Elapsed:	69ms&#xD;
	CPU Cycles:	781,250&#xD;
	Gen 0: 		4&#xD;
	Gen 1: 		1&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;EmitMapper&#xD;
	Time Elapsed:	22ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;Manual&#xD;
	Time Elapsed:	10ms&#xD;
	CPU Cycles:	312,500&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		1&#xD;
	Gen 2: 		0&#xD;
&#xD;
&#xD;
1 passed, 0 failed, 0 skipped, took 2.98 seconds (NUnit 2.5.5).&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;&lt;div &gt;&#xD;
&lt;pre &gt;------ Test started: Assembly: NLite.Test.dll ------&#xD;
&#xD;
Flattening.Class-&amp;gt;AutoMapper&#xD;
	Time Elapsed:	1,205ms&#xD;
	CPU Cycles:	10,156,250&#xD;
	Gen 0: 		177&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;NLiteMapper&#xD;
	Time Elapsed:	66ms&#xD;
	CPU Cycles:	781,250&#xD;
	Gen 0: 		4&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;EmitMapper&#xD;
	Time Elapsed:	18ms&#xD;
	CPU Cycles:	312,500&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
Flattening.Class-&amp;gt;Manual&#xD;
	Time Elapsed:	9ms&#xD;
	CPU Cycles:	0&#xD;
	Gen 0: 		3&#xD;
	Gen 1: 		0&#xD;
	Gen 2: 		0&#xD;
&#xD;
&#xD;
1 passed, 0 failed, 0 skipped, took 2.56 seconds (NUnit 2.5.5).&#xD;
&lt;/pre&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;/p&gt;&#xD;
&lt;p&gt;通过测试结果可以看出:&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;　 &amp;nbsp;手工映射速度最快&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; EmitMapper第二（大约比手工慢了2-6倍，）&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; NLiteMapper第三（大约比EmitMapper慢了3倍）&lt;/li&gt;&#xD;
&lt;li&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 最后是AutoMapper（大约比手工慢了200倍）&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;内存开销结果：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;手工映射 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Gen 0： 3&lt;/li&gt;&#xD;
&lt;li&gt;EmitMapper &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Gen 0：3&lt;/li&gt;&#xD;
&lt;li&gt;NLiteMapper &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Gen 0： 4&lt;/li&gt;&#xD;
&lt;li&gt;AutoMapper &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Gen 0：173&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;总结 ：无论从性能和内存EmitMapper都接近于手工，NLiteMapper次之，AutoMapper最后。NLiteMapper，EmitMapper，AutoMapper都是通过Emit的方式进行Get和Set的，为什么性能差别如此之大，设想如果NLiteMapper不进行优化的话（NLiteMapper一直是通过Emit方式进行的），那么NLiteMapper肯定是高高垫背的（NLiteMapper比EmitMapper慢了15000倍）。。。。。。&lt;/p&gt;&#xD;
&lt;p&gt;这次测试结果不代表整体结果，仅仅代表Class-&amp;gt;Class（包括级联） 的映射性能，欢迎大家对这几种OO映射器进行性能比较。最后附上整个测试代码：&lt;a href="http://files.cnblogs.com/netcasewqs/MapperPerformanceCompare.zip"&gt;测试代码&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;　　备注：EmitMapper的测试代码修改过，添加了FlatteringConfig class 这样测试就公平了。&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;附上的源代码是老代码，最新代码：&lt;a href="http://nlite.codeplex.com/SourceControl/changeset/view/76359#1528885"&gt;http://nlite.codeplex.com/SourceControl/changeset/view/76359#1528885&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/netcasewqs/aggbug/2014684.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/netcasewqs/archive/2011/04/13/2014684.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
