<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_2012 gogogo！！！！！！！！！</title><subtitle type="text">有点城府好不好啊！！！！！！！！！！！！！！</subtitle><id>http://feed.cnblogs.com/blog/u/41698/rss</id><updated>2012-05-13T08:16:48Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/41698/rss"/><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498190.html</id><title type="text">PowerDesigner教程系列概念数据模型</title><summary type="text">目标:本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念。一、概念数据模型概述数据模型是现实世界中数据特征的抽象。数据模型应该满足三个方面的要求：1）能够比较真实地模拟现实世界2）容易为人所理解3）便于计算机实现概念数据模型也称信息模型，它以实体－联系(Entity-RelationShip,简称E-R)理论为基础，并对这一理论进行了扩充。它从用户的观点出发对信息进行建模，主要用于数据库的概念级设计。通常人们先将现实世界抽象为概念世界，然后再将概念世界转为机器世界。换句话说，就是先将现实世界中的客观对象抽象为实体(Entity)和联系(Relationship),它并不依赖</summary><published>2012-05-13T08:12:00Z</published><updated>2012-05-13T08:12:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498190.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498190.html"/><content type="html">&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;:&lt;br /&gt;本文主要介绍PowerDesigner中概念数据模型 CDM的基本概念。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一、概念数据模型概述&lt;/strong&gt;&lt;br /&gt;数据模型是现实世界中数据特征的抽象。数据模型应该满足三个方面的要求：&lt;br /&gt;1）能够比较真实地模拟现实世界&lt;br /&gt;2）容易为人所理解&lt;br /&gt;3）便于计算机实现&lt;br /&gt;&lt;br /&gt;概念数据模型也称信息模型，它以实体－联系(Entity-RelationShip,简称E-R)理论为基础，并对这一理论进行了扩充。它从用户的观点出发对信息进行建模，主要用于数据库的概念级设计。&lt;br /&gt;&lt;br /&gt;通常人们先将现实世界抽象为概念世界，然后再将概念世界转为机器世界。换句话说，就是先将现实世界中的客观对象抽象为实体(Entity)和联系(Relationship),它并不依赖于具体的计算机系统或某个DBMS系统，这种模型就是我们所说的CDM;然后再将CDM转换为计算机上某个DBMS所支持的数据模型，这样的模型就是物理数据模型,即PDM。&lt;br /&gt;&lt;br /&gt;CDM是一组严格定义的模型元素的集合，这些模型元素精确地描述了系统的&lt;u&gt;静态特性、动态特性以及完整性约束条件&lt;/u&gt;等，其中包括了&lt;u&gt;数据结构、数据操作和完整性约束&lt;/u&gt;三部分。&lt;br /&gt;1）数据结构表达为实体和属性;&lt;br /&gt;2）数据操作表达为实体中的记录的插入、删除、修改、查询等操作;&lt;br /&gt;3）完整性约束表达为数据的自身完整性约束（如数据类型、检查、规则等）和数据间的参照完整性约束（如联系、继承联系等）;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、实体、属性及标识符的定义&lt;/strong&gt;&lt;br /&gt;实体（Entity），也称为实例，对应现实世界中可区别于其他对象的&amp;#8220;事件&amp;#8221;或&amp;#8220;事物&amp;#8221;。例如，学校中的每个学生，医院中的每个手术。&lt;br /&gt;每个实体都有用来描述实体特征的一组性质，称之为属性，一个实体由若干个属性来描述。如学生实体可由学号、姓名、性别、出生年月、所在系别、入学年份等属性组成。&lt;br /&gt;&lt;br /&gt;实体集（Entity Set）是具体相同类型及相同性质实体的集合。例如学校所有学生的集合可定义为&amp;#8220;学生&amp;#8221;实体集，&amp;#8220;学生&amp;#8221;实体集中的每个实体均具有学号、姓名、性别、出生年月、所在系别、入学年份等性质。&lt;br /&gt;&lt;br /&gt;实体类型（Entity Type）是实体集中每个实体所具有的共同性质的集合，例如&amp;#8220;患者&amp;#8221;实体类型为：患者｛门诊号，姓名，性别，年龄，身份证号.............｝。实体是实体类型的一个实例，在含义明确的情况下，实体、实体类型通常互换使用。&lt;br /&gt;&lt;br /&gt;实体类型中的每个实体包含唯一标识它的一个或一组属性，这些属性称为实体类型的标识符（Identifier），如&amp;#8220;学号&amp;#8221;是学生实体类型的标识符，&amp;#8220;姓名&amp;#8221;、&amp;#8220;出生日期&amp;#8221;、&amp;#8220;信址&amp;#8221;共同组成&amp;#8220;公民&amp;#8221;实体类型的标识符。&lt;br /&gt;&lt;br /&gt;有些实体类型可以有几组属性充当标识符，选定其中一组属性作为实体类型的主标识符，其他的作为次标识符。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、实体、属性及标识符的表达&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_01.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;待续！&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;目标：&lt;br /&gt;本文主要介绍PowerDesigner概念数据模型以及实体、属性创建。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;一、新建概念数据模型&lt;/strong&gt;&lt;br /&gt;1）选择File--&amp;gt;New,弹出如图所示对话框，选择CDM模型（即概念数据模型）建立模型。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_02.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;2）完成概念数据模型的创建。以下图示，对当前的工作空间进行简单介绍。（以后再更详细说明）&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_03.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;3）选择新增的CDM模型，右击，在弹出的菜单中选择&amp;#8220;Properties&amp;#8221;属性项，弹出如图所示对话框。在&amp;#8220;General&amp;#8221;标签里可以输入所建模型的名称、代码、描述、创建者、版本以及默认的图表等等信息。在&amp;#8220;Notes&amp;#8221;标签里可以输入相关描述及说明信息。当然再有更多的标签，可以点击 "More&amp;gt;&amp;gt;"按钮，这里就不再进行详细解释。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_04.jpg" width="522" height="403"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、创建新实体&lt;/strong&gt;&lt;br /&gt;1）在CDM的图形窗口中，单击工具选项版上的Entity工具，再单击图形窗口的空白处，在单击的位置就出现一个实体符号。点击Pointer工具或右击鼠标，释放Entitiy工具。如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_05.jpg"  alt="" /&gt;&lt;br /&gt;2）双击刚创建的实体符号，打开下列图标窗口，在此窗口&amp;#8220;General&amp;#8221;标签中可以输入实体的名称、代码、描述等信息。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_06.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、添加实体属性&lt;/strong&gt;&lt;br /&gt;1）在上述窗口的&amp;#8220;Attribute&amp;#8221;选项标签上可以添加属性，如下图所示。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_07.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;数据项中的&amp;#8220;添加属性&amp;#8221;和&amp;#8220;重用已有数据项&amp;#8221;这两项功能与模型中Data Item的Unique code 和Allow reuse选项有关。&lt;br /&gt;P列表示该属性是否为主标识符;D列表示该属性是否在图形窗口中显示;M列表示该属性是否为强制的，即该列是否为空值。&lt;br /&gt;&lt;br /&gt;如果一个实体属性为强制的，那么， 这个属性在每条记录中都必须被赋值，不能为空。 &lt;/p&gt;&lt;p&gt;2）在上图所示窗口中，点击插入属性按钮，弹出属性对话框，如下图所示。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_08.jpg"  alt="" /&gt;&lt;/p&gt;&lt;p&gt;注意：这里涉及到域的概念，即一种标准的数据结构，它可应用至数据项或实体的属性上。在以下的教程中将另立章节详细说明。&lt;br /&gt;&lt;br /&gt;待续。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;目标：&lt;br /&gt;本文主要介绍属性的标准检查约束、如何定义属性的附加检查。&lt;br /&gt;&lt;br /&gt;一、定义属性的标准检查约束&lt;br /&gt;标准检查约束是一组确保属性有效的表达式。在实体属性的特性窗口，打开如图所示的检查选项卡。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_09.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;在这个选项卡可以定义属性的标准检查约束，窗口中每项的参数的含义，如下&lt;br /&gt;&lt;table style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; padding-bottom: 1px; margin: 1px; padding-left: 1px; width: 577px; padding-right: 1px; border-collapse: collapse; height: 52px; border-top: #000000 1px solid; border-right: #000000 1px solid; padding-top: 1px" border="1" cellspacing="0" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="width: 107px; height: 25px; font-size: 10pt"&gt;参数&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;说明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Minimum&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性可接受的最小数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Maximum&amp;nbsp;&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性可接受的最大数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Default&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性不赋值时，系统提供的默认值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Unit&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;单位，如公里、吨、元&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Format&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的数据显示格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Lowercase&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的赋值全部变为小写字母&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Uppercase&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的赋值全部变为大写字母&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Cannot modify&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;该属性一旦赋值不能再修改&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;List Of Values&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性赋值列表，除列表中的值，不能有其他的值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Label&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性列表值的标签&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;二、定义属性的附加检查&lt;br /&gt;当Standard checks 或Rules 不能满足检查的要求时，可以在Additional Checks选项卡的Server子页上，通过SQL语句中使用%MINMAX%、%LISTVAL%、%RULES%、%UPPER%、%LOWER%几个变量来定义Standard和Rule,如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_10.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;%MINMAX%、%LISTVAL%、%UPPER%、%LOWER%&lt;br /&gt;在Standard Check中定义的Minimum 和Maximum、List values 、uppervalues、lowervalues&lt;br /&gt;&lt;br /&gt;%RULES%&lt;br /&gt;在Rules特性窗口Expression选项卡中定义的有效性规则表达式&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;待续。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;目标：&lt;br /&gt;本文主要介绍如何定义实体的主、次标识符。&lt;br /&gt;&lt;br /&gt;一、标识符&lt;br /&gt;标识符是实体中一个或多个属性的集合，可用来唯一标识实体中的一个实例。要强调的是，CDM中的标识符等价于PDM中的主键或候选键。&lt;br /&gt;每个实体都必须至少有一个标识符。如果实体只有一个标识符，则它为实体的主标识符。如果实体有多个标识符，则其中一个被指定为主标识符，其余的标识符就是次标识符了。&lt;br /&gt;&lt;br /&gt;二、如果定义主、次标识符&lt;br /&gt;1）选择某个实体双击弹出实体的属性对话框。在Identifiers选项卡上可以进行实体标识符的定义。如下图所示&lt;br /&gt;&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_11.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;2）选择第一行&amp;#8220;主标识符&amp;#8221;，点击属性按钮或双击第一行&amp;#8220;主标识符&amp;#8221;，弹出属性对话框，如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_12.jpg"  alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;3）选择"Attributes"选项卡，再点击&amp;#8220;Add Attributes&amp;#8221;工具，弹出如图所示窗口，选择某个属性作为标识符就行了。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_13.jpg"  alt="" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;待续。&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;目标：&lt;br /&gt;本文主要介绍数据项、新增数据项、数据项的唯一性代码选项和重用选项等。&lt;br /&gt;&lt;br /&gt;一、数据项&lt;br /&gt;数据项（Data Item）是信息存储的最小单位，它可以附加在实体上作为实体的属性。&lt;br /&gt;注意：模型中允许存在没有附加至任何实体上的数据项。&lt;br /&gt;&lt;br /&gt;二、新建数据项&lt;br /&gt;1）使用&amp;#8220;Model&amp;#8221;---&amp;gt; Data Items 菜单，在打开的窗口中显示已有的数据项的列表，点击 &amp;#8220;Add a Row&amp;#8221;按钮，创建一个新数据项，如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_14.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;2）当然您可以继续设置具体数据项的Code、DataType、Length等等信息。这里就不再详细说明了。&lt;br /&gt;&lt;br /&gt;三、数据项的唯一性代码选项和重用选项&lt;br /&gt;使用Tools---&amp;gt;Model Options-&amp;gt;Model Settings。在Data Item组框中定义数据项的唯一性代码选项(Unique Code)与重用选项（Allow Reuse）。&lt;br /&gt;注意：&lt;br /&gt;如果选择Unique Code复选框 ，每个数据项在同一个命名空间有唯一的代码，而选择Allow reuse ，一个数据项可以充当多个实体的属性。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_15.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;四、在实体中添加数据项&lt;br /&gt;1）双击一个实体符号，打开该实体的属性窗口。&lt;br /&gt;2）单击Attributes选项卡，打开如下图所示窗口&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_16.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;Add a DataItem 与 Reuse a DataItem的区别在于&lt;br /&gt;Add a DataItem 情况下，选择一个已经存在的数据项，系统会自动复制所选择的数据项。如果您设置了UniqueCode选项，那系统在复制过程中，新数据项的Code会自动生成一个唯一的号码，否则与所选择的数据项完全一致。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reuse a DataItem情况下，只引用不新增，就是引用那些已经存在的数据项，作为新实体的数据项。&lt;br /&gt;&lt;br /&gt;待续。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;目标：本文主要介绍联系的定义及使用。&lt;/span&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;一、&amp;nbsp;联系&lt;/strong&gt;&lt;br /&gt;联系（Relationship）是指实体集这间或实体集内部实例之间的连接。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;实体之间可以通过联系来相互关联。与实体和实体集对应，联系也可以分为联系和联系集，联系集是实体集之间的联系，联系是实体之间的联系，联系是具有方向性的。联系和联系集在含义明确的情况之下均可称为联系。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;按照实体类型中实例之间的数量对应关系，通常可将联系分为4类，即一对一（ONE&amp;nbsp;TO ONE）联系、一对多（ONE TO MANY）联系、多对一（MANY TO ONE）联系和多对多联系（MANY TO MANY）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;二、&amp;nbsp;建立联系&lt;/strong&gt;&lt;br /&gt;在CDM工具选项板中除了公共的工具外，还包括如下图所示的其它对象产生工具。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_17.jpg"  alt="" /&gt;&lt;br /&gt;&amp;nbsp;在图形窗口中创建两个实体后，单击&amp;#8220;实体间建立联系&amp;#8221;工具，单击一个实体，在按下鼠标左键的同时把光标拖至别一个实体上并释放鼠标左键，这样就在两个实体间创建了联系，右键单击图形窗口，释放Relationship工具。如下图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_18.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、&amp;nbsp;四种基本的联系&lt;br /&gt;&lt;/strong&gt;即一对一（ONE&amp;nbsp;TO ONE）联系、一对多（ONE TO MANY）联系、多对一（MANY TO ONE）联系和多对多联系（MANY TO MANY）。如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_19.jpg"  alt="" /&gt;&lt;br /&gt;&lt;strong&gt;四、&amp;nbsp;其他几类特殊联系&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;除了4种基本的联系之外，实体集与实体集之间还存在标定联系（Identify Relationship）、非标定联系（Non-Identify RelationShip）和递归联系（Recursive Relationship）。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;标定联系：&lt;/strong&gt;&lt;br /&gt;&lt;/em&gt;每个实体类型都有自己的标识符，如果两个实体集之间发生联系，其中一个实体类型的标识符进入另一个实体类型并与该实体类型中的标识符共同组成其标识符时，这种联系则称为标定联系，也叫依赖联系。反之称为非标定联系，也叫非依赖联系。&lt;br /&gt;&lt;span style="color: #ff0000"&gt;&amp;nbsp;注意：&lt;br /&gt;在非标定联系中，一个实体集中的部分实例依赖于另一个实例集中的实例，在这种依赖联系中，每个实体必须至少有一个标识符。而在标定联系中，一个实体集中的全部实例完全依赖于另个实体集中的实例，在这种依赖联系中一个实体必须至少有一个标识符，而另一个实体却可以没有自己的标识符。没有标识符的实体用它所依赖的实体的标识符作为自己的标识符。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;换句话来理解，在标定联系中，一个实体（选课）依赖 一个实体（学生），那么（学生）实体必须至少有一个标识符，而（选课）实体可以没有自己的标识符，没有标标识符的实体可以用实体（学生）的标识符作为自己的标识符。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_20.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;nbsp;递归联系：&lt;/strong&gt;&lt;br /&gt;&lt;/em&gt;递归联系是实体集内部实例之间的一种联系，通常形象地称为自反联系。同一实体类型中不同实体集之间的联系也称为递归联系。&lt;br /&gt;&lt;br /&gt;例如：在&amp;#8220;职工&amp;#8221;实体集中存在很多的职工，这些职工之间必须存在一种领导与被领导的关系。又如&amp;#8220;学生&amp;#8221;实体信中的实体包含&amp;#8220;班长&amp;#8221;子实体集与&amp;#8220;普通学生&amp;#8221;子实体集，这两个子实体集之间的联系就是一种递归联系。创建递归联系时，只需要单击&amp;#8220;实体间建立联系&amp;#8221;工具从实体的一部分拖至该实体的别一个部分即可。如图&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_21.jpg"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;五、&amp;nbsp;定义联系的特性&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;在两个实体间建立了联系后，双击联系线，打开联系特性窗口，如图所示。&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_22.jpg" width="522" height="490"  alt="" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&amp;nbsp;六、&amp;nbsp;定义联系的角色名&lt;br /&gt;&lt;/strong&gt;在联系的两个方向上各自包含有一个分组框，其中的参数只对这个方向起作用，Role Name为角色名，描述该方向联系的作用，一般用一个动词或动宾组表。&lt;br /&gt;如：&amp;#8220;学生 to 课目&amp;nbsp;&amp;#8221; 组框中应该填写&amp;#8220;拥有&amp;#8221;，而在&amp;#8220;课目To 学生&amp;#8221;组框中填写&amp;#8220;属于&amp;#8221;。（在此只是举例说明，可能有些用词不太合理）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;七、&amp;nbsp;定义联系的强制性&lt;/strong&gt;&lt;br /&gt;Mandatory 表洋这个方向联系的强制关系。选中这个复选框，则在联系线上产生一个联系线垂直的竖线。不选择这个复选框则表示联系这个方向上是可选的，在联系线上产生一个小圆圈。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;八、&amp;nbsp;有关联系的基数&lt;/strong&gt;&lt;br /&gt;联系具有方向性，每个方向上都有一个基数。&lt;br /&gt;&lt;br /&gt;举例，&lt;br /&gt;&amp;#8220;系&amp;#8221;与&amp;#8220;学生&amp;#8221;两个实体之间的联系是一对多联系，换句话说&amp;#8220;学生&amp;#8221;和&amp;#8220;系&amp;#8221;之间的联系是多对一联系。而且一个学生必须属于一个系，并且只能属于一个系，不能属于零个系，所以从&amp;#8220;学生&amp;#8221;实体至&amp;#8220;系&amp;#8221;实体的基数为&amp;#8220;1,1&amp;#8221;，从联系的另一方向考虑，一个系可以拥有多个学生，也可以没有任何学生，即零个学生，所以该方向联系的基数就为&amp;#8220;0,n&amp;#8221;,如图所示&lt;br /&gt;&lt;img border="0" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_23.jpg"  alt="" /&gt;&lt;br /&gt;待续。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;div id="cnblogs_post_body"&gt;&lt;div style="layout-grid:  15.6pt none"&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;新年开篇说明：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: blue"&gt;很感谢大伙对此系列教程的关注，因为工作的很多原因，一直没时间静下心来整理新的教程，担心没有自己没有理解清楚写出来误导大伙，故一拖再一拖，几年过去了，最近又收到很多网友的邮件要求继续写下去，没能一一回复，还望谅解。以后每周抽出时间写一篇，篇幅长一点，仅此答谢广大关注的网友。&lt;/span&gt;&lt;span style="color: blue"&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;目标：本文主要介绍继承联系定义及使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;一、&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;定义&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;实体之间除了我们之前所讲的联系外，还存在分类关系、继承关系。在&lt;/span&gt;CDM&lt;span style="font-family: 宋体"&gt;中我们统称分类关系、继承关系为继承联系。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;通过特殊化或概化方法产生的实体类型之间的联系称为继承联系。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family: 宋体; color: #003366"&gt;特殊化：在实体集内部分组并把这些分组存放在不同的实体类型中的过程称为实体集的特殊化。&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family: 宋体; color: #003366"&gt;概化：从多个实体集的公共属性中抽象出一个公共实体类型的过程为实体集的概化。&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&amp;nbsp;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;继承联系的一端是具有普遍性的实体集，为父实体集，另一端连接的是具体特殊的一个或多个实体集，为子实体集。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;例如：&amp;#8220;银行账户&amp;#8221;是&amp;#8220;借记卡账户&amp;#8221;与&amp;#8220;信用卡账户&amp;#8221;的父实体，相反&amp;#8220;借记卡账户&amp;#8221;与&amp;#8220;信用卡账户&amp;#8221;是&amp;#8220;银行账户&amp;#8221;的子实体。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;另外在继承联系中，还可以分为&lt;span style="color: red"&gt;互斥性继承联系&lt;/span&gt;和&lt;span style="color: red"&gt;非互斥性继承&lt;/span&gt;联系。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family: 宋体; color: #003366"&gt;互斥性继承联系：父实体中的一个实例只能在一个子实体中。例如：&amp;#8220;帐户&amp;#8221;主实体下的&amp;#8220;个人账户&amp;#8221;与&amp;#8220;公司账户&amp;#8221;两个子实体之间的联系是互斥的。&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;span style="font-family: 宋体; color: #003366"&gt;非互斥性继承联系：父实体中的一个实例可以在多个子实体中。例如：&amp;#8220;职工&amp;#8221;父实体下的&amp;#8220;干部&amp;#8221;与&amp;#8220;教师&amp;#8221;子实体之间属于非互斥继承联系，教师有可能也是干部，干部有可能也是教师。&lt;/span&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;这里我就不再图示了，望大伙要认真理解概念。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;二、&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;创建继承联系&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体; color: red"&gt;注意：&lt;/span&gt;&lt;span style="color: red"&gt;PowerDesigner 15 &lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;的版本，工具栏上的&lt;/span&gt;&lt;span style="color: red"&gt;Inheritance&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;图标默认是禁用的。打开方法如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: red"&gt;Tools-&amp;gt;Model Options-&amp;gt;Model Settings-&amp;gt;Notation &lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;设为&amp;#8220;&lt;/span&gt;&lt;span style="color: red"&gt;E/R+Merise&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;&amp;#8221;就行了。&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_1.jpg" width="250" height="227" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;/span&gt;&lt;span style="font-family: 黑体"&gt;图示&lt;/span&gt; &lt;span&gt;1&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;div style="layout-grid:  15.6pt none"&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_2.jpg" width="247" height="263" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;图示&lt;/span&gt; &lt;span&gt;2&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;在&lt;/span&gt;CDM&lt;span style="font-family: 宋体"&gt;中创建两个实体，&lt;/span&gt;A&lt;span style="font-family: 宋体"&gt;与&lt;/span&gt;B,&lt;span style="font-family: 宋体"&gt;单击工具选项板上的继承工具&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_6.jpg" width="22" height="21" /&gt;连接&lt;/span&gt;A&lt;span style="font-family: 宋体"&gt;与&lt;/span&gt;B&lt;span style="font-family: 宋体"&gt;实体。图示&lt;/span&gt;1 &lt;/p&gt;&lt;p&gt;A&lt;span style="font-family: 宋体"&gt;是父实体，&lt;/span&gt;B&lt;span style="font-family: 宋体"&gt;是子实体。再创建实体&lt;/span&gt;C&lt;span style="font-family: 宋体"&gt;以同样的方法连接到&lt;/span&gt;C&lt;span style="font-family: 宋体"&gt;实体上。如图&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;所示，表示&lt;/span&gt;B&lt;span style="font-family: 宋体"&gt;、&lt;/span&gt;C&lt;span style="font-family: 宋体"&gt;与&lt;/span&gt;A&lt;span style="font-family: 宋体"&gt;之间存在继承联系。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;三、&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;定义互斥性继承联系&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;双击继承联系的半圆符号，打开继承联系的属性窗口。如图&lt;/span&gt;3&lt;span style="font-family: 宋体"&gt;所示&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_3.jpg" width="521" height="401" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;图示&lt;/span&gt; &lt;span&gt;3&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: red"&gt;Mutually exclusive children&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-family: 宋体; color: red"&gt;表示父实体中的一条记录只能在一个子实体上出现，子实体之间存在互斥的关系。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="color: red"&gt;Complete&lt;/span&gt;&lt;/strong&gt; &lt;span style="font-family: 宋体; color: red"&gt;表示父实体的所有实例必须是子实体之一，例如：&amp;#8220;人&amp;#8221;实体有&amp;#8220;男人&amp;#8221;和&amp;#8220;女人&amp;#8221;两个子实体，每个&amp;#8220;人&amp;#8221;实体的实例可以是&amp;#8220;男人&amp;#8221;或&amp;#8220;女人&amp;#8221;。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;四、&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;定义继承联系的生成模式&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_4.jpg" width="521" height="401" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;图示&lt;/span&gt; &lt;span&gt;4&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;定义由&lt;/span&gt;CDM&lt;span style="font-family: 宋体"&gt;生成&lt;/span&gt;PDM&lt;span style="font-family: 宋体"&gt;或者生成&lt;/span&gt;OOM&lt;span style="font-family: 宋体"&gt;中的&lt;/span&gt;class&lt;span style="font-family: 宋体"&gt;图的生成模式。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;说明：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Generate parent&lt;/strong&gt;&lt;span style="font-family: 宋体"&gt;：表示继承联系中的父实体会生成&lt;/span&gt;PDM&lt;span style="font-family: 宋体"&gt;中的表或&lt;/span&gt;Class&lt;span style="font-family: 宋体"&gt;图中的类。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Generate children&lt;/strong&gt;&lt;span style="font-family: 宋体"&gt;：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;1）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;选择&lt;/span&gt;&lt;span style="color: red"&gt;Inherit all attributes&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;表示继承联系中的子实体生成&lt;/span&gt;PDM&lt;span style="font-family: 宋体"&gt;中的表或&lt;/span&gt;Class&lt;span style="font-family: 宋体"&gt;图中的类，并且继承父实体中的所有实体属性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;2）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;选择&lt;/span&gt;&lt;span style="color: red"&gt;Inherit only primary attributes&lt;/span&gt;,&lt;span style="font-family: 宋体"&gt;表示继承联系中子实体生成&lt;/span&gt;PDM&lt;span style="font-family: 宋体"&gt;中的表或&lt;/span&gt;Class&lt;span style="font-family: 宋体"&gt;图中的类，但只继承父实体中的标识符属性。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span&gt;五、&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="font-family: 宋体"&gt;继承联系状态表&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/7_5.jpg" width="466" height="255" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 黑体"&gt;图示&lt;/span&gt; &lt;span&gt;5&lt;/span&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;目标：本文主要介绍域的概念以及使用。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;一、&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;概念&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;域：实际上就是一个取值范围，也可扩展为一个数据类型。域可以定义检查约束、取值范围、最大值、最小值、默认值等。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;域是通过用户自定义类型实现的，定义一个域的后，可以实多个实体的属性共享，这也模型设计中非常重要。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;例如：&amp;#8220;服务生&amp;#8221;、&amp;#8220;客户&amp;#8221;、&amp;#8220;操作员&amp;#8221;三个实体中都有&amp;#8220;姓名&amp;#8221;属性，我们就可以定义一个&amp;#8220;姓名&amp;#8221;域，分别附加到三个实体中，修改域的同时，使用域的实体的相关属性也会随之更新。所图所示&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/8_1.jpg" width="613" height="163" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span&gt;二、&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;域的定义&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;菜单&lt;/span&gt;Model-&amp;gt;Domains,&lt;span style="font-family: 宋体"&gt;在弹出窗口&amp;#8220;&lt;/span&gt;List of Domains&lt;span style="font-family: 宋体"&gt;&amp;#8221;中&lt;/span&gt;,&lt;span style="font-family: 宋体"&gt;增加新的域。如图所示&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/8_2.jpg" width="518" height="328" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;三、&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;附加域到实体属性&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;打开实体的属性选项卡，如图所示，从&lt;/span&gt;Domain&lt;span style="font-family: 宋体"&gt;下拉列表中选择一个域&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/8_3.jpg" width="525" height="403" /&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;注：&lt;span style="color: red"&gt;设置域与数据项的分离关系，&lt;/span&gt;&lt;/span&gt;&lt;span style="color: red"&gt;Tools-&amp;gt;Model Options -&amp;gt;Model&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;，设置&amp;#8220;&lt;/span&gt;&lt;span style="color: red"&gt;Domain/Attribute&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="color: red"&gt;,Enforce non-divergence &lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;下的&lt;/span&gt;&lt;span style="color: red"&gt;Data type(&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;数据类型、长度、精度&lt;/span&gt;&lt;span style="color: red"&gt;)&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;、&lt;/span&gt;&lt;span style="color: red"&gt;Check&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;（检查约束）、&lt;/span&gt;&lt;span style="color: red"&gt;Rules&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;（业务规则）、&lt;/span&gt;&lt;span style="color: red"&gt;Mandatory&lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;等。如果都不选，则表示设置域与数据项是可分离的。默认为&lt;/span&gt;&lt;span style="color: red"&gt;Data type &lt;/span&gt;&lt;span style="font-family: 宋体; color: red"&gt;不可分离，可自行设置。如下图所示&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/8_4.jpg" width="553" height="423" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;四、&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;附加域到数据项上&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;菜单&lt;/span&gt;Model-&amp;gt;Data Items,&lt;span style="font-family: 宋体"&gt;在弹出窗口&amp;#8220;&lt;/span&gt;List Data Items&lt;span style="font-family: 宋体"&gt;&amp;#8221;中，添加数据项以及附加域&lt;/span&gt;,&lt;span style="font-family: 宋体"&gt;所图所示&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/8_5.jpg" width="529" height="443" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div id="MySignature"&gt;&lt;/div&gt;&lt;p&gt;&lt;script type="text/javascript"&gt;if ($ != jQuery) {$ = jQuery.noConflict();}var isLogined = true;var cb_blogId = 25621;var cb_entryId = 1935708;var cb_blogApp = "yxonline";var cb_blogUserGuid = "39703d0b-63cf-dd11-9e4d-001cf0cd104b";var cb_entryCreatedDate = '2011/1/14 16:22:00';&lt;/script&gt;&lt;/p&gt;&lt;div id="blog_post_info_block"&gt;&amp;nbsp;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2498190.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498190.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498186.html</id><title type="text">怎么成为优秀的软件模型设计者?</title><summary type="text">http://www.doc88.com/p-295590413178.html作者：Scott Ambler著，乐林峰 译 本文选自：www.umlchina.com2002年03月25日我们期待自己成为一个优秀的软件模型设计者，但是，要怎样做，又从哪里开始呢？将下列原则应用到你的软件工程中，你会获得立杆见影的成果。1. 人远比技术重要 你开发软件是为了供别人使用，没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平，因为他们那时侯将主要精力都集中在技术上。显然，构件（components），EJB（Enterprise Java Beans）</summary><published>2012-05-13T08:11:00Z</published><updated>2012-05-13T08:11:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498186.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498186.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.doc88.com/p-295590413178.html"&gt;http://www.doc88.com/p-295590413178.html&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;作者：Scott Ambler著，乐林峰 译 &lt;br /&gt;本文选自：www.umlchina.com&lt;br /&gt;2002年03月25日&lt;/p&gt;&lt;p&gt;&lt;br /&gt;我们期待自己成为一个优秀的软件模型设计者，但是，要怎样做，又从哪里开始呢？&lt;/p&gt;&lt;p&gt;将下列原则应用到你的软件工程中，你会获得立杆见影的成果。&lt;/p&gt;&lt;p&gt;1. 人远比技术重要 &lt;/p&gt;&lt;p&gt;你开发软件是为了供别人使用，没有人使用的软件只是没有意义的数据的集合而已。许多在软件方面很有成就的行家在他们事业的初期却表现平平，因为他们那时侯将主要精力都集中在技术上。显然，构件（components），EJB（Enterprise Java Beans）和代理（agent）是很有趣的东西。但是对于用户来说，如果你设计的软件很难使用或者不能满足他们的需求，后台用再好的技术也于事无补。多花点时间到软件需求和设计一个使用户能很容易理解的界面上。&lt;/p&gt;&lt;p&gt;2. 理解你要实现的东西 &lt;/p&gt;&lt;p&gt;好的软件设计人员把大多数时间花费在建立系统模型上，偶尔写一些源代码，但那只不过是为了验证设计过程中所遇到的问题。这将使他们的设计方案更加可行。&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a name="more"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;3. 谦虚是必须的品格 &lt;/p&gt;&lt;p&gt;你不可能知道一切，你甚至要很努力才能获得足够用的知识。软件开发是一项复杂而艰巨的工作，因为软件开发所用到的工具和技术是在不断更新的。而且，一个人也不可能了解软件开发的所有过程。在日常生活中你每天接触到的新鲜事物可能不会太多。但是对于从事软件开发的人来说，每天可以学习很多新东西（如果愿意的话）。&lt;/p&gt;&lt;p&gt;4. 需求就是需求 &lt;/p&gt;&lt;p&gt;如果你没有任何需求，你就不要动手开发任何软件。成功的软件取决于时间（在用户要求的时间内完成）、预算和是否满足用户的需求。如果你不能确切知道用户需要的是什么，或者软件的需求定义，那么你的工程注定会失败。&lt;/p&gt;&lt;p&gt;5. 需求其实很少改变，改变的是你对需求的理解 &lt;/p&gt;&lt;p&gt;Object ToolSmiths公司（www.objecttoolsmiths.com）的Doug Smith常喜欢说：&amp;#8220;分析是一门科学，设计是一门艺术&amp;#8221;。他的意思是说在众多的&amp;#8220;正确&amp;#8221;分析模型中只存在一个最&amp;#8220;正确&amp;#8221;分析模型可以完全满足解决某个具体问题的需要（我理解的意思是需求分析需要一丝不苟、精确的完成,而设计的时候反而可以发挥创造力和想象力 - 译者注）。&lt;/p&gt;&lt;p&gt;如果需求经常改动，很可能是你没有作好需求分析，并不是需求真的改变了。&lt;/p&gt;&lt;p&gt;你可以抱怨用户不能告诉你他们想得到什么，但是不要忘记，收集需求信息是你工作。&lt;/p&gt;&lt;p&gt;你可以说是新来的开发人员把事情搞得一团糟，但是，你应该确定在工程的第一天就告诉他们应该做什么和怎样去做。&lt;/p&gt;&lt;p&gt;如果你觉得公司不让你与用户充分接触，那只能说明公司的管理层并不是真正支持你的项目。&lt;/p&gt;&lt;p&gt;你可以抱怨公司有关软件工程的管理制度不合理，但你必须了解大多同行公司是怎么做的。&lt;/p&gt;&lt;p&gt;你可以借口说你们的竞争对手的成功是因为他们有了一个新的理念，但是为什么你没先想到呢？&lt;/p&gt;&lt;p&gt;需求真正改变的情况很少，但是没有做好需求分析工作的理由却很多。&lt;/p&gt;&lt;p&gt;6. 经常阅读 &lt;/p&gt;&lt;p&gt;在这个每日都在发生变化的产业中，你不可能在已取得的成就上陶醉太久。&lt;/p&gt;&lt;p&gt;每个月至少读2、3本专业杂志或者1本专业书籍。保持不落伍需要付出很多的时间和金钱，但会使你成为一个很有实力的竞争者。&lt;/p&gt;&lt;p&gt;7. 降低软件模块间的耦合度 &lt;/p&gt;&lt;p&gt;高耦合度的系统是很难维护的。一处的修改引起另一处甚至更多处的变动。&lt;/p&gt;&lt;p&gt;你可以通过以下方法降低程序的耦合度：隐藏实现细节，强制构件接口定义，不使用公用数据结构，不让应用程序直接操作数据库（我的经验法则是：当应用程序员在写SQL代码的时候，你的程序的耦合度就已经很高了）。&lt;/p&gt;&lt;p&gt;耦合度低的软件可以很容易被重用、维护和扩充。&lt;/p&gt;&lt;p&gt;8. 提高软件的内聚性 &lt;/p&gt;&lt;p&gt;如果一个软件的模块只实现一个功能，那么该模块具有高内聚性。高内聚性的软件更容易维护和改进。&lt;/p&gt;&lt;p&gt;判断一个模块是否有高的内聚性，看一看你是否能够用一个简单的句子描述它的功能就行了。如果你用了一段话或者你需要使用类似&amp;#8220;和&amp;#8221;、&amp;#8220;或&amp;#8221;等连词，则说明你需要将该模块细化。&lt;/p&gt;&lt;p&gt;只有高内聚性的模块才可能被重用。&lt;/p&gt;&lt;p&gt;9. 考虑软件的移植性 &lt;/p&gt;&lt;p&gt;移植是软件开发中一项具体而又实际的工作，不要相信某些软件工具的广告宣传（比如java 的宣传口号write once run many ? 译者注）。&lt;/p&gt;&lt;p&gt;即使仅仅对软件进行常规升级，也要把这看得和向另一个操作系统或数据库移植一样重要。&lt;/p&gt;&lt;p&gt;记得从16位Windows移植到32位windows的&amp;#8220;乐趣&amp;#8221;吗 ？当你使用了某个操作系统的特性，如它的进程间通信(IPC)策略，或用某数据库专有语言写了存储过程。你的软件和那个特定的产品结合度就已经很高了。&lt;/p&gt;&lt;p&gt;好的软件设计者把那些特有的实现细节打包隐藏起来，所以，当那些特性该变的时候，你的仅仅需要更新那个包就可以了。&lt;/p&gt;&lt;p&gt;10. 接受变化 &lt;/p&gt;&lt;p&gt;这是一句老话了：唯一不变的只有变化。&lt;/p&gt;&lt;p&gt;你应该将所有系统将可能发生的变化以及潜在需求记录下来,以便将来能够实现（参见&amp;#8220;Architecting for Change&amp;#8221;，Thinking Objectively, May 1999）&lt;/p&gt;&lt;p&gt;通过在建模期间考虑这些假设的情况，你就有可能开发出足够强壮且容易维护的软件。设计强壮的软件是你最基本的目标。&lt;/p&gt;&lt;p&gt;11. 不要低估对软件规模的需求 &lt;/p&gt;&lt;p&gt;Internet 带给我们的最大的教训是你必须在软件开发的最初阶段就考虑软件规模的可扩充性。&lt;/p&gt;&lt;p&gt;今天只有100人的部门使用的应用程序，明天可能会被有好几万人的组织使用，下月，通过因特网可能会有几百万人使用它。&lt;/p&gt;&lt;p&gt;在软件设计的初期，根据在用例模型中定义的必须支持的基本事务处理，确定软件的基本功能。然后，在建造系统的时候再逐步加入比较常用的功能。&lt;/p&gt;&lt;p&gt;在设计的开始考虑软件的规模需求，避免在用户群突然增大的情况下，重写软件。&lt;/p&gt;&lt;p&gt;12. 性能仅仅是很多设计因素之一 &lt;/p&gt;&lt;p&gt;关注软件设计中的一个重要因素--性能，这好象也是用户最关心的事情。一个性能不佳的软件将不可避免被重写。&lt;/p&gt;&lt;p&gt;但是你的设计还必须具有可靠性，可用性，便携性和可扩展性。你应该在工程开始就应该定义并区分好这些因素，以便在工作中恰当使用。性能可以是，也可以不是优先级最高的因素，我的观点是，给每个设计因素应有的考虑。&lt;/p&gt;&lt;p&gt;13. 管理接口 &lt;/p&gt;&lt;p&gt;&amp;#8220;UML User Guide&amp;#8221;（Grady Booch，Ivar Jacobson和Jim Rumbaugh ,Addison Wesley, 1999）中指出，你应该在开发阶段的早期就定义软件模块之间的接口。&lt;/p&gt;&lt;p&gt;这有助于你的开发人员全面理解软件的设计结构并取得一致意见，让各模块开发小组相对独立的工作。一旦模块的接口确定之后，模块怎样实现就不是很重要了。&lt;/p&gt;&lt;p&gt;从根本上说，如果你不能够定义你的模块&amp;#8220;从外部看上去会是什么样子&amp;#8221;，你肯定也不清楚模块内要实现什么。&lt;/p&gt;&lt;p&gt;14. 走近路需要更长的时间 &lt;/p&gt;&lt;p&gt;在软件开发中没有捷径可以走。&lt;/p&gt;&lt;p&gt;缩短你的在需求分析上花的时间，结果只能是开发出来的软件不能满足用户的需求，必须被重写。&lt;/p&gt;&lt;p&gt;在软件建模上每节省一周，在将来的编码阶段可能会多花几周时间，因为你在全面思考之前就动手写程序。&lt;/p&gt;&lt;p&gt;你为了节省一天的测试时间而漏掉了一个bug，在将来的维护阶段，可能需要花几周甚至几个月的时间去修复。与其如此，还不如重新安排一下项目计划。&lt;/p&gt;&lt;p&gt;避免走捷径，只做一次但要做对（do it once by doing it right）。&lt;/p&gt;&lt;p&gt;15. 别信赖任何人 &lt;/p&gt;&lt;p&gt;产品和服务销售公司不是你的朋友，你的大部分员工和高层管理人员也不是。&lt;/p&gt;&lt;p&gt;大部分产品供应商希望把你牢牢绑在他们的产品上，可能是操作系统，数据库或者某个开发工具。&lt;/p&gt;&lt;p&gt;大部分的顾问和承包商只关心你的钱并不是你的工程（停止向他们付款，看一看他们会在周围呆多长时间）。&lt;/p&gt;&lt;p&gt;大部分程序员认为他们自己比其他人更优秀，他们可能抛弃你设计的模型而用自己认为更好的。&lt;/p&gt;&lt;p&gt;只有良好的沟通才能解决这些问题。&lt;/p&gt;&lt;p&gt;要明确的是，不要只依靠一家产品或服务提供商，即使你的公司（或组织）已经在建模、文档和过程等方面向那个公司投入了很多钱。&lt;/p&gt;&lt;p&gt;16. 证明你的设计在实践中可行 &lt;/p&gt;&lt;p&gt;在设计的时候应当先建立一个技术原型， 或者称为&amp;#8220;端到端&amp;#8221;原型。以证明你的设计是能够工作的。&lt;/p&gt;&lt;p&gt;你应该在开发工作的早期做这些事情，因为，如果软件的设计方案是不可行的，在编码实现阶段无论采取什么措施都于事无补。技术原型将证明你的设计的可行性，从而，你的设计将更容易获得支持。&lt;/p&gt;&lt;p&gt;17. 应用已知的模式 &lt;/p&gt;&lt;p&gt;目前，我们有大量现成的分析和设计模式以及问题的解决方案可以使用。&lt;/p&gt;&lt;p&gt;一般来说，好的模型设计和开发人员，都会避免重新设计已经成熟的并被广泛应用的东西。http://www.ambysoft.com/processPatternsPage.html收藏了许多开发模式的信息。&lt;/p&gt;&lt;p&gt;18. 研究每个模型的长处和弱点 &lt;/p&gt;&lt;p&gt;目前有很多种类的模型可以使用,如下图所示。用例捕获的是系统行为需求，数据模型则描述支持一个系统运行所需要的数据构成。你可能会试图在用例中加入实际数据描述，但是，这对开发者不是非常有用。同样，数据模型对描述软件需求来说是无用的。每个模型在你建模过程中有其相应的位置，但是，你需要明白在什么地方，什么时候使用它们。&lt;br /&gt;&lt;img align="middle" src="http://www.sawin.com.cn/doc/SA/Analyst/modeldesign.gif"  alt="" /&gt;&lt;/p&gt;&lt;p&gt;19. 在现有任务中应用多个模型 &lt;/p&gt;&lt;p&gt;当你收集需求的时候，考虑使用用例模型，用户界面模型和领域级的类模型。&lt;/p&gt;&lt;p&gt;当你设计软件的时候，应该考虑制作类模型，顺序图、状态图、协作图和最终的软件实际物理模型。&lt;/p&gt;&lt;p&gt;程序设计人员应该慢慢意识到，仅仅使用一个模型而实现的软件要么不能够很好地满足用户的需求，要么很难扩展。&lt;/p&gt;&lt;p&gt;20. 教育你的听众 &lt;/p&gt;&lt;p&gt;你花了很大力气建立一个很成熟的系统模型，而你的听众却不能理解它们，甚至更糟－连为什么要先建立模型都不知道。那么你的工作是毫无意义的。&lt;/p&gt;&lt;p&gt;教给你开发人员基本的建模知识；否则，他们会只看看你画的漂亮图表，然后继续编写不规范的程序。&lt;/p&gt;&lt;p&gt;另外， 你还需要告诉你的用户一些需求建模的基础知识。给他们解释你的用例(uses case)和用户界面模型，以使他们能够明白你要表达地东西。当每个人都能使用一个通用的设计语言的时候（比如UML-译者注），你的团队才能实现真正的合作。&lt;/p&gt;&lt;p&gt;21. 带工具的傻瓜还是傻瓜 &lt;/p&gt;&lt;p&gt;你给我CAD/CAM工具，请我设计一座桥。但是，如果那座桥建成的话，我肯定不想当第一个从桥上过的人，因为我对建筑一窍不通。&lt;/p&gt;&lt;p&gt;使用一个很优秀的CASE工具并不能使你成为一个建模专家，只能使你成为一个优秀CASE工具的使用者。成为一个优秀的建模专家需要多年的积累，不会是一周针对某个价值几千美元工具的培训。一个优秀的CASE工具是很重要，但你必须学习使用它，并能够使用它设计它支持的模型。&lt;/p&gt;&lt;p&gt;22. 理解完整的过程 &lt;/p&gt;&lt;p&gt;好的设计人员应该理解整个软件过程，尽管他们可能不是精通全部实现细节。&lt;/p&gt;&lt;p&gt;软件开发是一个很复杂的过程，还记得《object-oriented software process》第36页的内容吗？除了编程、建模、测试等你擅长工作外，还有很多工作要做。&lt;/p&gt;&lt;p&gt;好的设计者需要考虑全局。必须从长远考虑如何使软件满足用户需要，如何提供维护和技术支持等。&lt;/p&gt;&lt;p&gt;23. 常做测试，早做测试 &lt;/p&gt;&lt;p&gt;如果测试对你的软件来说是无所谓的，那么你的软件多半也没什么必要被开发出来。&lt;/p&gt;&lt;p&gt;建立一个技术原型供技术评审使用，以检验你的软件模型。&lt;/p&gt;&lt;p&gt;在软件生命周期中，越晚发现的错误越难修改，修改成本越昂贵。尽可能早的做测试是很值得的。&lt;/p&gt;&lt;p&gt;24. 把你的工作归档 &lt;/p&gt;&lt;p&gt;不值得归档的工作往往也不值得做。归档你的设想，以及根据设想做出的决定；归档软件模型中很重要但不很明显的部分。 给每个模型一些概要描述以使别人很快明白模型所表达的内容。&lt;/p&gt;&lt;p&gt;25. 技术会变，基本原理不会 &lt;/p&gt;&lt;p&gt;如果有人说&amp;#8220;使用某种开发语言、某个工具或某某技术，我们就不需要再做需求分析，建模，编码或测试&amp;#8221;。不要相信，这只说明他还缺乏经验。抛开技术和人的因素，实际上软件开发的基本原理自20世纪70年代以来就没有改变过。你必须还定义需求，建模，编码，测试，配置，面对风险，发布产品，管理工作人员等等。&lt;/p&gt;&lt;p&gt;软件建模技术是需要多年的实际工作才能完全掌握的。好在你可以从我的建议开始，完善你们自己的软件开发经验。&lt;/p&gt;&lt;p&gt;以鸡汤开始，加入自己的蔬菜。然后，开始享受你自己的丰盛晚餐吧。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2498186.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498186.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498164.html</id><title type="text">[转]PowerDesigner使用教程 —— 概念数据模型</title><summary type="text">一、概念数据模型概述 概念数据模型也称信息模型，它以实体－联系(Entity-RelationShip,简称E-R)理论为基础，并对这一理论进行了扩充。它从用户的观点出发对信息进行建模，主要用于数据库的概念级设计。 通常人们先将现实世界抽象为概念世界，然后再将概念世界转为机器世界。换句话说，就是先将现实世界中的客观对象抽象为实体(Entity)和联系 (Relationship),它并不依赖于具体的计算机系统或某个DBMS系统，这种模型就是我们所说的CDM;然后再将CDM转换为计算机上某个 DBMS所支持的数据模型，这样的模型就是物理数据模型,即PDM。 CDM是一组严格定义的模型元素的集合，</summary><published>2012-05-13T07:44:00Z</published><updated>2012-05-13T07:44:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498164.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498164.html"/><content type="html">&lt;strong&gt;&lt;font size="2"&gt;一、概念数据模型概述&lt;br /&gt;&lt;/font&gt;&lt;/strong&gt;&lt;font style="font-size: 10pt" face="#ce_temp_font#"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 概念数据模型也称信息模型，它以实体－联系(Entity-RelationShip,简称E-R)理论为基础，并对这一理论进行了扩充。它从用户的观点出发对信息进行建模，主要用于数据库的概念级设计。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 通常人们先将现实世界抽象为概念世界，然后再将概念世界转为机器世界。换句话说，就是先将现实世界中的客观对象抽象为实体(Entity)和联系 (Relationship),它并不依赖于具体的计算机系统或某个DBMS系统，这种模型就是我们所说的CDM;然后再将CDM转换为计算机上某个 DBMS所支持的数据模型，这样的模型就是物理数据模型,即PDM。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDM是一组严格定义的模型元素的集合，这些模型元素精确地描述了系统的&lt;u&gt;静态特性、动态特性以及完整性约束条件&lt;/u&gt;等，其中包括了&lt;u&gt;数据结构、数据操作和完整性约束&lt;/u&gt;三部分。&lt;br /&gt;1）数据结构表达为实体和属性;&lt;br /&gt;2）数据操作表达为实体中的记录的插入、删除、修改、查询等操作;&lt;br /&gt;3）完整性约束表达为数据的自身完整性约束（如数据类型、检查、规则等）和数据间的参照完整性约束（如联系、继承联系等）;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;二、实体、属性及标识符的定义&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实体（Entity），也称为实例，对应现实世界中可区别于其他对象的&amp;#8220;事件&amp;#8221;或&amp;#8220;事物&amp;#8221;。例如，学校中的每个学生，医院中的每个手术。每个实体都有用来描述实体特征的一组性质，称之为属性，一个实体由若干个属性来描述。如学生实体可由学号、姓名、性别、出生年月、所在系别、入学年份等属性组成。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实体集（Entity Set）是具体相同类型及相同性质实体的集合。例如学校所有学生的集合可定义为&amp;#8220;学生&amp;#8221;实体集，&amp;#8220;学生&amp;#8221;实体集中的每个实体均具有学号、姓名、性别、出生年月、所在系别、入学年份等性质。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实体类型（Entity Type）是实体集中每个实体所具有的共同性质的集合，例如&amp;#8220;患者&amp;#8221;实体类型为：患者｛门诊号，姓名，性别，年龄，身份证号.............｝。实体是实体类型的一个实例，在含义明确的情况下，实体、实体类型通常互换使用。实体类型中的每个实体包含唯一标识它的一个或一组属性，这些属性称为实体类型的标识符（Identifier），如&amp;#8220;学号&amp;#8221;是学生实体类型的标识符，&amp;#8220;姓名&amp;#8221;、&amp;#8220;出生日期&amp;#8221;、&amp;#8220;信址&amp;#8221;共同组成&amp;#8220;公民&amp;#8221;实体类型的标识符。有些实体类型可以有几组属性充当标识符，选定其中一组属性作为实体类型的主标识符，其他的作为次标识符。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;三、实体、属性及标识符的表达&lt;br /&gt;&lt;/strong&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_01.jpg" /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;四、新建概念数据模型&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;1）选择File--&amp;gt;New,弹出如图所示对话框，选择CDM模型（即概念数据模型）建立模型。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_02.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;2）完成概念数据模型的创建。以下图示，对当前的工作空间进行简单介绍。（以后再更详细说明）&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_03.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;3）选择新增的CDM模型，右击，在弹出的菜单中选择&amp;#8220;Properties&amp;#8221;属性项，弹出如图所示对话框。在&amp;#8220;General&amp;#8221;标签里可以输入所建模型的名称、代码、描述、创建者、版本以及默认的图表等等信息。在&amp;#8220;Notes&amp;#8221;标签里可以输入相关描述及说明信息。当然再有更多的标签，可以点击 "More&amp;gt;&amp;gt;"按钮，这里就不再进行详细解释。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_04.jpg" width="522" height="403" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;五、定义实体&lt;br /&gt;&lt;br /&gt;1、创建实体&lt;br /&gt;&lt;/strong&gt;1）在CDM的图形窗口中，单击工具选项版上的Entity工具，再单击图形窗口的空白处，在单击的位置就出现一个实体符号。点击Pointer工具或右击鼠标，释放Entitiy工具。如图所示&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_05.jpg" /&gt;&lt;br /&gt;2）双击刚创建的实体符号，打开下列图标窗口，在此窗口&amp;#8220;General&amp;#8221;标签中可以输入实体的名称、代码、描述等信息。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_06.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Name：是用来在模型中标识一个实体，一般用于模型在界面中的显示（这个可以通过更改选项设置进行改变）。在一个模型当中，实体的名字不能重复。&lt;/p&gt;&lt;p&gt;Code：在模型转化时一般作为对象的物理名称，比如把实体属性的Code转化为数据库中的列名，当然我们现在不必为了这个实体将来叫什么而费神，一般采取与Name一致即可。&lt;/p&gt;&lt;p&gt;Generate：默认是选择状态，如果取消，则在转化为其他模型时，会忽略这个实体。&lt;/p&gt;&lt;strong&gt;2、添加实体属性&lt;/strong&gt;&lt;br /&gt;1）在上述窗口的&amp;#8220;Attribute&amp;#8221;选项标签上可以添加属性，如下图所示。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_07.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;数据项中的&amp;#8220;添加属性&amp;#8221;和&amp;#8220;重用已有数据项&amp;#8221;这两项功能与模型中Data Item的Unique code 和Allow reuse选项有关。&lt;br /&gt;P列表示该属性是否为主标识符;D列表示该属性是否在图形窗口中显示;M列表示该属性是否为强制的，即该列是否为空值。&lt;br /&gt;&lt;br /&gt;如果一个实体属性为强制的，那么， 这个属性在每条记录中都必须被赋值，不能为空。&lt;br /&gt;&lt;p&gt;按&amp;#8220;Crtl+U&amp;#8221;呼出&amp;#8220;定制列过滤器&amp;#8221;的窗口，可以根据自己的喜好和实际需要选择那些列出现在窗口中，那些隐藏。使用快捷键 &amp;#8220;Crtl+E&amp;#8221;可以允许或者禁止当前过滤器。&lt;/p&gt;&lt;p&gt;2）在上图所示窗口中，点击插入属性按钮，弹出属性对话框，如下图所示。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_08.jpg" /&gt;&lt;/p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-weight: bold"&gt;3、定义属性的检查约束&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;1）定义属性的标准检查&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;标准检查约束&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;是一组确保属性有效的表达式。在实体属性的特性窗口，打开如图所示的检查选项卡。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_09.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;在这个选项卡可以定义属性的标准检查约束，窗口中每项的参数的含义，如下&lt;br /&gt;&lt;table style="border-bottom: rgb(0,0,0) 1px solid; border-left: rgb(0,0,0) 1px solid; padding-bottom: 1px; margin: 1px; padding-left: 1px; width: 577px; padding-right: 1px; border-collapse: collapse; height: 52px; border-top: rgb(0,0,0) 1px solid; border-right: rgb(0,0,0) 1px solid; padding-top: 1px" border="1" cellspacing="0" cellpadding="3"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="width: 107px; height: 25px; font-size: 10pt"&gt;参数&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;说明&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Minimum&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性可接受的最小数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Maximum&amp;nbsp;&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性可接受的最大数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Default&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性不赋值时，系统提供的默认值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Unit&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;单位，如公里、吨、元&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Format&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的数据显示格式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Lowercase&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的赋值全部变为小写字母&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Uppercase&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性的赋值全部变为大写字母&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Cannot modify&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;该属性一旦赋值不能再修改&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;List Of Values&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性赋值列表，除列表中的值，不能有其他的值&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-size: 10pt"&gt;Label&lt;/td&gt;&lt;td style="font-size: 10pt"&gt;属性列表值的标签&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;2）定义属性的附加检查&lt;br /&gt;当Standard checks 或Rules 不能满足检查的要求时，可以在Additional Checks选项卡的Server子页上，通过SQL语句中使用%MINMAX%、%LISTVAL%、%RULES%、%UPPER%、%LOWER% 几个变量来定义Standard和Rule,如图所示&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_10.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;%MINMAX%、%LISTVAL%、%UPPER%、%LOWER%&lt;br /&gt;在Standard Check中定义的Minimum 和Maximum、List values 、uppervalues、lowervalues&lt;br /&gt;&lt;br /&gt;%RULES%&lt;br /&gt;在Rules特性窗口Expression选项卡中定义的有效性规则表达式&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-weight: bold"&gt;六、标识符&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 标识符是实体中一个或多个属性的集合，可用来唯一标识实体中的一个实例。要强调的是，CDM中的标识符等价于PDM中的主键或候选键。每个实体都必须至少有一个标识符。如果实体只有一个标识符，则它为实体的主标识符。如果实体有多个标识符，则其中一个被指定为主标识符，其余的标识符就是次标识符了。&lt;br /&gt;&lt;br /&gt;1、定义主、次标识符&lt;br /&gt;1）选择某个实体双击弹出实体的属性对话框。在Identifiers选项卡上可以进行实体标识符的定义。如下图所示&lt;br /&gt;&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_11.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;2）选择第一行&amp;#8220;主标识符&amp;#8221;，点击属性按钮或双击第一行&amp;#8220;主标识符&amp;#8221;，弹出属性对话框，如图所示&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_12.jpg" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;p&gt;&lt;span style="font-size: 10pt"&gt;3）选择"Attributes"选项卡，再点击&amp;#8220;Add Attributes&amp;#8221;工具，弹出如图所示窗口，选择某个属性作为标识符就行了。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_13.jpg" /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;span style="font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;&lt;span style="font-size: 10pt"&gt;&lt;span style="font-weight: bold"&gt;七、数据项&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;数据项（Data Item）是信息存储的最小单位，它可以附加在实体上作为实体的属性。&lt;br /&gt;注意：模型中允许存在没有附加至任何实体上的数据项。&lt;br /&gt;&lt;br /&gt;1、新建数据项&lt;br /&gt;1）使用&amp;#8220;Model&amp;#8221;---&amp;gt; Data Items 菜单，在打开的窗口中显示已有的数据项的列表，点击 &amp;#8220;Add a Row&amp;#8221;按钮，创建一个新数据项，如图所示&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_14.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;2）当然您可以继续设置具体数据项的Code、DataType、Length等等信息。这里就不再详细说明了。&lt;br /&gt;&lt;br /&gt;2、数据项的唯一性代码选项和重用选项&lt;br /&gt;使用Tools---&amp;gt;Model Options-&amp;gt;Model Settings。在Data Item组框中定义数据项的唯一性代码选项(Unique Code)与重用选项（Allow Reuse）。&lt;br /&gt;注意：&lt;br /&gt;如果选择Unique Code复选框 ，每个数据项在同一个命名空间有唯一的代码，而选择Allow reuse ，一个数据项可以充当多个实体的属性。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_15.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;3、在实体中添加数据项&lt;br /&gt;1）双击一个实体符号，打开该实体的属性窗口。&lt;br /&gt;2）单击Attributes选项卡，打开如下图所示窗口&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_16.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;注意：&lt;br /&gt;Add a DataItem 与 Reuse a DataItem的区别在于&lt;br /&gt;Add a DataItem 情况下，选择一个已经存在的数据项，系统会自动复制所选择的数据项。如果您设置了UniqueCode选项，那系统在复制过程中，新数据项的Code会自动生成一个唯一的号码，否则与所选择的数据项完全一致。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Reuse a DataItem情况下，只引用不新增，就是引用那些已经存在的数据项，作为新实体的数据项。&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;strong&gt;八、 联系&lt;br /&gt;&lt;br /&gt;&lt;/strong&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 联系（Relationship）是指实体集这间或实体集内部实例之间的连接。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 实体之间可以通过联系来相互关联。与实体和实体集对应，联系也可以分为联系和联系集，联系集是实体集之间的联系，联系是实体之间的联系，联系是具有方向性的。联系和联系集在含义明确的情况之下均可称为联系。&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 按照实体类型中实例之间的数量对应关系，通常可将联系分为4类，即一对一（ONE&amp;nbsp;TO ONE）联系、一对多（ONE TO MANY）联系、多对一（MANY TO ONE）联系和多对多联系（MANY TO MANY）。 &lt;p&gt;&lt;strong&gt;1、&amp;nbsp;建立联系&lt;/strong&gt;&lt;br /&gt;在CDM工具选项板中除了公共的工具外，还包括如下图所示的其它对象产生工具。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_17.jpg" /&gt;&lt;br /&gt;&amp;nbsp;在图形窗口中创建两个实体后，单击&amp;#8220;实体间建立联系&amp;#8221;工具，单击一个实体，在按下鼠标左键的同时把光标拖至别一个实体上并释放鼠标左键，这样就在两个实体间创建了联系，右键单击图形窗口，释放Relationship工具。如下图所示&lt;/p&gt;&lt;div style="text-align: left"&gt;&lt;img border="0" src="http://blogimg.chinaunix.net/blog/upfile2/080507085116.jpg" onload="javascript:if(this.width&gt;500)this.width=500;"&gt;&lt;/div&gt;&lt;img alt="" src="http://www.cnblogs.com/hayden/admin/file:///C:/DOCUME~1/wanglin/LOCALS~1/Temp/moz-screenshot-3.jpg" /&gt;&lt;span style="font-family: 'Times New Roman'; font-size: 10.5pt" lang="EN-US"&gt;&lt;V:SHAPETYPE id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"&gt; &lt;V:STROKE joinstyle="miter"&gt;&lt;/V:STROKE&gt;&lt;V:FORMULAS&gt;&lt;V:F eqn="if lineDrawn pixelLineWidth 0"&gt;&lt;/V:F&gt;&lt;V:F eqn="sum @0 1 0"&gt;&lt;/V:F&gt;&lt;V:F eqn="sum 0 0 @1"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @2 1 2"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @3 21600 pixelWidth"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @3 21600 pixelHeight"&gt;&lt;/V:F&gt;&lt;V:F eqn="sum @0 0 1"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @6 1 2"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @7 21600 pixelWidth"&gt;&lt;/V:F&gt;&lt;V:F eqn="sum @8 21600 0"&gt;&lt;/V:F&gt;&lt;V:F eqn="prod @7 21600 pixelHeight"&gt;&lt;/V:F&gt;&lt;V:F eqn="sum @10 21600 0"&gt;&lt;/V:F&gt;&lt;/V:FORMULAS&gt;&lt;V:PATH o:connecttype="rect" gradientshapeok="t" o:extrusionok="f"&gt;&lt;/V:PATH&gt;&lt;O:LOCK aspectratio="t" v:ext="edit"&gt;&lt;/O:LOCK&gt;&lt;/V:SHAPETYPE&gt;&lt;V:SHAPE style="width: 274.5pt; height: 67.5pt" id="_x0000_i1025" type="#_x0000_t75"&gt;&lt;V:IMAGEDATA o:title="1" src="file:///C:\DOCUME~1\wanglin\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg"&gt;&lt;/V:IMAGEDATA&gt;&lt;/V:SHAPE&gt;&amp;lt;!--[if !vml]--&amp;gt;&amp;lt;!--[endif]--&amp;gt;&lt;/span&gt;&lt;font face="宋体"&gt; &lt;/font&gt;&lt;p&gt;&lt;font face="宋体"&gt;&lt;img alt="" src="http://www.cnblogs.com/hayden/admin/file:///C:/DOCUME~1/wanglin/LOCALS~1/Temp/moz-screenshot-1.jpg" /&gt;&lt;img alt="" src="http://www.cnblogs.com/hayden/admin/file:///C:/DOCUME~1/wanglin/LOCALS~1/Temp/moz-screenshot-2.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;font face="宋体"&gt;&lt;img alt="" src="http://www.cnblogs.com/hayden/admin/file:///C:/DOCUME~1/wanglin/LOCALS~1/Temp/moz-screenshot.jpg" /&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;在两个实体间建立了联系后，双击联系线，打开联系特性窗口，如图所示。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_22.jpg" width="522" height="490" /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2、&amp;nbsp;四种基本的联系&lt;br /&gt;&lt;/strong&gt;即一对一（ONE&amp;nbsp;TO ONE）联系、一对多（ONE TO MANY）联系、多对一（MANY TO ONE）联系和多对多联系（MANY TO MANY）。如图所示&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_19.jpg" /&gt;&lt;br /&gt;&lt;strong&gt;3、&amp;nbsp;其他几类特殊联系&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;除了4种基本的联系之外，实体集与实体集之间还存在标定联系（Identify Relationship）、非标定联系（Non-Identify RelationShip）和递归联系（Recursive Relationship）。&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;标定联系：&lt;/strong&gt;&lt;br /&gt;&lt;/em&gt;每个实体类型都有自己的标识符，如果两个实体集之间发生联系，其中一个实体类型的标识符进入另一个实体类型并与该实体类型中的标识符共同组成其标识符时，这种联系则称为标定联系，也叫依赖联系。反之称为非标定联系，也叫非依赖联系。&lt;br /&gt;&lt;span style="color: rgb(255,0,0)"&gt;&amp;nbsp;注意：&lt;br /&gt;在非标定联系中，一个实体集中的部分实例依赖于另一个实例集中的实例，在这种依赖联系中，每个实体必须至少有一个标识符。而在标定联系中，一个实体集中的全部实例完全依赖于另个实体集中的实例，在这种依赖联系中一个实体必须至少有一个标识符，而另一个实体却可以没有自己的标识符。没有标识符的实体用它所依赖的实体的标识符作为自己的标识符。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;换句话来理解，在标定联系中，一个实体（选课）依赖 一个实体（学生），那么（学生）实体必须至少有一个标识符，而（选课）实体可以没有自己的标识符，没有标标识符的实体可以用实体（学生）的标识符作为自己的标识符。&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_20.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;&amp;nbsp;递归联系：&lt;/strong&gt;&lt;br /&gt;&lt;/em&gt;递归联系是实体集内部实例之间的一种联系，通常形象地称为自反联系。同一实体类型中不同实体集之间的联系也称为递归联系。&lt;br /&gt;&lt;br /&gt;例如：在&amp;#8220;职工&amp;#8221;实体集中存在很多的职工，这些职工之间必须存在一种领导与被领导的关系。又如&amp;#8220;学生&amp;#8221;实体信中的实体包含&amp;#8220;班长&amp;#8221;子实体集与&amp;#8220;普通学生&amp;#8221;子实体集，这两个子实体集之间的联系就是一种递归联系。创建递归联系时，只需要单击&amp;#8220;实体间建立联系&amp;#8221;工具从实体的一部分拖至该实体的别一个部分即可。如图&lt;br /&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/yxonline/PD_21.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;3、&lt;/strong&gt;&lt;strong&gt; 定义联系的特性&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;双击关系（Relationship）的符号，进入关系的属性页，在Detail项目中，我们可以对两个实体的关系进行详细的定义，如下图：&lt;/p&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;ol&gt;&lt;li&gt;General 项目 &lt;p&gt;一般最好为关系取一个贴切的名字，本例的业务关系描述如下：一个部门有多个员工，我们使用&amp;#8220;Has&amp;#8221;作为这个关系的名字。&lt;/p&gt;&lt;p&gt;同样的我们也可以描述为：多个员工属于一个部门，可不可以使用&amp;#8220;Belong to&amp;#8221;作为关系名字呢？一般不推荐这样做，在概念图中有一个约定，关系的名字采用从&amp;#8220;1,n&amp;#8221;中&amp;#8220;1&amp;#8221;所在的方向向&amp;#8220;n&amp;#8221;所在一方进行读取的语义。本例即 &amp;#8220;1&amp;#8221;在部门一方，从部门一方向雇员一方读取语义，即：部门有（Has）多个员工。&lt;/p&gt;&lt;/li&gt;&lt;li&gt;Detail 项目 &lt;/li&gt;&lt;/ol&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;假定对于实体部门（Department）和雇员（Employee），具有如下关系：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;一个部门可以有多个雇员，新成立的部门也可以暂时没有任何雇员； &lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;一个雇员必须属于一个部门，并且同时只能属于一个部门； &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;根据以上关系，我们修改属性页，部门－雇员的方向采用默认的0,n，雇员－部门的方向修改为强制约束（Mandatory），或者从下拉框中选择&amp;#8220;1,1&amp;#8221;，如下图：&lt;/p&gt;&lt;/blockquote&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;最后定义完成的关系（Relationship）在概念图中表示如下：&lt;/p&gt;&lt;div style="margin-left: 40px"&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;注：在Power Designer中，关系符号靠近实体端的一个&amp;#8220;横线&amp;#8221;代表强制性约束，&amp;#8220;空心圆圈&amp;#8221;代表无强制约束，即这一方可以无对象关联；&amp;#8220;非分岔&amp;#8221;线代表为&amp;#8220;1&amp;#8221; 的关系，&amp;#8220;分岔&amp;#8221;线代表&amp;#8220;多&amp;#8221;的关系。以上四个符号共可以组合出16种关系（包含反向）。其中&amp;#8220;多对多&amp;#8221;的关系一般通过给出一个中间实体来进行分解，所以在许多概念图中，是看不到实际的&amp;#8220;多对多&amp;#8221;的关系存在的。&lt;/p&gt;&lt;p&gt;另外在关系的属性中还有两项：Dominant role 和Dependent，可以表示更复杂的关系，会在后面讲到。&lt;/p&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;使用依赖关系(Dependent)&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还是使用上面的例子，我们假定这样的业务描述：雇员享有假期，雇员每次休假，需要记录雇员休假的起始日与结束日，假期以天为单位，一个雇员和一个开始日唯一确定一个假期。根据这个业务描述，我们知道，对于假期而言，其必须依存于实体&amp;#8220;Employee&amp;#8221;而存在，即一个休假，必定有一个主体雇员。我们在上一个模型的基础之上，添加一个实体，名称是&amp;#8220;Holiday&amp;#8221;，定义假期的属性开始日与结束日，这里并不需要重复定义一个雇员编号，而是替代的，使用依赖关系，来表示实体&amp;#8220;Holiday&amp;#8221;依赖于实体&amp;#8220;Employee&amp;#8221;，关系定义如下图：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;　&lt;/p&gt;&lt;div class="tmpDiv"&gt;在实体&amp;#8220;Holiday&amp;#8221;中，我们需要设置开始日为主键标识符，开始日与其依赖实体中的雇员编号一起作为实体&amp;#8220;Holiday&amp;#8221;的标识符，用来唯一确定一个假期。这种依赖关系在概念图中表现如下：&lt;/div&gt;&lt;/blockquote&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;　&lt;/p&gt;&lt;div class="tmpDiv"&gt;从途中可以看出，在实体&amp;#8220;Holiday&amp;#8221;一端多了一个朝外的三角&amp;#9650;箭头，这个含义就是这个实体&amp;#8220;的依赖于三角箭头所指的另外一个实体，在转化出来的物理模型当中，实体&amp;#8220;Employee&amp;#8221;的empNo，在Holiday实体中不仅会作为一个外键，还同时会作为主键出现（与startData一起作为复合主键）。&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;使用Dominant role&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当两个实体之间的关系是1..1 时（尽管这种关系比较少见，常见于面向对象的设计方法当中，依赖实体中的主键通常与外健重合），你需要明确指定这两个实体，哪一个是父实体，哪一个是依赖实体，否则，系统在由概念模型转化为物理模型时，将不能确定需要在哪一端生成外键，这时就需要用到&amp;#8220;Dominant role&amp;#8221;选项，这个选项只有在1..1 的关系中才允许进行设置。我们假定这样的业务描述，企业中的部分雇员拥有一个系统帐号，并且是唯一的一个帐号，这些雇员需要保存一些额外的信息，比如帐号名称、密码等等。我们添加了一个新的实体&amp;#8220;User&amp;#8221;，其与雇员之间为1..1 的关系，由于一个用户帐号必定属于一个雇员，而一个雇员则可能没有用户帐号，所以我们定义实体&amp;#8220;Employee&amp;#8221;支配实体&amp;#8220;User&amp;#8221;。同时，由于 &amp;#8220;User&amp;#8221;依赖于&amp;#8220;Employee&amp;#8221;而存在，所以再定义一个由前者到后者的依赖关系，如下图：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;　&lt;/p&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;Dominant role 选项中，箭头所指的实体为被支配的实体，即作为依赖实体。在模型图中，支配实体的一方会出现一个用圆括号括起来的大写字母&amp;#8220;D&amp;#8221;。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;p&gt;　&lt;/p&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;转化出来的物理模型中，表User中，empNo作为单独的主键，同时也是引用Employee表的一个外键。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font size="2"&gt;处理多对多(n..n)的关系&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在概念模型中，一般很少看见两个实体之间是直接的n..n 的关系，一般这种情况下我们会增加一个中间实体，在Power Designer中，提供了一个专门的符号来对应，叫做&amp;#8220;Association&amp;#8221;。请考虑以下的情形：&lt;/p&gt;&lt;p&gt;企业中拥有帐号的雇员在系统中具有不同的操作权限，这通过用户角色来进行管理，权限已经分配给了多个不同的角色，一个用户帐号至少属于一个角色，并且可能会同时属于多个角色，一个角色可以包含0个或多个用户帐号。根据以上描述，我们添加一个实体&amp;#8220;Role&amp;#8221;，它与实体&amp;#8220;User&amp;#8221;之间是n..n 的关系，为了表达这种关系，我们增加一个&amp;#8220;Association&amp;#8221;并分别使用&amp;#8220;Association Link&amp;#8221;与其他两个实体建立关系，表示如下：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;div forimg="1"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="tmpDiv"&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;p&gt;使用一个普通的实体，合理定义关系，并选择&amp;#8220;Dependent&amp;#8221;选项，是可以替代&amp;#8220;Association&amp;#8221;的，但使用 &amp;#8220;Association&amp;#8221;更方便、直观，使模型更容易理解，并可以减少因不谨慎而可能导致的错误。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2498164.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/05/13/2498164.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/05/11/2495359.html</id><title type="text">JavaScript闭包和模块模式[译]</title><summary type="text">翻译原文 在JavaScript中一个最广泛使用的设计模式是模块的模式。模块模式使用了JavaScript中的一个很棒的特性-闭包- 用来给你方法中的隐私一些控制这样的第三方应用程序不能访问私有数据或覆盖它。在这篇文章中，我会教你什么是闭包，它是如何工作的，以及如何利用它在你的JavaScript代码中实现模块模式。什么是闭包？闭包是JavaScript语言的一种构造。在JavaScript内所有变量都能在全局范围内访问，除非变量在函数内用var关键字声明过。variable1 = 1; //全局范围var variable2 = 2; // 不在一个函数内: 全局范围function fu.</summary><published>2012-05-11T00:46:00Z</published><updated>2012-05-11T00:46:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/11/2495359.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/11/2495359.html"/><content type="html">&lt;span class="sep"&gt;翻译&lt;/span&gt;&lt;a title="4:00 am" href="http://www.joezimjs.com/javascript/javascript-closures-and-the-module-pattern/" rel="bookmark"&gt;&lt;time class="entry-date" datetime="2012-04-30T04:00:22+00:00" pubdate=""&gt;原文&lt;/time&gt;&lt;/a&gt; &lt;br /&gt;&lt;img class="alignleft size-full wp-image-830" title="JavaScript Closures and the Module Pattern" alt="JavaScript Closures and the Module Pattern" src="http://www.joezimjs.com/wp-content/uploads/2012_04_30.png" width="150" height="150" /&gt;&amp;nbsp; &lt;span id="result_box" lang="zh-CN"&gt;在JavaScript中一个最广泛使用的设计模式是模块的模式。模块模式使用了&lt;span&gt;JavaScript中的一个很棒的特性&lt;/span&gt;-闭包- 用来给你方法中的隐私一些控制这样的第三方应用程序不能访问&lt;span&gt;私有数据&lt;/span&gt;&lt;span&gt;或&lt;/span&gt;&lt;span&gt;覆盖它&lt;/span&gt;。在这篇文章中，我会教你什么&lt;span&gt;是&lt;/span&gt;&lt;span&gt;闭包&lt;/span&gt;，它是如何工作的，以及如何利用&lt;span&gt;它在你&lt;/span&gt;&lt;span&gt;的JavaScript代码中实现&lt;/span&gt;&lt;span&gt;&lt;/span&gt;模块&lt;span&gt;模式&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;span id="more-826"&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;什么是闭包？&lt;/strong&gt;&lt;/p&gt;闭包是JavaScript语言的一种构造。在JavaScript内所有变量都能在全局范围内访问，除非变量在函数内用var关键字声明过。&lt;br /&gt;&lt;script src="https://gist.github.com/2645022.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645022" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="nx"&gt;&lt;font color="#111111"&gt;variable1&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;//全局范围&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;variable2&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;// 不在一个函数内: 全局范围&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;funcName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/font&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;&lt;font color="#111111"&gt;variable3&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;// 没用var关键字声明: 全局范围&lt;/span&gt;&lt;/div&gt;&lt;div id="LC6" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;variable4&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;//仅本地访问&lt;/span&gt;&lt;/div&gt;&lt;div id="LC7" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC8" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC9" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645022/a60d4f53eb1f037a2b759128d835bed5ba5bc81a/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645022#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645022"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;在一个函数内&lt;/span&gt;&lt;span&gt;，你&lt;/span&gt;也可以获得全局范围和每个你所在的函数上级范围的访问权限。换句话说，函数内声明变量只能在函数包围范围内访问。&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645110.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645110" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;globalvar&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;//全局范围&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;outer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/font&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;outervar&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;// outer()范围内&lt;/span&gt;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div id="LC6" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;inner&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/font&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC7" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;innervar&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;;&lt;/font&gt;&lt;/span&gt; &lt;span class="c1"&gt;// inner()范围内&lt;/span&gt;&lt;/div&gt;&lt;div id="LC8" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalvar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 1&lt;/span&gt;&lt;/div&gt;&lt;div id="LC9" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 2&lt;/span&gt;&lt;/div&gt;&lt;div id="LC10" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;innervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 3&lt;/span&gt;&lt;/div&gt;&lt;div id="LC11" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC12" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC13" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalvar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 1&lt;/span&gt;&lt;/div&gt;&lt;div id="LC14" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 2&lt;/span&gt;&lt;/div&gt;&lt;div id="LC15" class="line"&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;innervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; Reference Error引用错误;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC16" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC17" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC18" class="line"&gt;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;globalvar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; 1&lt;/span&gt;&lt;/div&gt;&lt;div id="LC19" class="line"&gt;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;outervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; Reference Error引用错误&lt;/span&gt;&lt;/div&gt;&lt;div id="LC20" class="line"&gt;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;innervar&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// =&amp;gt; Reference Error引用错误&lt;/span&gt;&lt;/div&gt;&lt;div id="LC21" class="line"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645110/a5eb69cae5a27e48c7c05f32d101566baa89fe4d/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645110#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645110"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;每一个真正&lt;/span&gt;的JavaScript程序员应该知道这一点，除非他不思进取。&lt;span&gt;知道这一点，&lt;/span&gt;你可以得出这样的结论，用一种办法来保持你所有代码在全局命名空间外，是正确的。这特别有用，当你不想给任何人在未经许可的情况下有重写你任何代码的机会。&lt;span&gt;你可以通过&lt;/span&gt;&lt;span&gt;使用&lt;/span&gt;&lt;span&gt;一个匿名函数（&lt;/span&gt;不给它命名，没有被赋予一个变量）立即执行自身。这&lt;span&gt;是众所周知的&lt;/span&gt;&lt;span&gt;自&lt;/span&gt;&lt;span&gt;调用&lt;/span&gt;&lt;span&gt;匿名函数&lt;/span&gt;（&lt;span&gt;SIAF&lt;/span&gt;&lt;span&gt;）&lt;/span&gt;，&lt;span&gt;虽然&lt;/span&gt;&lt;span&gt;它可能是&lt;/span&gt;更准确地称为&lt;a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/"&gt;立即调用的函数表达&lt;/a&gt;&lt;/span&gt;&lt;a title="Immediately-Invoked Function Expression (IIFE)" href="http://www.blogger.com/goog_305932750" target="_blank"&gt; (IIFE&amp;#8211;读做&amp;#8220;iffy&amp;#8221;)&lt;/a&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;a href="http://benalman.com/news/2010/11/immediately-invoked-function-expression/" target="_blank"&gt;&lt;span&gt; -作者&lt;/span&gt;&lt;span&gt;Ben&lt;/span&gt; &lt;span class="hps"&gt;Alman&lt;/span&gt;&lt;/a&gt;。&lt;span class="atn"&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645129.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645129" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// 这函数立即执行，内部所有变量都是私有的&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}());&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645129/699ca46ac132dc1a709d4655c2539f877b695568/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645129#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645129"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;紧接着&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;右大括号&lt;/span&gt;，是左右括号于是函数将立即执行。围绕整个函数表达式的&lt;span&gt;括号不是&lt;/span&gt;&lt;span&gt;运行的代码&lt;/span&gt;&lt;span&gt;必需的&lt;/span&gt;&lt;span&gt;，但&lt;/span&gt;一般用作给其他开发人员的信号，这是一个IIFE，而不是一个&lt;span&gt;标准函数&lt;/span&gt;。有些人喜欢在前面加上一个惊叹号（!）或分号（;)，而不是用括号包起来&lt;span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;用闭包的模块模式&lt;/strong&gt;&lt;/p&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;&lt;/span&gt;知道了闭包是什么，我们就可以&lt;span&gt;使用模块&lt;/span&gt;模式创建对象。通过返回一个对象或变量并&lt;span&gt;赋给&lt;/span&gt;&lt;span&gt;一个&lt;/span&gt;&lt;span&gt;函数外&lt;/span&gt;&lt;span&gt;&lt;/span&gt;变量&lt;span&gt;，这样我们&lt;/span&gt;&lt;span&gt;可以&lt;/span&gt;暴露任何希望暴露给外界的，我们可以有&lt;span&gt;公开和私有&lt;/span&gt;的方法&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645186.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645186" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;Module&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// 下面函数是私有的，但可以被公开函数访问&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;privateFunc&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;/font&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt; &lt;span class="err"&gt;&amp;#8230;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// 返回一个对象赋予Module&lt;/span&gt;&lt;/div&gt;&lt;div id="LC6" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC7" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc&lt;/font&gt;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC8" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;privateFunc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/font&gt; &lt;span class="c1"&gt;// publicFunc可以直接访问privateFunc&lt;/span&gt;&lt;/div&gt;&lt;div id="LC9" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC10" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC11" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}());&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC12" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645186/1698df495e052644158dc4365a26eb77b174f948/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645186#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645186"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN" class="short_text"&gt;&lt;span&gt;这就是&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;模块模式的本质&lt;/span&gt;。&lt;span&gt;您还可以使用&lt;/span&gt;&lt;span&gt;参数&lt;/span&gt;&lt;span&gt;传入&lt;/span&gt;&lt;span&gt;或&lt;/span&gt;&lt;span&gt;缩写常用&lt;/span&gt;资源&lt;span&gt;的&lt;/span&gt;&lt;span&gt;名称&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645210.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645210" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;Module&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;font color="#111111"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/font&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/font&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;)&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// &amp;#8230;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// return {&amp;#8230;};&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&lt;font color="#111111"&gt;&lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/font&gt; &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;));&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645210/4f0e191b07d3370d033e322bb123520d316f606a/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645210#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645210"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;我传入&lt;/span&gt;&lt;span&gt;jQuery和&lt;/span&gt;window，被分别缩写为$和w。注意我没有传任何东西作为第三个参数。这样参数undefined&lt;span&gt;&lt;/span&gt;&lt;span&gt;将&lt;/span&gt;&lt;span&gt;是undefined&lt;/span&gt;，所以它完美地工作。有些人这样处理undefined是因为无论如何，它&lt;span&gt;是可编辑的&lt;/span&gt;。所以，如果你判断某某是否&lt;span&gt;是&lt;/span&gt;undefined，但undefined可能已经改变，你的&lt;span&gt;比较&lt;/span&gt;&lt;span&gt;将不起作用。&lt;/span&gt;&lt;span&gt;这种技术&lt;/span&gt;保证&lt;span&gt;它将&lt;/span&gt;&lt;span&gt;按预期工作&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;透露模块模式revealing module pattern&lt;/strong&gt;&lt;/p&gt;&lt;span id="result_box" lang="zh-CN"&gt;透露模块模式是&lt;span&gt;另一种方式来&lt;/span&gt;&lt;span&gt;写&lt;/span&gt;&lt;span&gt;模块&lt;/span&gt;&lt;span&gt;&lt;/span&gt;模式，需要更多点代码&lt;span&gt;，但有时&lt;/span&gt;更容易理解和阅读。不同于在IIFE中定义所有私有变量并在&lt;span&gt;返回对象中定义&lt;/span&gt;&lt;span&gt;公开方法&lt;/span&gt;&lt;span&gt;&lt;/span&gt;，你把所有方法都写在IIFE中，只是&amp;#8220;透露&lt;span class="atn"&gt;&amp;#8221;&lt;/span&gt;哪些是你想公开在&lt;span&gt;return语句&lt;/span&gt;内的&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645236.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645236" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;Module&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// 现在所有函数直接互访&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;privateFunc&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;publicFunc1&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC6" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC7" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc1&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC8" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;publicFunc2&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC9" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC10" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC11" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc2&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC12" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;privateFunc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC13" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC14" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC15" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="c1"&gt;// 返回对象赋予Module&lt;/span&gt;&lt;/div&gt;&lt;div id="LC16" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC17" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc1&lt;/font&gt;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;publicFunc1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC18" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc2&lt;/font&gt;&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;publicFunc2&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC19" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;};&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC20" class="line"&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}());&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC21" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645236/90e29da921fa851fea8823e74f69eec02aef9d93/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645236#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645236"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN" class="short_text"&gt;&lt;span&gt;对比&lt;/span&gt;&lt;span&gt;正常&lt;/span&gt;&lt;span&gt;的&lt;/span&gt;&lt;span&gt;模块&lt;/span&gt;模式，&lt;span&gt;透露&lt;/span&gt;模块&lt;span&gt;模式&lt;/span&gt;有&lt;span&gt;几个优点&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span id="result_box" lang="zh-CN" class="short_text"&gt;&lt;span&gt;&lt;/span&gt;所有函数的声明和实现都&lt;span&gt;&lt;/span&gt;&lt;span&gt;在同一个地方&lt;/span&gt;，从而&lt;span&gt;制造&lt;/span&gt;较少的混乱&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" lang="zh-CN" class="short_text"&gt;&lt;span&gt;私有函数现在可以访问公开函数&lt;/span&gt;，如果他们需要。&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;当一个公开函数&lt;/span&gt;需要调用另一个公开函数时，他们调用publicFunc2()，而不是用&lt;span&gt;this.publicFunc2()&lt;/span&gt;，从而节省了几个字符&lt;/span&gt;。&lt;/li&gt;&lt;/ol&gt;&lt;span id="result_box" lang="zh-CN"&gt;透露模块模式的&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;唯一真正的&lt;/span&gt;缺点&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;，正如我所说，是你必须写更多的代码，因为你必须先写好&lt;span&gt;函数然后再把&lt;/span&gt;&lt;span&gt;它的名字&lt;/span&gt;写在return语句内，尽管它最终可能会因为你可以忽略this.&lt;span&gt;部分&lt;/span&gt;&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;而节省你的代码&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;扩展模块模式&lt;/strong&gt;&lt;/p&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;我想&lt;/span&gt;&lt;span&gt;谈&lt;/span&gt;的最后一件事是使用模块模式扩展已经存在的模块。这很常用，当为&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;jQuery之类的&lt;/span&gt;&lt;span id="result_box" lang="zh-CN"&gt;库做&lt;span&gt;插件&lt;/span&gt;&lt;span&gt;，如下&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;script src="https://gist.github.com/2645266.js?file=gistfile1.js"&gt;&lt;/script&gt;&lt;div id="gist-2645266" class="gist"&gt;&lt;div class="gist-file"&gt;&lt;div class="gist-data gist-syntax"&gt;&lt;div class="gist-highlight"&gt;&lt;div id="LC1" class="line"&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;&lt;font color="#111111"&gt;jQuery&lt;/font&gt;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;(&lt;/font&gt;&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt;&lt;font color="#111111"&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;/font&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC2" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#111111"&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;pluginFunc&lt;/span&gt;&lt;/font&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;&lt;font color="#111111"&gt;()&lt;/font&gt;&lt;/span&gt; &lt;span class="p"&gt;&lt;font color="#111111"&gt;{&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC3" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="err"&gt;&amp;#8230;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC4" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="p"&gt;&lt;font color="#111111"&gt;}&lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;div id="LC5" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;div id="LC6" class="line"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span class="k"&gt;return&lt;/span&gt; &lt;font color="#111111"&gt;&lt;span class="nx"&gt;$&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;/font&gt;    &lt;/div&gt;&lt;div id="LC7" class="line"&gt;&lt;font color="#111111"&gt;&lt;span class="p"&gt;}(&lt;/span&gt;&lt;span class="nx"&gt;jQuery&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;&lt;div id="LC8" class="line"&gt;&lt;font color="#111111"&gt;&lt;br /&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="gist-meta"&gt;&lt;a style="float: right" href="https://gist.github.com/raw/2645266/3869b8a5ed20029ab71a1eb6c7c42d4a53fe54fd/gistfile1.js"&gt;view raw&lt;/a&gt; &lt;a style="float: right; color: #666; margin-right: 10px" href="https://gist.github.com/2645266#file_gistfile1.js"&gt;gistfile1.js&lt;/a&gt; &lt;a href="https://gist.github.com/2645266"&gt;This Gist&lt;/a&gt; brought to you by &lt;a href="http://github.com/"&gt;GitHub&lt;/a&gt;. &lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;此代码是&lt;/span&gt;&lt;span&gt;相当灵活&lt;/span&gt;的，因为你甚至不需要var jQuery=或&lt;span class="hps"&gt;接近尾部的return语句&lt;/span&gt;。没有它们&lt;span class="hps"&gt;jQuery&lt;/span&gt;&lt;span&gt;仍将可以用这个新方法扩展&lt;/span&gt;。实际上返回和赋值整个jQuery对象，&lt;span&gt;可能&lt;/span&gt;在性能上有损失，但是，如果你想&lt;span&gt;在扩展jQuery的同时&lt;/span&gt;&lt;span&gt;&lt;/span&gt;，分配jQuery到一个新的变量名，你&lt;span&gt;只需&lt;/span&gt;&lt;span&gt;改变&lt;/span&gt;第一行的jQuery为&lt;span&gt;任何你想要的&lt;/span&gt;&lt;span&gt;。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;&lt;/p&gt;&lt;span id="result_box" lang="zh-CN"&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;朋友们，今天就到这里。这些都是常见的技术和功能，即使你不使用这篇文章的知识，&lt;span&gt;保留&lt;/span&gt;&lt;span&gt;在&lt;/span&gt;&lt;span&gt;你的脑海&lt;/span&gt;&lt;span&gt;，以防万一&lt;/span&gt;用到（很可能会发生）。。。最后，不要&lt;span&gt;忘记&lt;/span&gt;&lt;span&gt;分享和在下面&lt;/span&gt;&lt;span&gt;评论&lt;/span&gt;。&lt;span&gt;感谢和&lt;/span&gt;&lt;span&gt;编码快乐！&lt;/span&gt;&lt;/span&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2495359.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/05/11/2495359.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/05/09/2491281.html</id><title type="text">jQuery获取Select选择的Text和 Value(转)</title><summary type="text">jQuery获取Select选择的Text和Value:语法解释：1. $("#select_id").change(function(){//code...}); //为Select添加事件，当选择其中一项时触发2. var checkText=$("#select_id").find("option:selected").text(); //获取Select选择的Text3. var checkValue=$("#select_id").val(); //获取Select选择的Value4. var check</summary><published>2012-05-09T02:15:00Z</published><updated>2012-05-09T02:15:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/09/2491281.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/05/09/2491281.html"/><content type="html">jQuery获取Select选择的Text和Value:&lt;br /&gt;语法解释：&lt;br /&gt;1. $("#select_id").change(function(){//code...});&amp;nbsp;&amp;nbsp; //为Select添加事件，当选择其中一项时触发&lt;br /&gt;2. var checkText=$("#select_id").find("option:selected").text();&amp;nbsp; //获取Select选择的Text&lt;br /&gt;3. var checkValue=$("#select_id").val();&amp;nbsp; //获取Select选择的Value&lt;br /&gt;4. var checkIndex=$("#select_id ").get(0).selectedIndex;&amp;nbsp; //获取Select选择的索引值&lt;br /&gt;5. var maxIndex=$("#select_id option:last").attr("index");&amp;nbsp; //获取Select最大的索引值&lt;br /&gt;jQuery设置Select选择的 Text和Value:&lt;br /&gt;语法解释：&lt;br /&gt;1. $("#select_id ").get(0).selectedIndex=1;&amp;nbsp; //设置Select索引值为1的项选中&lt;br /&gt;2. $("#select_id ").val(4);&amp;nbsp;&amp;nbsp; // 设置Select的Value值为4的项选中&lt;br /&gt;3. $("#select_id option[text='jQuery']").attr("selected", true);&amp;nbsp;&amp;nbsp; //设置Select的Text值为jQuery的项选中 &lt;p&gt;jQuery添加/删除Select的Option项：&lt;br /&gt;语法解释：&lt;br /&gt;1. $("#select_id").append("&amp;lt;option value='Value'&amp;gt;Text&amp;lt;/option&amp;gt;");&amp;nbsp; //为Select追加一个Option(下拉项)&lt;br /&gt;2. $("#select_id").prepend("&amp;lt;option value='0'&amp;gt;请选择&amp;lt;/option&amp;gt;");&amp;nbsp; //为Select插入一个Option(第一个位置)&lt;br /&gt;3. $("#select_id option:last").remove();&amp;nbsp; //删除Select中索引值最大Option(最后一个)&lt;br /&gt;4. $("#select_id option[index='0']").remove();&amp;nbsp; //删除Select中索引值为0的Option(第一个)&lt;br /&gt;5. $("#select_id option[value='3']").remove();&amp;nbsp; //删除Select中Value='3'的Option&lt;br /&gt;5. $("#select_id option[text='4']").remove();&amp;nbsp; //删除Select中Text='4'的Option &lt;p&gt;http://www.cnblogs.com/SAL2928/archive/2008/10/28/1321285.html &lt;p&gt;jquery radio取值，checkbox取值，select取值，radio选中，checkbox选中，select选中，及其相关 &lt;br /&gt;获 取一组radio被选中项的值 &lt;br /&gt;var item = $('input[name=items][checked]').val(); &lt;br /&gt;获 取select被选中项的文本 &lt;br /&gt;var item = $("select[name=items] option[selected]").text(); &lt;br /&gt;select下拉框的第二个元素为当前选中值 &lt;br /&gt;$('#select_id')[0].selectedIndex = 1; &lt;br /&gt;radio单选组的第二个元素为当前选中值 &lt;br /&gt;$('input[name=items]').get(1).checked = true; &lt;br /&gt;获取值： &lt;br /&gt;文本框，文本区域：$("#txt").attr("value")； &lt;br /&gt;多选框 checkbox：$("#checkbox_id").attr("value")； &lt;br /&gt;单选组radio：&amp;nbsp;&amp;nbsp; $("input[type=radio][checked]").val(); &lt;br /&gt;下拉框select： $('#sel').val(); &lt;br /&gt;控制表单元素： &lt;br /&gt;文本框，文本区域：$("#txt").attr("value",'');//清空内容 &lt;br /&gt;$("#txt").attr("value",'11');//填充内容 &lt;br /&gt;多选框checkbox： $("#chk1").attr("checked",'');//不打勾 &lt;br /&gt;$("#chk2").attr("checked",true);//打勾 &lt;br /&gt;if($("#chk1").attr('checked')==undefined) //判断是否已经打勾 &lt;br /&gt;单选组 radio：&amp;nbsp;&amp;nbsp;&amp;nbsp; $("input[type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项 &lt;br /&gt;下拉框 select：&amp;nbsp;&amp;nbsp; $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项 &lt;br /&gt;$("&amp;lt;option value='1'&amp;gt;1111&amp;lt;/option&amp;gt;&amp;lt;option value='2'&amp;gt;2222&amp;lt;/option&amp;gt;").appendTo("#sel")//添加下拉框的option &lt;br /&gt;$("#sel").empty()；//清空下拉框 &lt;p&gt;---------------------------------------------------------------------------------------------------- &lt;p&gt;//遍历option和添加、移除option&lt;br /&gt;function changeShipMethod(shipping){&lt;br /&gt;var len = $("select[name=ISHIPTYPE] option").length&lt;br /&gt;if(shipping.value != "CA"){&lt;br /&gt;$("select[name=ISHIPTYPE] option").each(function(){&lt;br /&gt;if($(this).val() == 111){&lt;br /&gt;$(this).remove();&lt;br /&gt;}&lt;br /&gt;});&lt;br /&gt;}else{&lt;br /&gt;$("&amp;lt;option value='111'&amp;gt;UPS Ground&amp;lt;/option&amp;gt;").appendTo($("select[name=ISHIPTYPE]"));&lt;br /&gt;}&lt;br /&gt;} &lt;p&gt;//取得下拉選單的選取值 &lt;p&gt;$(#testSelect option:selected').text();&lt;br /&gt;或$("#testSelect").find('option:selected').text();&lt;br /&gt;或$("#testSelect").val();&lt;br /&gt;//////////////////////////////////////////////////////////////////&lt;br /&gt;记 性不好的可以收藏下：&lt;br /&gt;1,下拉框: &lt;p&gt;var cc1 = $(".formc select[name='country'] option[selected]").text(); //得到下拉菜单的选中项的文本(注意中间有空格)&lt;br /&gt;var cc2 = $('.formc select[name="country"]').val(); //得到下拉菜单的选中项的值&lt;br /&gt;var cc3 = $('.formc select[name="country"]').attr("id"); //得到下拉菜单的选中项的ID属性值&lt;br /&gt;$("#select").empty();//清空下拉框 //$("#select").html('');&lt;br /&gt;$("&amp;lt;option value='1'&amp;gt;1111&amp;lt;/option&amp;gt;").appendTo("#select")//添加下拉框的option &lt;p&gt;稍微解释一下:&lt;br /&gt;1.select[name='country'] option[selected] 表示具有name 属性，&lt;br /&gt;并 且该属性值为'country' 的select元素 里面的具有selected 属性的option 元素； &lt;p&gt;2,单选框:&lt;br /&gt;$("input[@type=radio][@checked]").val(); //得到单选框的 选中项的值(注意中间没有空格)&lt;br /&gt;$("input[@type=radio][@value=2]").attr("checked",'checked'); //设置单选框value=2的为选中状态.(注意中间没有空格) &lt;p&gt;3,复选框:&lt;br /&gt;$("input[@type=checkbox][@checked]").val(); //得到复选框的选中的第一项的值&lt;br /&gt;$("input[@type=checkbox][@checked]").each(function() { //由于复选框一般选中的是多个,所以可以循环输出&lt;br /&gt;alert($(this).val());&lt;br /&gt;}); &lt;p&gt;$("#chk1").attr("checked",'');//不打勾&lt;br /&gt;$("#chk2").attr("checked",true);// 打勾&lt;br /&gt;if($("#chk1").attr('checked')==undefined){} //判断是否已经打勾 &lt;p&gt;当然jquery的选择器是强大的. 还有很多方法. &lt;p&gt;&amp;lt;script src="jquery-1.2.1.js" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&amp;lt;script language="javascript" type="text/javascript"&amp;gt;&lt;br /&gt;$(document).ready(function(){&lt;br /&gt;$("#selectTest").change(function()&lt;br /&gt;{&lt;br /&gt;//alert("Hello");&lt;br /&gt;//alert($("#selectTest").attr("name"));&lt;br /&gt;//$("a").attr("href","xx.html");&lt;br /&gt;//window.location.href="xx.html";&lt;br /&gt;//alert($("#selectTest").val());&lt;br /&gt;alert($("#selectTest option[@selected]").text());&lt;br /&gt;$("#selectTest").attr("value", "2"); &lt;p&gt;});&lt;br /&gt;});&lt;br /&gt;&amp;lt;/script&amp;gt; &lt;p&gt;&amp;lt;a href="#"&amp;gt;aaass&amp;lt;/a&amp;gt; &lt;p&gt;&amp;lt;!--下拉框--&amp;gt;&lt;br /&gt;&amp;lt;select id="selectTest" name="selectTest"&amp;gt;&lt;br /&gt;&amp;lt;option value="1"&amp;gt;11&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option value="2"&amp;gt;22&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option value="3"&amp;gt;33&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option value="4"&amp;gt;44&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option value="5"&amp;gt;55&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;option value="6"&amp;gt;66&amp;lt;/option&amp;gt;&lt;br /&gt;&amp;lt;/select&amp;gt;&lt;br /&gt;jquery radio取值，checkbox取值，select取值，radio选中，checkbox选中，select选中，及其相关获取一组radio被选中 项的值&lt;br /&gt;var item = $('input[@name=items][@checked]').val();&lt;br /&gt;获取select被选 中项的文本&lt;br /&gt;var item = $("select[@name=items] option[@selected]").text();&lt;br /&gt;select 下拉框的第二个元素为当前选中值&lt;br /&gt;$('#select_id')[0].selectedIndex = 1;&lt;br /&gt;radio单选组的第二个 元素为当前选中值&lt;br /&gt;$('input[@name=items]').get(1).checked = true;&lt;br /&gt;获取值：&lt;br /&gt;文本 框，文本区域：$("#txt").attr("value")；&lt;br /&gt;多选框 checkbox：$("#checkbox_id").attr("value")；&lt;br /&gt;单选组radio： $("input[@type=radio][@checked]").val();&lt;br /&gt;下拉框select： $('#sel').val();&lt;br /&gt;控 制表单元素：&lt;br /&gt;文本框，文本区域：$("#txt").attr("value",'');//清空内容&lt;br /&gt;$("#txt").attr("value",'11');// 填充内容&lt;br /&gt;多选框checkbox： $("#chk1").attr("checked",'');//不打勾&lt;br /&gt;$("#chk2").attr("checked",true);// 打勾&lt;br /&gt;if($("#chk1").attr('checked')==undefined) //判断是否已经打勾&lt;br /&gt;单选组radio： $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项&lt;br /&gt;下拉框 select： $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项&lt;br /&gt;$("&amp;lt;optionvalue='1'&amp;amp; gt;1111&amp;lt;/option&amp;gt;&amp;lt;optionvalue='2'&amp;gt;2222&amp;lt;/option&amp;amp; gt;").appendTo("#sel")//添加下拉框的option&lt;br /&gt;$("#sel").empty()；// 清空下拉框 &lt;p&gt;获取一组radio被选中项的值&lt;br /&gt;var item = $('input[@name=items][@checked]').val();&lt;br /&gt;获取select被选中项的文本&lt;br /&gt;var item = $("select[@name=items] option[@selected]").text();&lt;br /&gt;select下拉框的第二个元素为当 前选中值&lt;br /&gt;$('#select_id')[0].selectedIndex = 1;&lt;br /&gt;radio单选组的第二个元素为当前选中值&lt;br /&gt;$('input[@name=items]').get(1).checked = true;&lt;br /&gt;获取值：&lt;br /&gt;文本框，文本区域：$("#txt").attr("value")；&lt;br /&gt;多选框 checkbox：$("#checkbox_id").attr("value")；&lt;br /&gt;单选组radio： $("input[@type=radio][@checked]").val();&lt;br /&gt;下拉框select： $('#sel').val();&lt;br /&gt;控 制表单元素：&lt;br /&gt;文本框，文本区域：$("#txt").attr("value",'');//清空内容&lt;br /&gt;$("#txt").attr("value",'11');// 填充内容&lt;br /&gt;多选框checkbox： $("#chk1").attr("checked",'');//不打勾&lt;br /&gt;$("#chk2").attr("checked",true);// 打勾&lt;br /&gt;if($("#chk1").attr('checked')==undefined) //判断是否已经打勾&lt;br /&gt;单选组radio： $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项&lt;br /&gt;下拉框 select： $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项&lt;br /&gt;$("&amp;lt;option value='1'&amp;gt;1111&amp;lt;/option&amp;gt;&amp;lt;option value='2'&amp;gt;2222&amp;lt;/option&amp;gt;").appendTo("#sel")//添加下拉框的option&lt;br /&gt;$("#sel").empty()；// 清空下拉框 &lt;/p&gt;&lt;div id="MySignature"&gt;理念：网站优化工具之家致力于面向搜索引擎网站建设，SEO优化标准制定及免费搜索优化工具研发，是宁波首个面向搜索引擎网站服务团队网站:seo.al0574.com &lt;/div&gt;&lt;script type="text/javascript"&gt;if ($ != jQuery) {$ = jQuery.noConflict();}var isLogined = true;var cb_blogId = 61104;var cb_entryId = 1806939;var cb_blogApp = "yaoshiyou";var cb_blogUserGuid = "43995076-e5a5-de11-ba8f-001cf0cd104b";var cb_entryCreatedDate = '2010/8/24 9:12:00';&lt;/script&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2491281.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/05/09/2491281.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441831.html</id><title type="text">jquery validate使用总结</title><summary type="text">$(this).rules("add", { required: true, messages: { required: "选择节点时必填!"} });</summary><published>2012-04-11T02:03:00Z</published><updated>2012-04-11T02:03:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441831.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441831.html"/><content type="html">&amp;nbsp; $(this).rules("add", { required: true, messages: { required: "选择节点时必填!"} }); &lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2441831.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441831.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441705.html</id><title type="text">快速上手Expression Tree(一)：做一做装配脑袋的Expression Tree 习题</title><summary type="text">装配脑袋的习题在这里：Expression Tree上手指南 （一）不了解Expression Tree的同学可以去看下，很好，很强大。1: -a2: a + b * 2我把这些问题都弄成了方法，分别是Question1,Question2,….QuestionX第一题：-a因为实在是太短了，我不明白是什么意思，姑且认为是做取反操作吧，也就是假如输入是5，那么输出是-5.如果让你写lambda表达式，估计没几个人写不出来吧:(a)=&gt;{return –a;}当然你可以简短点:(a)=&gt;{-a}OK，看一看lambda表达式:(a)=&gt;{return –a;},可以知道有一个参</summary><published>2012-04-11T00:33:00Z</published><updated>2012-04-11T00:33:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441705.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441705.html"/><content type="html">&lt;p&gt;装配脑袋的习题在这里：&lt;a href="http://www.cnblogs.com/Ninputer/archive/2009/08/28/expression_tree1.html" target="_blank"&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;Expression Tree上手指南 （一）&lt;/strong&gt;&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;不了解Expression Tree的同学可以去看下，很好，很强大。&lt;/p&gt;1: -a2: a + b * 2&amp;nbsp;我把这些问题都弄成了方法，分别是Question1,Question2,&amp;#8230;.QuestionX&amp;nbsp;&lt;p&gt;&lt;strong&gt;&lt;strong&gt;第一题：&lt;/strong&gt;-a&lt;/strong&gt;&lt;/p&gt;&amp;nbsp;因为实在是太短了，我不明白是什么意思，姑且认为是做取反操作吧，也就是假如输入是5，那么输出是-5.如果让你写lambda表达式，估计没几个人写不出来吧:(a)=&amp;gt;{return &amp;#8211;a;}当然你可以简短点:(a)=&amp;gt;{-a}&amp;nbsp;OK，看一看lambda表达式&lt;font color="#ff0000"&gt;&lt;strong&gt;:(a)=&amp;gt;{return &amp;#8211;a;},&lt;/strong&gt;&lt;/font&gt;可以知道有一个参数a，输出是-a。参数是ParameterExpression.&amp;nbsp;所以Question1里面基本代码是：&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question1()&lt;br/&gt;        {&lt;br/&gt;            ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;        }&amp;nbsp;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;先声明一个参数a。类型是int.接着应该对参数求反。那么我们应该使用求反表达式了。在Msdn 里面的&lt;font color="#ff0000"&gt;&lt;strong&gt;ExpressionType&lt;/strong&gt;&lt;/font&gt; 里面可以查到&lt;a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201107/201107190623529361.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/LoveJenny/201107/201107190624015272.png" width="650" height="134" /&gt;&lt;/a&gt; 当然在Expression里面你也可以找到下面的方法：&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; UnaryExpression Negate(Expression expression);&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&amp;nbsp;于是代码可以修改为：&amp;nbsp;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question1()&lt;br/&gt; {&lt;br/&gt;      ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;      UnaryExpression expNegate = Expression.Negate(expPara);&lt;br/&gt;}&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;OK,剩下的就是生成lambda表达式了,&lt;/p&gt;&lt;p&gt;使用Expression.Lambda方法就可以生成了。lambda表达式最关键的是参数和body。&lt;/p&gt;&lt;p&gt;参数是(a).所以传递的是expPara.&lt;/p&gt;&lt;p&gt;body就是lambda表达式的主体，你可以认为是{}之间的代码,在这里传递的是expNegate.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;为什么要生成lambda表达式??&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;因为可以编译lambda表达式生成委托。&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question1()&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; a = 5;&lt;br/&gt;&lt;br/&gt;    ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    UnaryExpression expNegate = Expression.Negate(expPara);&lt;br/&gt;    LambdaExpression expLmd = Expression.Lambda(expNegate, expPara);&lt;br/&gt;}&lt;br/&gt;有了lambdaExpression后，就可以编译LambdaExpression了。&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question1()&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; a = 5;&lt;br/&gt;&lt;br/&gt;    ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    UnaryExpression expNegate = Expression.Negate(expPara);&lt;br/&gt;    LambdaExpression expLmd = Expression.Lambda(expNegate, expPara);&lt;br/&gt;&lt;br/&gt;    Console.WriteLine(expLmd.Compile().DynamicInvoke(a));&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;运行结果如下：&lt;a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201107/20110719062402779.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/LoveJenny/201107/201107190624025763.png" width="190" height="31" /&gt;&lt;/a&gt; &amp;nbsp;DynamicInvoke的方法签名如下：&amp;nbsp;&lt;span class="rem"&gt;//动态调用（后期绑定）由当前委托所表示的方法。&lt;/span&gt;&lt;br/&gt;[SecuritySafeCritical]&lt;br/&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt; DynamicInvoke(&lt;span class="kwrd"&gt;params&lt;/span&gt; &lt;span class="kwrd"&gt;object&lt;/span&gt;[] args);&amp;nbsp;DynamicInvoke是后期绑定，所以性能比较差。&amp;nbsp;&lt;strong&gt;&lt;font color="#ff0000"&gt;因为我们知道编译后的expLmd.的参数类型是int,结果是int.&lt;/font&gt;&lt;/strong&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;所以我们可以将委托转换为Func&amp;lt;int,int&amp;gt;的强类型的委托。&lt;/font&gt;&lt;/strong&gt;&amp;nbsp;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question1()&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;int&lt;/span&gt; a = 5;&lt;br/&gt;&lt;br/&gt;    ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    UnaryExpression expNegate = Expression.Negate(expPara);&lt;br/&gt;    LambdaExpression expLmd = Expression.Lambda(expNegate, expPara);&lt;br/&gt;&lt;br/&gt;    Console.WriteLine(expLmd.Compile().DynamicInvoke(a));&lt;br/&gt;&lt;br/&gt;    Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; funcQuestion1 = expLmd.Compile() &lt;span class="kwrd"&gt;as&lt;/span&gt; Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;;&lt;br/&gt;    Console.WriteLine(funcQuestion1(a));&lt;br/&gt;}&amp;nbsp;&lt;p&gt;&lt;strong&gt;第二题：a + b * 2&lt;/strong&gt;&lt;/p&gt;&amp;nbsp;&lt;p&gt;第一步，&lt;font color="#ff0000"&gt;&lt;strong&gt;如果你写lambda表达式，你应该怎么写??&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;(int a,int b)=&amp;gt;{return a+ b *2;}&lt;/p&gt;&lt;p&gt;好了，会写lambda表达式，基本上你也应该会写Expression了。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;参数:int a,int b;&lt;/p&gt;&lt;p&gt;body:return a+b*2;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question2()&lt;br/&gt;{&lt;br/&gt;    ParameterExpression expA = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    ParameterExpression expB = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"b"&lt;/span&gt;);&lt;br/&gt;}&lt;br/&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;声明两个变量a,b类型是int.&lt;/p&gt;&lt;p&gt;接着要写body了。&lt;/p&gt;&lt;p&gt;body是a+b*2.&lt;/p&gt;&lt;p&gt;在这里2是常量。首先想到的是查看ExpressionType,看看有没有什么表达式代表的是常量，当然你可以找到ConstantExpression&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;于是代码变成了：&lt;/p&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question2()&lt;br/&gt;{&lt;br/&gt;    ParameterExpression expA = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    ParameterExpression expB = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"b"&lt;/span&gt;);&lt;br/&gt;    ConstantExpression exp2 = Expression.Constant(2);&lt;br/&gt;}&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&lt;strong&gt;接着用()来分隔下a+b*2.&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;()的意思是先执行什么，后执行什么。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;结果如下&amp;nbsp; a + (b *2)&lt;/p&gt;&lt;p&gt;先执行b*2,然后将b*2的结果和a相加。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;Expression expBody = Expression.Add(expA, &lt;br/&gt;                Expression.MakeBinary(ExpressionType.Multiply, expB, exp2));&amp;nbsp;Expression.MakeBinary(ExpressionType.Multiply, expB, exp2))将expB和exp2进行相乘操作。然后和expA做相加操作。生成的就是expBody了。&amp;nbsp;因为我们知道参数是(int,int), 结果是int所以委托的类型是Func&amp;lt;int,int,int&amp;gt;&amp;nbsp;完整的代码如下：&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Question2()&lt;br/&gt;{&lt;br/&gt;    ParameterExpression expA = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"a"&lt;/span&gt;);&lt;br/&gt;    ParameterExpression expB = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(&lt;span class="kwrd"&gt;int&lt;/span&gt;), &lt;span class="str"&gt;"b"&lt;/span&gt;);&lt;br/&gt;    ConstantExpression exp2 = Expression.Constant(2);&lt;br/&gt;&lt;br/&gt;    Expression expBody = Expression.Add(expA, Expression.MakeBinary(&lt;br/&gt;        ExpressionType.Multiply, expB, exp2));&lt;br/&gt;&lt;br/&gt;    Expression&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt; lmd = Expression.Lambda&amp;lt;Func&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;, &lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;&amp;gt;&lt;br/&gt;        (expBody, expA, expB);&lt;br/&gt;&lt;br/&gt;    Console.WriteLine(lmd.Compile()(3, 2));&lt;br/&gt;}&lt;br/&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2441705.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441705.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441704.html</id><title type="text">Linq的Distinct太不给力了</title><summary type="text">假设我们有一个类：Productpublic class Product{ public string Id { get; set; } public string Name { get; set; }}Main函数如下：static void Main(){ List&lt;Product&gt; products = new List&lt;Product&gt;() { new Product(){ Id="1", Name="n1"}, new Product(){ Id="1", Name="n2"}, </summary><published>2012-04-11T00:28:00Z</published><updated>2012-04-11T00:28:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441704.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441704.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;假设我们有一个类：Product&lt;/p&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Product&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Id { get; set; }&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;br/&gt;}&lt;p&gt;Main函数如下：&lt;/p&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main()&lt;br/&gt;{&lt;br/&gt;    List&amp;lt;Product&amp;gt; products = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;Product&amp;gt;()&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Product(){ Id=&lt;span class="str"&gt;"1"&lt;/span&gt;, Name=&lt;span class="str"&gt;"n1"&lt;/span&gt;},&lt;br/&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Product(){ Id=&lt;span class="str"&gt;"1"&lt;/span&gt;, Name=&lt;span class="str"&gt;"n2"&lt;/span&gt;},&lt;br/&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Product(){ Id=&lt;span class="str"&gt;"2"&lt;/span&gt;, Name=&lt;span class="str"&gt;"n1"&lt;/span&gt;},&lt;br/&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; Product(){ Id=&lt;span class="str"&gt;"2"&lt;/span&gt;, Name=&lt;span class="str"&gt;"n2"&lt;/span&gt;},&lt;br/&gt;    };&lt;br/&gt;&lt;br/&gt;    var distinctProduct = products.Distinct();&lt;br/&gt;&lt;br/&gt;    Console.ReadLine();&lt;br/&gt;}&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;可以看到distinctProduct 的结果是：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011958493810.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011958513612.png" width="558" height="306" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;因为Distinct 默认比较的是Product对象的引用，所以返回4条数据。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;那么如果我们希望返回Id唯一的product，那么该如何做呢？&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Distinct方法还有另一个重载：&lt;/p&gt;&lt;span class="rem"&gt;//通过使用指定的 System.Collections.Generic.IEqualityComparer&amp;lt;T&amp;gt; 对值进行比较&lt;/span&gt;&lt;br/&gt;&lt;span class="rem"&gt;//返回序列中的非重复元素。&lt;/span&gt;&lt;br/&gt; &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; Distinct&amp;lt;TSource&amp;gt;(&lt;span class="kwrd"&gt;this&lt;/span&gt; IEnumerable&amp;lt;TSource&amp;gt; source, IEqualityComparer&amp;lt;TSource&amp;gt; comparer);&lt;p&gt;该重载接收一个&lt;strong&gt;IEqualityComparer&lt;/strong&gt;的参数。&lt;/p&gt;&lt;p&gt;假设要按Id来筛选，那么应该新建类&lt;strong&gt;ProductIdComparer&lt;/strong&gt; 内容如下：&lt;/p&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; ProductIdComparer : IEqualityComparer&amp;lt;Product&amp;gt;&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(Product x, Product y)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (x == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; y == &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br/&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; x.Id == y.Id;&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetHashCode(Product obj)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (obj == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br/&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; obj.Id.GetHashCode();&lt;br/&gt;    }&lt;br/&gt;}&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;使用的时候，只需要&lt;/p&gt;var distinctProduct = products.Distinct(&lt;span class="kwrd"&gt;new&lt;/span&gt; ProductIdComparer());&lt;p&gt;结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011958544428.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011958552867.png" width="558" height="168" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;现在假设我们要 按照 Name来筛选重复呢？&lt;/p&gt;&lt;p&gt;很明显，需要再添加一个类ProductNameComparer.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;font color="#ff0000"&gt;那能不能使用泛型类呢？？&lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新建类PropertyComparer&amp;lt;T&amp;gt; 继承IEqualityComparer&amp;lt;T&amp;gt; 内容如下：&lt;/p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; PropertyComparer&amp;lt;T&amp;gt; : IEqualityComparer&amp;lt;T&amp;gt;&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; PropertyInfo _PropertyInfo;&lt;br/&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// 通过propertyName 获取PropertyInfo对象&lt;/span&gt;        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="propertyName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; PropertyComparer(&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;br/&gt;    {&lt;br/&gt;        _PropertyInfo = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).GetProperty(propertyName,&lt;br/&gt;        BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_PropertyInfo == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} is not a property of type {1}."&lt;/span&gt;, &lt;br/&gt;                propertyName, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T)));&lt;br/&gt;        }&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="preproc"&gt;#region&lt;/span&gt; IEqualityComparer&amp;lt;T&amp;gt; Members&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(T x, T y)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; xValue = _PropertyInfo.GetValue(x, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; yValue = _PropertyInfo.GetValue(y, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (xValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; yValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; xValue.Equals(yValue);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetHashCode(T obj)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; propertyValue = _PropertyInfo.GetValue(obj, &lt;span class="kwrd"&gt;null&lt;/span&gt;);&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (propertyValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br/&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; propertyValue.GetHashCode();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br/&gt;}&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;主要是重写的Equals 和GetHashCode 使用了属性的值比较。&lt;/p&gt;&lt;p&gt;使用的时候，只需要：&lt;/p&gt;&lt;span class="rem"&gt;//var distinctProduct = products.Distinct(new PropertyComparer&amp;lt;Product&amp;gt;("Id"));&lt;/span&gt;&lt;br/&gt;var distinctProduct = products.Distinct(&lt;span class="kwrd"&gt;new&lt;/span&gt; PropertyComparer&amp;lt;Product&amp;gt;(&lt;span class="str"&gt;"Name"&lt;/span&gt;));&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;结果如下： &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011958586474.png"&gt;&lt;img style="display: inline" title="image" alt="image" src="http://images.cnblogs.com/cnblogs_com/LoveJenny/201108/201108011959014748.png" width="558" height="178" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;为什么微软不提供PropertyEquality&amp;lt;T&amp;gt; 这个类呢？&lt;/p&gt;&lt;p&gt;按照上面的逻辑，这个类应该没有很复杂啊，细心的同学可以发现PropertyEquality 大量的使用了反射。每次获取属性的值的时候，都在调用 &lt;br /&gt;&lt;font color="#ff0000"&gt;&lt;strong&gt;_PropertyInfo.GetValue(x, null);&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;可想而知，如果要筛选的记录非常多的话，那么性能无疑会受到影响。&lt;/p&gt;&lt;p&gt;为了提升性能，可以使用&lt;strong&gt;表达式树&lt;/strong&gt;将反射调用改为&lt;strong&gt;委托调用&lt;/strong&gt;，&lt;/p&gt;&lt;p&gt;具体代码如下：&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; FastPropertyComparer&amp;lt;T&amp;gt; : IEqualityComparer&amp;lt;T&amp;gt;&lt;br/&gt;{&lt;br/&gt;    &lt;span class="kwrd"&gt;private&lt;/span&gt; Func&amp;lt;T, Object&amp;gt; getPropertyValueFunc = &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// 通过propertyName 获取PropertyInfo对象&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="rem"&gt;/// &amp;lt;param name="propertyName"&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; FastPropertyComparer(&lt;span class="kwrd"&gt;string&lt;/span&gt; propertyName)&lt;br/&gt;    {&lt;br/&gt;        PropertyInfo _PropertyInfo = &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).GetProperty(propertyName,&lt;br/&gt;        BindingFlags.GetProperty | BindingFlags.Instance | BindingFlags.Public);&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (_PropertyInfo == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;        {&lt;br/&gt;            &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="kwrd"&gt;string&lt;/span&gt;.Format(&lt;span class="str"&gt;"{0} is not a property of type {1}."&lt;/span&gt;, &lt;br/&gt;                propertyName, &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T)));&lt;br/&gt;        }&lt;br/&gt;&lt;br/&gt;        ParameterExpression expPara = Expression.Parameter(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T), &lt;span class="str"&gt;"obj"&lt;/span&gt;);&lt;br/&gt;        MemberExpression me = Expression.Property(expPara, _PropertyInfo);&lt;br/&gt;        getPropertyValueFunc = Expression.Lambda&amp;lt;Func&amp;lt;T, &lt;span class="kwrd"&gt;object&lt;/span&gt;&amp;gt;&amp;gt;(me, expPara).Compile();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="preproc"&gt;#region&lt;/span&gt; IEqualityComparer&amp;lt;T&amp;gt; Members&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Equals(T x, T y)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; xValue = getPropertyValueFunc(x);&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; yValue = getPropertyValueFunc(y);&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (xValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; yValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;;&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;return&lt;/span&gt; xValue.Equals(yValue);&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; GetHashCode(T obj)&lt;br/&gt;    {&lt;br/&gt;        &lt;span class="kwrd"&gt;object&lt;/span&gt; propertyValue = getPropertyValueFunc(obj);&lt;br/&gt;&lt;br/&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (propertyValue == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;&lt;br/&gt;        &lt;span class="kwrd"&gt;else&lt;/span&gt;&lt;br/&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; propertyValue.GetHashCode();&lt;br/&gt;    }&lt;br/&gt;&lt;br/&gt;    &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;br/&gt;}&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以看到现在获取值只需要&lt;strong&gt;&lt;font color="#ff0000"&gt;getPropertyValueFunc(obj)&lt;/font&gt;&lt;/strong&gt; 就可以了。&lt;/p&gt;&lt;p&gt;使用的时候：&lt;/p&gt;var distinctProduct = products.Distinct(&lt;span class="kwrd"&gt;new&lt;/span&gt; FastPropertyComparer&amp;lt;Product&amp;gt;(&lt;span class="str"&gt;"Id"&lt;/span&gt;)).ToList();&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/div&gt;&lt;div id="MySignature"&gt;&lt;div&gt;作者：&lt;a href="http://www.cnblogs.com/LoveJenny/" target="_blank"&gt;LoveJenny&lt;/a&gt; &lt;/div&gt;&lt;div&gt;出处：&lt;a href="http://www.cnblogs.com/LoveJenny/" target="_blank"&gt;http://www.cnblogs.com/LoveJenny/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;本文版权归作者和博客园共有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2441704.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/04/11/2441704.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/04/10/2439899.html</id><title type="text">Fluent NHibernate之旅</title><summary type="text">ORM大家都非常熟悉了吧，我相信也有很多朋友正在用自己或者一些公开的框架，而最常用而且强大的，非Hibernate了（Net中为NHibernate）,网上的文档非常多，不过在博客园中，介绍NHibernate的非常少，李哥的NHibernate系列（NHibernate之旅）不失为一个经典，对于新手的我们，需要完全掌握还需要很长一段路，对于新手来说，最初的配置是非常头大的一件事情，好在老赵推荐一个开源的框架Fluent NHibernate，有了它，我们可以完全脱离配置文件，不过博客园中介绍Fluent NHibernate的文章非常少，而且官方文档也还没有完全，所以对于我来说也就一点一点摸</summary><published>2012-04-10T00:42:00Z</published><updated>2012-04-10T00:42:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/10/2439899.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/10/2439899.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;ORM大家都非常熟悉了吧，我相信也有很多朋友正在用自己或者一些公开的框架，而最常用而且强大的，非Hibernate了（Net中为&lt;a href="http://fluentnhibernate.org/" target="_blank"&gt;&lt;font color="#000000"&gt;NHibernate&lt;/font&gt;&lt;/a&gt;）,网上的文档非常多，不过在博客园中，介绍NHibernate的非常少，李哥的NHibernate系列（&lt;a href="http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html" target="_blank"&gt;&lt;font color="#000000"&gt;NHibernate之旅&lt;/font&gt;&lt;/a&gt;）不失为一个经典，对于新手的我们，需要完全掌握还需要很长一段路，对于新手来说，最初的配置是非常头大的一件事情，好在&lt;a href="http://www.cnblogs.com/JeffreyZhao" target="_blank"&gt;&lt;font color="#000000"&gt;老赵&lt;/font&gt;&lt;/a&gt;推荐一个开源的框架&lt;a href="http://fluentnhibernate.org/" target="_blank"&gt;&lt;font color="#000000"&gt;Fluent NHibernate&lt;/font&gt;&lt;/a&gt;，有了它，我们可以完全脱离配置文件，不过博客园中介绍Fluent NHibernate的文章非常少，而且官方文档也还没有完全，所以对于我来说也就一点一点摸索起来，这也激起了我写这个笔记的欲望，废话不说了，下面就介绍Fluent NHibernate，大家也一起来体验一下Fluent Nhibernate的快感吧。&lt;/p&gt;&lt;p&gt;本篇内容：&lt;/p&gt;&lt;p&gt;1、初识Fluent NHibernate（简称Fluent）&lt;/p&gt;&lt;p&gt;2、使用NHibernate和Fluent创建ISessionFactory&lt;/p&gt;&lt;p&gt;3、传统方式和Fluent的对比。&lt;/p&gt;&lt;p&gt;4、灵活的Fluent&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;一、初识Fluent NHibernate（简称Fluent）&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;Fluent NHibernate offers an alternative to NHibernate's standard XML mapping files. Rather than writing XML documents (.hbm.xml files), Fluent NHibernate lets you write mappings in strongly typed C# code. This allows for easy refactoring, improved readability and more concise code.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;这是官方的说明，大体的话也就是用编程的方式进行配置，让你能更好的理解，不需要编写复杂的映射文件，它能完全替换NHibernate的映射文件，让你在映射的时候能使用C#的强类型方式。&lt;/p&gt;&lt;p&gt;在开始之前，我们先下载它的Dll，当然你也可以下载它的源代码进行修改和学习。&lt;/p&gt;&lt;p&gt;下载地址：&lt;a href="http://fluentnhibernate.org/" target="_blank"&gt;&lt;font color="#000000"&gt;http://fluentnhibernate.org/&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;二、使用NHibernate和Fluent创建ISessionFactory&lt;/p&gt;&lt;p&gt;准备工作：&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;1、下载Fluent类库，其中已经包含了NHibernate最新版本。&lt;/p&gt;&lt;p&gt;2、下载NHibernate类库，虽然Fluent已经有了最新版本，但我们还需要Proxy的Dll，这里我们使用NHibernate.ByteCode.Castle这个程序集。&lt;/p&gt;&lt;p&gt;3、建立一个空数据库（我们使用MSSql2005），数据库名为：MyNHibernate，这个数据库为信任连接。&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;在NHibernate中，ISession是操作数据的核心，我们需要通过SessionFactory来建造ISession来进行数据的交互。SessionFactory中反映了数据库映射关系，我们来看下配置：&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;hibernate-configuration&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="urn:nhibernate-configuration-2.2"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;session-factory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="dialect"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;NHibernate.Dialect.MsSql2005Dialect&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="connection.connection_string"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Server=(local);initial&amp;nbsp;catalog=MyNHibernate;Integrated&amp;nbsp;Security=SSPI&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="connection.isolation"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;ReadCommitted&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;property&amp;nbsp;&lt;/span&gt;&lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;="proxyfactory.factory_class"&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NHibernate.ByteCode.Castle.ProxyFactoryFactory,&amp;nbsp;NHibernate.ByteCode.Castle&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;property&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;session-factory&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;hibernate-configuration&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;大体的意思我相信大家都懂，数据库类型和数据库的配置，还有一些NHibernate所需的配置，这里的proxyfactory.factory_class是2.1新加入的，至于用处还不是很了解，大家可以看下李大哥的&amp;#8220;&lt;a href="http://www.cnblogs.com/lyj/archive/2009/08/02/nhibernate-new-features-tuplizers.html" target="_blank"&gt;&lt;font color="#000000"&gt;NHibernate2.1新特性之Tuplizers&lt;/font&gt;&lt;/a&gt;&amp;#8221;。下面我们在代码中创建一个SessionFactory，NHibernate建议我们在一个应用程序中使用一个数据库一个SessionFactory，这里我们用单数据库，代码如下： &lt;div class="codeContent"&gt;&lt;span style="color: blue"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;GetCurrentFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_66_238_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_66_238_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_66_238_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_66_238_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(sessionFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_120_192_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_120_192_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_120_192_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_120_192_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sessionFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CreateSessionFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;sessionFactory;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;CreateSessionFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_310_395_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_310_395_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_310_395_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_310_395_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Configuration().Configure().BuildSessionFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;sessionFactory&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_459_504_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_459_504_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_459_504_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_459_504_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;18&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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: #008080"&gt;19&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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: #008080"&gt;20&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;        &lt;br /&gt;&lt;/span&gt;&lt;font color="#333333"&gt;传统的方式其实已经非常灵活和简单了，但配置文件真的有点头大，那么多的属性，还有很多特性（Attribute），接下来我们来看下Fluent&lt;/font&gt;&lt;/div&gt;折叠代码&lt;/span&gt;&lt;p&gt;使用Fluent我们不需要再进行配置，我们可以完全抛开xml文档，前面说过Fluent是对Mapping的一个代码化，Mapping的一切功能，我们都能通过Fluent进行配置。&lt;/p&gt;&lt;p&gt;因为Fluent是基于NHibernate的，它只实现了NHibernate的Mapping功能，其他功能还不能代替，所以我们的项目中要同时引入NHibernate和FluentNHibernate两个类库。代码如下：&lt;/p&gt;&lt;div class="codeContent"&gt;&lt;span style="color: blue"&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;GetCurrentFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_66_238_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_66_238_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_66_238_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_66_238_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;(sessionFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;==&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_120_192_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_120_192_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_120_192_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_120_192_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sessionFactory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;CreateSessionFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;sessionFactory;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;CreateSessionFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;12&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_310_675_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_310_675_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_310_675_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_310_675_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;13&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;Fluently.Configure()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;14&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Database(&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;15&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FluentNHibernate.Cfg.Db.MsSqlConfiguration.MsSql2005&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;16&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.ConnectionString(s&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;s.Server(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;.&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #000000"&gt;)&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;17&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.Database(&lt;/span&gt;&lt;span style="color: #800000"&gt;"&lt;/span&gt;&lt;span style="color: #800000"&gt;MyNHibernate&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: #008080"&gt;18&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.TrustedConnection())&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;19&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;).BuildSessionFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;20&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;21&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;static&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;ISessionFactory&amp;nbsp;sessionFactory&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;22&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_744_789_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_744_789_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_744_789_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_744_789_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;23&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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: #008080"&gt;24&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&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: #008080"&gt;25&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;        &lt;br /&gt;&lt;/span&gt;&lt;font color="#333333"&gt;这样就可以了，我们完全抛开了配置，简单的一些代码，已经完成了SessionFactory的配置工作，或许你还有一些配置，在后面的文章中会继续为您讲解。&lt;/font&gt;&lt;/div&gt;折叠代码&lt;/span&gt;&lt;p&gt;两种方式的创建写好了，因为是测试，所以写的比较乱，下面我们写一个测试代码，只需要测试一个方法即可。代码如下：&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding:10px;"&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;1&lt;/span&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;span style="color: #000000"&gt;[TestMethod]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;2&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;NHibernateFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;3&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_45_102_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_45_102_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_45_102_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_45_102_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;4&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&amp;nbsp;factory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;TradSessionFactory.GetCurrentFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;5&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;6&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;[TestMethod]&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;7&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FluentFactory()&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;8&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img id="Codehighlighter1_144_203_Open_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif"&gt;&lt;img style="display: none" id="Codehighlighter1_144_203_Closed_Image" onclick="code_collapse_toggle(this);" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif"&gt;&lt;/span&gt;&lt;span style="border-bottom: #808080 1px solid; border-left: #808080 1px solid; background-color: #ffffff; display: none; border-top: #808080 1px solid; border-right: #808080 1px solid" id="Codehighlighter1_144_203_Closed_Text"&gt;&lt;img alt="" src="http://www.cnblogs.com/Images/dot.gif" /&gt;&lt;/span&gt;&lt;span id="Codehighlighter1_144_203_Open_Text"&gt;&lt;span style="color: #000000"&gt;{&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;&amp;nbsp;9&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif" /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; var&amp;nbsp;factory&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000"&gt;=&lt;/span&gt;&lt;span style="color: #000000"&gt;&amp;nbsp;FluentSessionFactory.GetCurrentFactory();&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;10&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif" /&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008080"&gt;11&lt;/span&gt;&lt;span style="color: #000000"&gt;&lt;img alt="" align="top" src="http://www.cnblogs.com/Images/OutliningIndicators/None.gif" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;运行一下，结果如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/inday/WindowsLiveWriter/ORMFluentNHibernate_13C4D/image_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/inday/WindowsLiveWriter/ORMFluentNHibernate_13C4D/image_thumb.png" width="398" height="98" /&gt;&lt;/a&gt; &lt;/p&gt;&lt;p&gt;如果数据库配置是正确的话，你会看到如上的结果。&lt;/p&gt;&lt;p&gt;三、传统方式和Fluent的对比&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 上面的演示相信大家都能看明白，两者之间的对比也比较明显的显露出来，传统的方式我们只需要编写正确的配置文件，相对比较灵活，一些修改的话都可以在配置文件中进行更新，比如Mappings，而上面的代码，Fluent虽然使用代码的方式进行了配置，省去了配置文件，但灵活性却没有传统方式那么好，修改一些配置的时候，我们得扩充我们的CreateSessionFactory的方法，不过Fluent更符合人类的思考行为，而且有VS这么强大IDE，在编写代码的同时，能够享受强大的智能感知。&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 两者之间都各有长短，或许你还没有体会到Fluent的强大，在日后的Mappings时，你会慢慢了解为什么他会叫Fluent。传统方式对于一些经常使用的程序员来说非常简便，加上代码生成工具，使用起来也会游刃有余，但对于新手来说，Fluent绝对是一个好帮手。&lt;/p&gt;&lt;p&gt;四、灵活的Fluent&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 那我们Fluent就没有办法灵活了吗？当然不，Fluent的开发者不仅帮你保留了原有的方式，还可以混合你的配置文件，最有意思的时，你还可以使用它来学习NHibernate，甚至可以使用它来开发你自己的自动代码生成工具，因为我也刚学，先介绍一些简单的，至于其他功能，希望大家也能跟我一起学习，体验Fluent带来的快感。&lt;/p&gt;&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&lt;p&gt;使用NHibernate的配置&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 也就是你可以按照原先的方式进行配置，而读取呢使用Fluent来读取，然后创建SessionFactory，或许你感觉这不是多余了嘛，那是因为还没有讲到Mapping，这里我们先介绍一下，如果用Fluent结合传统的配置文件，来创建SessionFactory（后面的代码会简略，只修改上面其中的创建方法）。&lt;/p&gt;&lt;div class="codeContent"&gt;&lt;span style="color: blue"&gt;private static &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ISessionFactory &lt;/span&gt;CreateSessionFactory()&lt;br/&gt;{&lt;br/&gt;&lt;span style="color: blue"&gt;    return &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Fluently&lt;/span&gt;.Configure(&lt;span style="color: blue"&gt;new &lt;/span&gt;NHibernate.Cfg.&lt;span style="color: #2b91af"&gt;Configuration&lt;/span&gt;().Configure()).BuildSessionFactory();&lt;br/&gt;}&lt;/div&gt;折叠代码&lt;/span&gt;&lt;div class="codeContent"&gt;哈哈，简单吧，我们使用了原先的配置文件，然后用Fluent进行创建，而且我们可以为配置文件中没有的配置进行扩展。&lt;/div&gt;折叠代码&lt;/span&gt;&lt;/blockquote&gt;&lt;div class="codeContent"&gt;原本打算把Fluent学习的方法说一下，后来一看，必须要先说Fluent的Mapping才能说到这个，所以暂时先不说了，等到下一章映射的部分再一起来说。&lt;/div&gt;折叠代码&lt;/span&gt;&lt;div class="codeContent"&gt;文章写得很烂，也当是笔记吧，NHibernate也是刚刚学，惭愧惭愧，学的不是很彻底，今后也会结合NHibernate的学习一起来说。&lt;/div&gt;折叠代码&lt;/span&gt;&lt;/div&gt;&lt;div id="MySignature"&gt;&lt;p&gt;-----------------------------------------------------&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;网名：James.Ying（玄天尊）&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MSN：&lt;a href="&amp;#109;&amp;#97;&amp;#105;&amp;#108;&amp;#116;&amp;#111;&amp;#58;&amp;#120;&amp;#95;&amp;#105;&amp;#110;&amp;#100;&amp;#97;&amp;#121;&amp;#64;&amp;#109;&amp;#115;&amp;#110;&amp;#46;&amp;#99;&amp;#111;&amp;#109;" target="_blank"&gt;&lt;font color="#000000"&gt;x_inday@msn.com&lt;/font&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;经验：5年电子商务网站开发&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;目标：电子商务平民化。&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2439899.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/04/10/2439899.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/aaa6818162/archive/2012/04/05/2433006.html</id><title type="text">Ninject 2.x细说---2.绑定和作用域</title><summary type="text">Ninject中提供多种接口和实现类的绑定的方式供我们选择，同时还可以设置相关的绑定项以及对象的作用域等。具体如下：（其中使用到的类和代码重用上一节的“Ninject 2.x细说---1.基本使用”中的定义）1. 绑定：Ninject中提供好几种绑定接口实现的方法，具体如下：ØTo：绑定到接口的具体实现。ØToConstant：绑定到某个常量值。ØToMethod：绑定到方法。ØToProvider：绑定到某个自定义的对象创建提供程序。ØToSelf：自绑定。代码如下：1) 自绑定Ninject可以使用ToSelf（）方法，将自己绑定自己，这里</summary><published>2012-04-05T05:08:00Z</published><updated>2012-04-05T05:08:00Z</updated><author><name>awp110</name><uri>http://www.cnblogs.com/aaa6818162/</uri></author><link rel="alternate" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/05/2433006.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/aaa6818162/archive/2012/04/05/2433006.html"/><content type="html">&lt;div id="cnblogs_post_body"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中提供多种接口和实现类的绑定的方式供我们选择，同时还可以设置相关的绑定项以及对象的作用域等。具体如下：（其中使用到的类和代码重用上一节的&amp;#8220;&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;&lt;a href="http://www.cnblogs.com/xray2005/archive/2011/10/31/2230900.html" target="_blank"&gt;&lt;font color="#78afd3"&gt;Ninject 2.x&lt;span style="font-family: 宋体"&gt;细说&lt;/span&gt;---1.&lt;span style="font-family: 宋体"&gt;基本使用&lt;/span&gt;&lt;/font&gt;&lt;/a&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;&amp;#8221;中的定义）&lt;/span&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 15pt"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;1.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;绑定：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中提供好几种绑定接口实现的方法，具体如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;To&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：绑定到接口的具体实现。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;ToConstant&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：绑定到某个常量值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;ToMethod&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：绑定到方法。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;ToProvider&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：绑定到某个自定义的对象创建提供程序。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;ToSelf&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：自绑定。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;代码如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;1)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;自绑定&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;可以使用&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;ToSelf&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;（）方法，将自己绑定自己，这里必须是一个具体的类。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;&amp;gt;().ToSelf();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;2)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;绑定到方法：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().ToMethod(context =&amp;gt; &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;());&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;3)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;绑定到具体的类型&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;Bind&amp;lt;IMessage&amp;gt;().ToConstant(new MessageDB());&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;4)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;绑定到指定的服务提供程序&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-size: 12pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 12pt"&gt;以及&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().ToProvider(&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 9.5pt"&gt;实现&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;IProvider&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 9.5pt"&gt;接口的服务提供程序&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;2.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;指定相关绑定信息：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中，可以在绑定的时候指定一些附加信息，以便更加明确构造函数或者是给某些属性赋值或者在绑定时回调方法。如下面的代码中：&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().To&amp;lt;&lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;&amp;gt;().WithConstructorArgument(&lt;span style="color: #a31515"&gt;"msg"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;1&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;我们在绑定的同时指定了构造函数的参数以及值。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;此外，还可以设置的指定信息分别有：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;WithConstructorArgument&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：指定构造函数中相关的参数，还有回调方法的重载。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;WithMetadata&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：指定相关元数据信息。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;WithParameter&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：指定相关的自定义参数。这个方法也实现构造函数参数值指定，与WithConstructorArgument类似，如：Bind&amp;lt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;IMessage&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;&amp;gt;().To&amp;lt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;MessageDB&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;&amp;gt;().WithConstructorArgument("&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;msg&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;", 1);&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;同样可以写成：Bind&amp;lt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;IMessage&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;&amp;gt;().To&amp;lt;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;MessageDB&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;&amp;gt;().WithParameter(new &lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;ConstructorArgument&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;("&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;msg&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;", 1));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="line-height: 150%; font-family: Wingdings; font-size: 12pt"&gt;&amp;#216;&amp;nbsp;&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;WithPropertyValue&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：指定相关的属性值，还有回调方法的重载。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;3.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;条件绑定：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中还可以指定相关的绑定的条件，只有条件满足的情况的下，才将相关的接口实现绑定到相关的接口上。如：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().To&amp;lt;&lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;&amp;gt;().WhenInjectedInto&amp;lt;&lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;上面的代码，由于&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;MessageCfg&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;依赖与&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;IMessage&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;接口，所以其意思是在&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;MessageCfg&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类中依赖的&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;IMessage&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;接口与&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;MessageDB&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类绑定。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类似的还有&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;When()&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;如：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().To&amp;lt;&lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;&amp;gt;().When(cxt =&amp;gt; cxt.Service.Name.StartsWith(&lt;span style="color: #a31515"&gt;"Msg"&lt;/span&gt;));&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;其他的条件还有&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;WhenClassHas&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;WhenParentNamed&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;WhenTargetHas&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;等条件绑定。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;4.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;设置注入项&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;在&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中可以通过&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;NinjectSettings&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类来指定注入项。如：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;//&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt"&gt;设置注入项&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;var&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; settings = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;NinjectSettings&lt;/span&gt;() { AllowNullInjection = &lt;span style="color: blue"&gt;true&lt;/span&gt; };&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&lt;span style="color: blue"&gt;using&lt;/span&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; kernal = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StandardKernel&lt;/span&gt;(settings, &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageModule&lt;/span&gt;()))&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;{&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;var&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; msgcfg = kernal.Get&amp;lt;&lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;&amp;gt;();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;其中，可以设置的项有：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;ActivationCacheDisabled&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;AllowNullInjection&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;CachePruningInterval&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;ExtensionSearchPattern&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InjectAttribute&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;、&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InjectNonPublic&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;等等。大概对应的就是设置缓存是否启用、是否允许空注入、缓存周期、扩展查找位置、必须被注入的属性、是否必须注入非公开成员等等。（&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;BTW&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;：&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Ninject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中摘要说明少了&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Get&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;，还发现好几个地方都是这样呢）。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;5.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Inject&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;特性&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;在&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Inject&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;中，我们构造函数、属性和字段上加&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt; [Inject]&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;特性指示，以便指定注入的属性、方法和字段等。&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;[Inject]&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;特性定义具体如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;[&lt;span style="color: #2b91af"&gt;AttributeUsage&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Constructor | &lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Method | &lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Property | &lt;span style="color: #2b91af"&gt;AttributeTargets&lt;/span&gt;.Field, AllowMultiple = &lt;span style="color: blue"&gt;false&lt;/span&gt;, Inherited = &lt;span style="color: blue"&gt;true&lt;/span&gt;)]&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;InjectAttribute&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;Attribute&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; InjectAttribute();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;例如使用&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;[Inject]&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;指定构造函数，如果某个类存在多个构造函数，那么我们就可以在某个构造函数上使用&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;[Inject]&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;来指定从此处注入，具体代码如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;public&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; MessageDB() { }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; MessageDB(&lt;span style="color: blue"&gt;object&lt;/span&gt; msg)&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: #a31515; font-size: 9.5pt"&gt;使用了&lt;/span&gt;&lt;span style="font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;object &lt;/span&gt;&lt;span style="font-family: 宋体; color: #a31515; font-size: 9.5pt"&gt;参数构造：&lt;/span&gt;&lt;span style="font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;{0}"&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;, msg);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; [&lt;span style="color: #2b91af"&gt;Inject&lt;/span&gt;]&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; MessageDB(&lt;span style="color: blue"&gt;int&lt;/span&gt; msg)&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: #a31515; font-size: 9.5pt"&gt;使用了&lt;/span&gt;&lt;span style="font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;int &lt;/span&gt;&lt;span style="font-family: 宋体; color: #a31515; font-size: 9.5pt"&gt;参数构造：&lt;/span&gt;&lt;span style="font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;{0}"&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;, msg);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;string&lt;/span&gt; GetMsgNumber()&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;return&lt;/span&gt; &lt;span style="color: #a31515"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: #a31515; font-size: 9.5pt"&gt;从数据中读取消息号&lt;/span&gt;&lt;span style="font-family: NSimSun; color: #a31515; font-size: 9.5pt"&gt;!"&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;相应的&lt;/span&gt;&lt;span style="line-height: 150%; font-family: NSimSun; color: #2b91af; font-size: 9.5pt"&gt;MessageModule&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;进行修改，具体如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;public&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageModule&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;NinjectModule&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Load()&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt"&gt;绑定接口并指定接口的实现。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().To&amp;lt;&lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;&amp;gt;().WithConstructorArgument(&lt;span style="color: #a31515"&gt;"msg"&lt;/span&gt;, &lt;span style="color: #a31515"&gt;1&lt;/span&gt;);&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;}&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;具体使用如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;using&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; kernal = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StandardKernel&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageModule&lt;/span&gt;()))&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt"&gt;属性注入&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; msgcfg = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;() { Msg = kernal.Get&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;() };&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(msgcfg.GetMsgNumber());&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Read();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;其中&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;MessageCfg&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类的定义见前一节介绍的内容。通过上面的代码，我们可以看到，&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;MessageDB&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;分别由&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;int&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;和&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;object&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;类型的构造函数，如果没有在构造函数上指定&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;[Inject]&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;，经过测试发现它默认就是选择第一个构造函数，如果参数类型不匹配就直接抛出异常。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;6.&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;对象作用域：&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;table style="border-collapse: collapse" border="1" cellspacing="1" bordercolor="#c0c0c0" cellpadding="1"&gt;&lt;tbody&gt;&lt;tr bordercolor="#c0c0c0"&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: #ffffff; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Transient &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;.InTransientScope()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;每次调用创建新实例。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Singleton &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;.InSingletonScope()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;单例，仅创建一个实例。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Thread &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;.InThreadScope()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;每一个线程创建一个实例。&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; width: 108px; padding-right: 0cm; height: 36px; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Request &lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;.InRequestScope()&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;每当&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;Web&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;请求发起时创建一个实例，结束请求时释放实例&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InScope&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InScope(Func)&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;td style="border-bottom: #f0f0f0; border-left: #f0f0f0; padding-bottom: 0cm; background-color: transparent; padding-left: 0cm; padding-right: 0cm; border-top: #f0f0f0; border-right: #f0f0f0; padding-top: 0cm" valign="top"&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;对象尽量保持到回调委托返回&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;上表来自&amp;#8220;靠近太阳&amp;#8221;的博文，后增加了&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InScope &lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;。如使用&lt;/span&gt;&lt;span style="line-height: 150%; font-size: 12pt"&gt;InThreadScope&lt;/span&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;（）具体例子如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;public&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; &lt;span style="color: blue"&gt;class&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageModule&lt;/span&gt; : &lt;span style="color: #2b91af"&gt;NinjectModule&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;public&lt;/span&gt; &lt;span style="color: blue"&gt;override&lt;/span&gt; &lt;span style="color: blue"&gt;void&lt;/span&gt; Load()&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt"&gt;绑定接口并指定接口的实现。&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Bind&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;().To&amp;lt;&lt;span style="color: #2b91af"&gt;MessageDB&lt;/span&gt;&amp;gt;().InThreadScope().WithParameter(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ConstructorArgument&lt;/span&gt;(&lt;span style="color: #a31515"&gt;"msg"&lt;/span&gt;, 1));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="line-height: 150%; font-family: 宋体; font-size: 12pt"&gt;使用代码如下：&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; color: blue; font-size: 9.5pt"&gt;using&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt; (&lt;span style="color: blue"&gt;var&lt;/span&gt; kernal = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;StandardKernel&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageModule&lt;/span&gt;()))&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: green; font-size: 9.5pt"&gt;属性注入&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: blue"&gt;var&lt;/span&gt; th1 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ThreadStart&lt;/span&gt;(() =&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; msgcfg = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;() { Msg = kernal.Get&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;() };&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(msgcfg.GetMsgNumber());&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: blue"&gt;var&lt;/span&gt; th2 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ThreadStart&lt;/span&gt;(() =&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; msgcfg = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;() { Msg = kernal.Get&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;() };&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(msgcfg.GetMsgNumber());&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; th3 = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;Thread&lt;/span&gt;(&lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;ThreadStart&lt;/span&gt;(() =&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue"&gt;var&lt;/span&gt; msgcfg = &lt;span style="color: blue"&gt;new&lt;/span&gt; &lt;span style="color: #2b91af"&gt;MessageCfg&lt;/span&gt;() { Msg = kernal.Get&amp;lt;&lt;span style="color: #2b91af"&gt;IMessage&lt;/span&gt;&amp;gt;() };&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.WriteLine(msgcfg.GetMsgNumber());&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }));&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&amp;nbsp;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; th1.Start();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;th2.Start();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; th3.Start();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Read();&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;p align="left"&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/p&gt;&lt;span style="font-family: 宋体; font-size: 12pt"&gt;在上面的代码中，我们指定了对象在&lt;/span&gt;&lt;span style="font-family: NSimSun; font-size: 9.5pt"&gt;InThreadScope&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 12pt"&gt;，在使用的代码中分别创建了&lt;/span&gt;&lt;span style="font-family: 'Calibri', 'sans-serif'; font-size: 12pt"&gt;3&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 12pt"&gt;个线程来进行模拟，最终每个线程都是创建了一个对象。&lt;/span&gt; &lt;/div&gt;&lt;div id="MySignature"&gt;&lt;div style="color: green"&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="color: green"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: #ff6600"&gt;本文版权归作者所有，欢迎转载，但未经作者同意必须保留此段声明，且在文章页面明显位置给出原文连接，否则保留追究法律责任的权利。 &lt;/span&gt;&lt;/div&gt;&lt;div style="color: green"&gt;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/aaa6818162/aggbug/2433006.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/aaa6818162/archive/2012/04/05/2433006.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
