<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_YJingLee's Blog</title><subtitle type="text">把握点点滴滴！</subtitle><id>http://feed.cnblogs.com/blog/u/23571/rss</id><updated>2012-05-31T03:22:45Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23571/rss"/><entry><id>http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-apply.html</id><title type="text">NHibernate剖析：Mapping篇之Mapping-By-Code(2):运用ModelMapper</title><summary type="text">上一篇文章介绍了Mapping-By-Code(代码映射)的原理，这篇文章结合上篇的原理运用Mapping-By-Code(代码映射)。</summary><published>2011-04-10T08:33:00Z</published><updated>2011-04-10T08:33:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-apply.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-apply.html"/><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;本节内容&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;&lt;a href="#introduction"&gt;Mapping-By-Code概览&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#apply"&gt;运用ModelMapper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#summary"&gt;结语&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#reference"&gt;参考资料&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="introduction"&gt;Mapping-By-Code概览&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html" target="_blank"&gt;上一篇&lt;/a&gt;文章介绍了Mapping-By-Code(代码映射)的原理，这篇文章结合上篇的原理运用Mapping-By-Code(代码映射)。为了更有效的学习代码映射，这篇文章使用单元测试的方式，每一个测试用例代表某一功能实现，并且为了直观的认识&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象，我把&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象序列化为字符串写入标准输出流，为此定义一个名为ShowInConsole的扩展方法。&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public static class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;HbmMappingExtensions&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public static void &lt;/span&gt;ShowInConsole(&lt;span style="color:blue"&gt;this &lt;/span&gt;&lt;span style="color:#2b91af"&gt;HbmMapping &lt;/span&gt;mapping)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(mapping.AsString());&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="apply"&gt;运用Mapping-By-Code&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们先定义一个非常简单的Domain模型，一个int类型的Id属性和一个string类型的Something属性，用来代码映射：&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;MyClass&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;Something { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;1.基本映射&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;提供一种基本映射方式：使用Class方法对实体类MyClass特定映射：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;属性Id映射为数据库主键，对应的列名称为MyClassId、主键生成策略是HighLow策略。&lt;/li&gt;&lt;li&gt;属性Something映射为数据库普通字段，其长度为150。&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;最后调用CompileMappingForAllExplicitAddedEntities方法显式所有映射的实体(这里是MyClass)编译为&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象并输出，也可以使用CompileMappingFor方法指定实体类型。&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;BasicMappingRegistration()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt;&lt;br/&gt;        {&lt;br/&gt;            map.Column(&lt;span style="color:#a31515"&gt;"MyClassId"&lt;/span&gt;);&lt;br/&gt;            map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow);&lt;br/&gt;        });&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something, map =&amp;gt; map.Length(150));&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    &lt;span style="color:green"&gt;//var hbmMapping = mapper.CompileMappingFor(new[] {typeof (MyClass)});&lt;/span&gt;&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;NHibernate对于代码映射提供很强的灵活性，你可以像你希望的那样随意去组织映射：例如class-by-class方式、不同的映射点在不同的地方等等。&lt;/p&gt;&lt;p&gt;例如下面代码映射，分开去配置映射，NHibernate对重复的属性不重复映射，去合并映射：&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;WhenDuplicatePropertiesDoesNotDuplicateMapping()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt; map.Column(&lt;span style="color:#a31515"&gt;"MyClassId"&lt;/span&gt;));&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt; map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow));&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something);&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something, map =&amp;gt; map.Length(150));&lt;br/&gt;    });&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;你甚至也可以在两个不同地方去映射整个实体类：&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;WhenDuplicateClassDoesNotDuplicateMapping()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt; map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow));&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something);&lt;br/&gt;    });&lt;br/&gt;&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt; map.Column(&lt;span style="color:#a31515"&gt;"MyClassId"&lt;/span&gt;));&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something, map =&amp;gt; map.Length(150));&lt;br/&gt;    });&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;2.Conformist映射&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;提供另外一种Conformist映射方式：class-by-class方式，即每个类定义一个类去映射，然后调用AddMapping方法把映射加入&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;对象。&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;private class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;MyClassMap &lt;/span&gt;: &lt;span style="color:#2b91af"&gt;ClassMapping&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;MyClassMap()&lt;br/&gt;    {&lt;br/&gt;        Id(myclass =&amp;gt; myclass.Id, map =&amp;gt;&lt;br/&gt;        {&lt;br/&gt;            map.Column(&lt;span style="color:#a31515"&gt;"MyClassId"&lt;/span&gt;);&lt;br/&gt;            map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow);&lt;br/&gt;        });&lt;br/&gt;        Property(myclass =&amp;gt; myclass.Something, map =&amp;gt; map.Length(150));&lt;br/&gt;    }&lt;br/&gt;}&lt;br/&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;ConformistMappingRegistration()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    mapper.AddMapping&amp;lt;&lt;span style="color:#2b91af"&gt;MyClassMap&lt;/span&gt;&amp;gt;();&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;上面的映射如果查看其输出结果，都是一样：&lt;/p&gt;&lt;p&gt;&lt;a target="_blank" href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-SimpleClassMapping.png"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-SimpleClassMapping.png" alt="SimpleClassMapping" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.约定&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;提供了很多事件监听器，可以通过它扩展&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;。其中就是自定义约定。其实上面定义的映射从设计思想上面说也是一种约定，暂时可以称作&lt;strong&gt;特定约定(Specific-Convetions)&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;以Before开头的事件监听称作&lt;strong&gt;前置约定(Pre-Conventions)&lt;/strong&gt;。从人性化角度看&lt;strong&gt;前置约定(Pre-Conventions)&lt;/strong&gt;比较民主(democratic)，我们映射时可以使用&lt;strong&gt;特定约定(Specific-Convetions)&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;以After开头的事件监听称作&lt;strong&gt;后置约定(Post-Conventions)&lt;/strong&gt;或者称作&lt;strong&gt;Hard-Conventions&lt;/strong&gt;。从人性化角度看&lt;strong&gt;后置约定(Post-Conventions)&lt;/strong&gt;就比较共和(republican)，不管前面怎么特定，到最后一律使用&lt;strong&gt;后置约定(Post-Conventions)&lt;/strong&gt;所规定的"条约"。&lt;/p&gt;&lt;p&gt;例如下面例子使用前置约定(Pre-Conventions)：&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;MapClassWithConventions()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    &lt;span style="color:green"&gt;//option:Pre-Conventions&lt;br/&gt;    &lt;/span&gt;mapper.BeforeMapClass +=&lt;br/&gt;        (mi, t, map) =&amp;gt; map.Id(x =&amp;gt; x.Column((t.Name + &lt;span style="color:#a31515"&gt;"id"&lt;/span&gt;).ToUpper()));&lt;br/&gt;    mapper.BeforeMapProperty +=&lt;br/&gt;        (mi, propertyPath, map) =&amp;gt; map.Column(propertyPath.ToColumnName().ToUpper());&lt;br/&gt;&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt; map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow));&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something);&lt;br/&gt;    });&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;使用后置约定(Post-Conventions)：&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color:#2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public void &lt;/span&gt;MapClassWithHardConventions()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ModelMapper&lt;/span&gt;();&lt;br/&gt;    &lt;span style="color:green"&gt;//option:Hard-Conventions&lt;br/&gt;    &lt;/span&gt;mapper.AfterMapClass +=&lt;br/&gt;        (mi, t, map) =&amp;gt; map.Id(x =&amp;gt; x.Column((t.Name + &lt;span style="color:#a31515"&gt;"id"&lt;/span&gt;).ToUpper()));&lt;br/&gt;    mapper.AfterMapProperty +=&lt;br/&gt;        (mi, propertyPath, map) =&amp;gt; map.Column(propertyPath.ToColumnName().ToUpper());&lt;br/&gt;&lt;br/&gt;    mapper.Class&amp;lt;&lt;span style="color:#2b91af"&gt;MyClass&lt;/span&gt;&amp;gt;(cm =&amp;gt;&lt;br/&gt;    {&lt;br/&gt;        cm.Id(myclass =&amp;gt; myclass.Id, map =&amp;gt;&lt;br/&gt;                             {&lt;br/&gt;                                 map.Column(&lt;span style="color:#a31515"&gt;"MyClassId"&lt;/span&gt;);&lt;br/&gt;                                 map.Generator(&lt;span style="color:#2b91af"&gt;Generators&lt;/span&gt;.HighLow);&lt;br/&gt;                             });&lt;br/&gt;        cm.Property(myclass =&amp;gt; myclass.Something, map =&amp;gt; map.Column(&lt;span style="color:#a31515"&gt;"Whatever"&lt;/span&gt;));&lt;br/&gt;    });&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping = mapper.CompileMappingForAllExplicitAddedEntities();&lt;br/&gt;    hbmMapping.ShowInConsole();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;这个例子最终主键的映射的列名称为MYCLASSID，Something映射的列名称为SOMETHING。但是其思想有些不同。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="summary"&gt;结语&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NHibernate3.2新增的Mapping-By-Code(代码映射)，这篇文章结合&lt;a href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html" target="_blank"&gt;上篇&lt;/a&gt;的原理从整体大运用Mapping-By-Code(代码映射)功能，有个整体方向。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="reference"&gt;参考资料&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://fabiomaulo.blogspot.com/2011/04/nhibernate-32-mapping-by-code.html" target="_blank"&gt;NHibernate 3.2 mapping by code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://fabiomaulo.blogspot.com/2011/04/nhibernate-32-part-2-mapping-by-code.html" target="_blank"&gt;NHibernate 3.2: (part 2) mapping by code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/2011672.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-apply.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html</id><title type="text">NHibernate剖析：Mapping篇之Mapping-By-Code(1):概览</title><summary type="text">NHibernate3.2版本集成Mapping-By-Code(代码映射)，其设计思想来源于ConfORM，代码整体构思基于"Loquacious"模式，而不是"fluent-interface"。在NHibernate.Mapping.ByCode命名空间下。</summary><published>2011-04-10T07:24:00Z</published><updated>2011-04-10T07:24:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html"/><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;本节内容&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;&lt;a href="#introduction"&gt;ModelMapper概述&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#architecture"&gt;ModelMapper架构&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#summary"&gt;结语&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#reference"&gt;参考资料&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="introduction"&gt;ModelMapper概述&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NHibernate3.2版本集成Mapping-By-Code(代码映射)，其设计思想来源于&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;ConfORM&lt;/a&gt;，代码整体构思基于"Loquacious"模式，而不是"&lt;a href="http://martinfowler.com/bliki/FluentInterface.html" target="_blank"&gt;fluent-interface&lt;/a&gt;"。在NHibernate.Mapping.ByCode命名空间下。&lt;/p&gt;&lt;p&gt;Mapping-By-Code(代码映射)与其他映射方式不同，Mapping-By-Code是手动配置实体映射，编译映射并转换为&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象，调用&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;类的void AddDeserializedMapping(HbmMapping mappingDocument, string documentFileName)方法配置&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;，其他映射(例如Fluent NHibernate、MyGeneration、Visual NHibernate等)实际上是调用AddXmlReader()方法后，反序列化为&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象，然后再调用AddDeserializedMapping方法配置&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;。最后BuildSessionFactory。Mapping-Path示意图如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/nh3-mapping-path.png" target="_blank"&gt;&lt;img alt="nh3-mapping-path" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/nh3-mapping-path.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="architecture"&gt;ModelMapper架构&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ModelMapper核心是配置领域模型映射，编译并转换为&lt;span style="color:#2b91af"&gt;HbmMapping&lt;/span&gt;对象。按照其功能ModelMapper类有四个部分，分别是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;特定映射(Specific Mapper)&lt;/li&gt;&lt;li&gt;Conformist映射(Conformist Mapping)&lt;/li&gt;&lt;li&gt;事件拦截器(Events Interceptor)&lt;/li&gt;&lt;li&gt;编译映射(CompileMapping)&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;特定映射(Specific Mapper)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;特定映射(Specific Mapper)，对特定的类或者特定的某个组件设置定制化映射。由Class、Subclass、JoinedSubclass、UnionSubclass、Component方法提供。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-SpecificMapper.png" target="_blank"&gt;&lt;img alt="ModelMapper-SpecificMapper" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-SpecificMapper.png" height="161" width="750"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Conformist映射(Conformist Mapping)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Conformist映射(Conformist Mapping)是以Class-By-Class方式映射，然后加入ModelMapper类。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-AddMapping.png" target="_blank"&gt;&lt;img alt="ModelMapper-AddMapping" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-AddMapping.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;事件拦截器(Events Interceptor)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在每种映射行为前后，都定义了事件拦截器，可以通过事件拦截器定义约束。从设计角度上看是对ModelMapper类提供了扩展性。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-Events.png" target="_blank"&gt;&lt;img alt="ModelMapper-Events" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-Events.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;编译映射(CompileMapping)&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;把程序中的领域实体的映射编译并转换为NHibernate使用的HbmMapping对象。CompileMappingFor、CompileMappingForEach方法指定特定领域实体，CompileMappingForAllExplicitAddedEntities和CompileMappingForEachExplicitAddedEntity方法已经显式指定提供映射的实体。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-CompileMapping.png" target="_blank"&gt;&lt;img alt="ModelMapper-CompileMapping" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ModelMapper-CompileMapping.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="summary"&gt;结语&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这篇文章首先了解NHibernate3.2新增的Mapping-By-Code(代码映射)的原理，后续的文章以这篇文章为基础学习Mapping-By-Code各种映射。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="reference"&gt;参考资料&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://fabiomaulo.blogspot.com/2011/04/nhibernate-32-mapping-by-code.html" target="_blank"&gt;NHibernate 3.2 mapping by code&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://fabiomaulo.blogspot.com/2011/04/nhibernate-32-part-2-mapping-by-code.html" target="_blank"&gt;NHibernate 3.2: (part 2) mapping by code&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/2011454.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2011/04/10/inside-nh-mapping-by-code-introduction.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/12/15/nhibernate3-new-feature.html</id><title type="text">NHibernate 3版本新特性</title><summary type="text">2010年12月4号Fabio Maulo发布了NHibernate 3.0.0.GA正式版本，基于.Net3.5和.NET 3.5 Client Profile平台，主要改变是增加Loquacious配置和基于Lambda表达式查询和Linq查询。</summary><published>2010-12-15T01:26:00Z</published><updated>2010-12-15T01:26:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/12/15/nhibernate3-new-feature.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/12/15/nhibernate3-new-feature.html"/><content type="html">&lt;p&gt;2010年12月4号Fabio Maulo发布了NHibernate 3.0.0.GA正式版本，基于.Net3.5和.NET 3.5 Client Profile平台，主要改变是增加Loquacious配置和基于Lambda表达式查询和Linq查询。你可以到&lt;a href="http://sourceforge.net/projects/nhibernate/files/" target="_blank"&gt;这里&lt;/a&gt;下载NHibernate 3.0.0.GA。接着Fabio Maulo陆续发布了&lt;a href="http://sourceforge.net/projects/nhcontrib/files/NHibernate.Caches/3.0.0.GA_for_NH3.0.0GA/" target="_blank"&gt;NHibernate.Caches.3.0.0.GA&lt;/a&gt;、&lt;a href="http://sourceforge.net/projects/nhcontrib/files/NHibernate.Validator/1.3.0%2520Alpha1/" target="_blank"&gt;NHibernate.Validator.1.3.0.Alpha1&lt;/a&gt;、&lt;a href="http://code.google.com/p/codeconform/downloads/detail?name=ConfORM1.0.1.2_NH3GA.zip" target="_blank"&gt;ConfORM 1.0.1.2&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;下面是NHibernate 3版本新特性：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Configuration部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在Configuration部分新增两种Loquacious-Configuration方式：&lt;strong&gt;流配置(fluent-configuration)和lambda表达式配置(lambda-configuration)&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;fluent-configuration&lt;/strong&gt;顾名思义，使用Fluent API配置SessionFactory属性，提供强类型支持、编译期错误检查等。你可以通过&lt;a href="http://www.cnblogs.com/lyj/archive/2010/01/18/inside-nh3-fluent-configuration.html" target="_blank"&gt;SessionFactory fluent配置&lt;/a&gt;了解详细信息。例如使用流配置方式最小配置NHibernate：&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;configure = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;();&lt;br/&gt;configure.SessionFactory()&lt;br/&gt;    .Named(&lt;span style="color:#a31515"&gt;"Demo"&lt;/span&gt;)&lt;br/&gt;    .Proxy.Through&amp;lt;&lt;span style="color:#2b91af"&gt;ProxyFactoryFactory&lt;/span&gt;&amp;gt;()&lt;br/&gt;    .Integrate&lt;br/&gt;        .Using&amp;lt;&lt;span style="color:#2b91af"&gt;MsSql2008Dialect&lt;/span&gt;&amp;gt;()&lt;br/&gt;        .Connected&lt;br/&gt;           .Using(&lt;span style="color:#a31515"&gt;"ConnectionString"&lt;/span&gt;);&lt;p&gt;&lt;strong&gt;lambda-configuration&lt;/strong&gt;是利用C#3.0扩展方法(Extension Methods)配置SessionFactory属性。你可以通过&lt;a href="http://www.cnblogs.com/lyj/archive/2010/01/20/inside-nh3-lambda-configuration.html" target="_blank"&gt;Configuration篇之SessionFactory lambda配置&lt;/a&gt;和&lt;a href="http://www.cnblogs.com/lyj/archive/2010/01/22/inside-nh3-cache-lambda-configuration.html" target="_blank"&gt;Cache lambda-configuration配置&lt;/a&gt;了解详情。例如使用lambda表达式方式最小配置NHibernate：&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;configure = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;();&lt;br/&gt;configure.SessionFactoryName(&lt;span style="color:#a31515"&gt;"Demo"&lt;/span&gt;);&lt;br/&gt;configure.Proxy(p =&amp;gt; p.ProxyFactoryFactory&amp;lt;&lt;span style="color:#2b91af"&gt;ProxyFactoryFactory&lt;/span&gt;&amp;gt;());&lt;br/&gt;configure.DataBaseIntegration(db =&amp;gt;&lt;br/&gt;{&lt;br/&gt;    db.Dialect&amp;lt;&lt;span style="color:#2b91af"&gt;MsSql2008Dialect&lt;/span&gt;&amp;gt;();&lt;br/&gt;    db.Driver&amp;lt;&lt;span style="color:#2b91af"&gt;SqlClientDriver&lt;/span&gt;&amp;gt;();&lt;br/&gt;    db.ConnectionString = ConnectionString;&lt;br/&gt;});&lt;p&gt;新增&lt;strong&gt;WcfOperationSessionContext类&lt;/strong&gt;提供对WCF环境的支持，我们直接配置"current_session_context_class"为"wcf_operation"在WCF环境中应用NHibernate。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Mapping部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于Mapping部分，Fabio Maulo完全重构了NHibernate.Cfg.MappingSchema代码部分，提高了性能。同时为NHibernate专门设计了一个配置ORM工具——&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;ConfORM&lt;/a&gt;：解析Domain结构，按照模式适配器和自定义配置生成HbmMapping类，避免NHibernate通过读取XML映射文件反序列化等方式生成HbmMapping类的过程。不过&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;ConfORM&lt;/a&gt;不是NHibernate的一部分，需要另外单独下载。李永京在自己的博客中介绍了这个工具，可以参考&lt;a href="http://www.cnblogs.com/lyj/archive/2010/04/21/inside-nh3-conform-introduction.html" target="_blank"&gt;ConfORM概览&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/09/inside-nh3-conform-theory.html" target="_blank"&gt;原理&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/10/inside-nh3-conform-onetoone.html" target="_blank"&gt;OneToOne语义&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/26/inside-nh3-conform-manytomany.html" target="_blank"&gt;ManyToMany语义&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/10/03/inside-nh3-conform-component.html" target="_blank"&gt;Component语义&lt;/a&gt;。我们可以这样使用：&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;orm = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ObjectRelationalMapper&lt;/span&gt;();&lt;br/&gt;orm.TablePerClass&amp;lt;&lt;span style="color:#2b91af"&gt;Domain&lt;/span&gt;&amp;gt;();&lt;br/&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Mapper&lt;/span&gt;(orm);&lt;br/&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;hbmMapping= mapper.CompileMappingFor(&lt;span style="color:blue"&gt;new&lt;/span&gt;[] { &lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Domain&lt;/span&gt;) });&lt;p&gt;在Configuration类中新增了&lt;strong&gt;AddDeserializedMapping&lt;/strong&gt;(HbmMapping mappingDocument, string documentFileName)方法，可以直接解析HbmMapping，这样选择不使用xml文件而是ConfORM。例如上面使用ConfORM生成的hbmMapping我们加到Configuration中：&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;conf=&lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Configuration&lt;/span&gt;();&lt;br/&gt;&lt;span style="color:green"&gt;//...&lt;br/&gt;&lt;/span&gt;conf.AddDeserializedMapping(hbmMapping, &lt;span style="color:#a31515"&gt;"Domain"&lt;/span&gt;);&lt;br/&gt;&lt;p&gt;&lt;strong&gt;Query部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在NHibernate 3.0.0版本中，Query方式新增了&lt;strong&gt;Linq支持和强类型查询API(QueryOver)&lt;/strong&gt;两种查询方式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;QueryOver&lt;/strong&gt;是Lambda表达式方式的条件(Criteria)查询，可读性强且支持property-renaming特性。可以参考&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2009/12/17/queryover-in-nh-3-0.aspx" target="_blank"&gt;QueryOver in NH 3.0&lt;/a&gt;。例如下面查询Name为李永京、按照Age降序的Person集合：&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;query = s.QueryOver&amp;lt;&lt;span style="color:#2b91af"&gt;Person&lt;/span&gt;&amp;gt;()&lt;br/&gt;    .Where(p =&amp;gt; p.Name == &lt;span style="color:#a31515"&gt;"李永京"&lt;/span&gt;)&lt;br/&gt;    .OrderBy(p =&amp;gt; p.Age).Asc&lt;br/&gt;    .List();&lt;br/&gt;&lt;p&gt;&lt;strong&gt;Linq&lt;/strong&gt;基于HQL AST分析器的Linq Provider实现，由&lt;a href="http://blogs.imeta.co.uk/sstrong/" target="_blank"&gt;Steve Strong&lt;/a&gt;贡献者开发的，底层使用第三方&lt;a href="https://www.re-motion.org/" target="_blank"&gt;Re-Linq&lt;/a&gt;开源框架。不过NHibernate3.0.0版本提供的Linq查询还处于Bate阶段，Fabio Maulo准备发布3.1版本修复Linq查询BUG。可以参考：&lt;a href="http://www.cnblogs.com/lyj/archive/2010/08/09/inside-nh3-linq-basic-query.html" target="_blank"&gt;NHibernate.Linq标准查询&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/08/10/inside-nh3-linq-append-query.html" target="_blank"&gt;增强查询&lt;/a&gt;、&lt;a href="http://www.cnblogs.com/lyj/archive/2010/08/11/inside-nh3-linq-extension-query.html" target="_blank"&gt;自定义扩展&lt;/a&gt;。我们使用ISession接口的Query&amp;lt;T&amp;gt;()扩展方法创建一个NHibernate.Linq查询。&lt;/p&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;query = session.Query&amp;lt;&lt;span style="color:#2b91af"&gt;Person&lt;/span&gt;&amp;gt;().Where(o =&amp;gt; o.Name == &lt;span style="color:#a31515"&gt;"李永京"&lt;/span&gt;).ToList();&lt;p&gt;&lt;strong&gt;其他&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;还有其他一些新特性：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;重构Logging Abstraction&lt;/strong&gt;日志系统模块：移除对log4net.dll程序集依赖，现在可以用CommonLogging或者NLog日志系统。可以参考&lt;a href="http://nhforge.org/wikis/howtonh/using-nlog-via-common-logging-with-nhibernate.aspx" target="_blank"&gt;Using NLog via Common.Logging with NHibernate&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;属性延迟加载和No Proxy关联&lt;/strong&gt;特性：具体使用方法可以参考Ayende的&lt;a href="http://ayende.com/Blog/archive/2010/01/27/nhibernate-new-feature-lazy-properties.aspx" target="_blank"&gt;NHibernate new feature: Lazy Properties&lt;/a&gt;和&lt;a href="http://ayende.com/Blog/archive/2010/01/28/nhibernate-new-feature-no-proxy-associations.aspx" target="_blank"&gt;NHibernate new feature: No proxy associations&lt;/a&gt;两篇博文。它仅支持Castle的bytecode-providers，不支持Spring.Net和LinFu代理。&lt;/p&gt;&lt;p&gt;映射支持XDocument、System.Uri、XmlDoc、Local &amp;amp; Utc DateTime类型。&lt;/p&gt;&lt;p&gt;bytecode-providers程序集更新：Castle使用2010年11月15号发布的2.5.2正式版本，即Castle.Core.dll程序集。LiuFu使用2010年4月5号发布的1.04版本，即LinFu.DynamicProxy.dll程序集。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;改变&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果从NHibernate2.1.2版本升级到NHibernate3.0.0版本，需要注意下面改变：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;NHibernate3.0.0版本不支持.Net3.5以下版本，即.Net2.0版本不可以升级到NHibernate3.0.0版本。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-2392" target="_blank"&gt;[NH-2392]&lt;/a&gt;ICompositeUserType.NullSafeSet方法签名改变。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-2199" target="_blank"&gt;[NH-2199]&lt;/a&gt;maps/dictionaries中null值不再不加提示地忽略/删除。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-1894" target="_blank"&gt;[NH-1894]&lt;/a&gt;SybaseAnywhereDialect删除，代之以SybaseASA9Dialect。删除了Sybase Adaptive Server Enterprise (ASE)方言。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-2251" target="_blank"&gt;[NH-2251]&lt;/a&gt;Dialect中的GetLimitString签名变化。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-2284" target="_blank"&gt;[NH-2284]&lt;/a&gt;删除了过时的成员。&lt;/li&gt;&lt;li&gt;&lt;a href="http://216.121.112.228/browse/NH-2358" target="_blank"&gt;[NH-2358]&lt;/a&gt;DateTimeOffset类型现在不再是DateTime的替代。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;实用工具&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最近一年，网络上出现了一些优秀的NHibernate工具：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://hqladdin.codeplex.com/" target="_blank"&gt;HQL Language Service for Visual Studio&lt;/a&gt;：为我们编写HQL查询提供了智能提示和语法验证检查功能。&lt;/li&gt;&lt;li&gt;&lt;a href="http://nhprof.com/" target="_blank"&gt;NHibernate Profile&lt;/a&gt;：可视化NHibernate性能检测优化工具。&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.slyce.com/" target="_blank"&gt;Visual NHibernate&lt;/a&gt;：可视化设计和映射工具。&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mindscape.co.nz/products/nhdesigner" target="_blank"&gt;Mindscape NHibernate Designer&lt;/a&gt;：VS设计工具，类似于EF设计器。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;其中HQL Language Service for Visual Studio是一款开源工具，其他都是商业版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;未来发展&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;据我了解的情况来看，将来的版本发布预计一两个月后会发布3.1版本，然后就升级至.Net4平台开发NHibernate 4版本，主要就是逐步改写内部代码去掉Iesi.Collections.dll，使用.Net4提供的ISet集合和添加一些新功能，比如&lt;a href="http://fabiomaulo.blogspot.com/2010/06/duck-typing-with-nhibernate-reloaded.html" target="_blank"&gt;Duck Typing&lt;/a&gt;(鸭子类型)等。另外NHibernate源码将迁移到CodePlex网站，使用Hg版本控制。&lt;/p&gt;&lt;p&gt;第一次在&lt;a href="http://www.infoq.com/cn/" target="_blank"&gt;InfoQ网站&lt;/a&gt;上发表，链接地址：&lt;a href="http://www.infoq.com/cn/news/2010/12/nhibernate3" target="_blank"&gt;NHibernate 3版本新特性&lt;/a&gt;。感谢&lt;a href="http://www.cnblogs.com/allenlooplee/" target="_blank"&gt;Allen Lee&lt;/a&gt;对本文的审校。&lt;/p&gt;&lt;p&gt;希望本文对你有所帮助。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1906298.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/12/15/nhibernate3-new-feature.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/12/05/nhibernate-30-released.html</id><title type="text">NHibernate 3.0.0.GA正式发布了</title><summary type="text">2010年12月4号Fabio Maulo发布了NHibernate 3.0.0.GA正式版本。</summary><published>2010-12-05T04:47:00Z</published><updated>2010-12-05T04:47:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/12/05/nhibernate-30-released.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/12/05/nhibernate-30-released.html"/><content type="html">&lt;p&gt;&lt;strong&gt;发布&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;2010年12月4号Fabio Maulo发布了NHibernate 3.0.0.GA正式版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;下载地址&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;你可以到&lt;a href="http://sourceforge.net/projects/nhibernate/files/" target="_blank"&gt;这里&lt;/a&gt;下载NHibernate 3.0.0.GA，基于.Net3.5平台，具体文件如下。 &lt;/p&gt;&lt;ul&gt;&lt;li&gt;NHibernate二进制文件：NHibernate-3.0.0.GA-bin.zip&lt;/li&gt;&lt;li&gt;NHibernate参考文档：NHibernate-3.0.0.GA-reference.zip&lt;/li&gt;&lt;li&gt;NHibernate源码：NHibernate-3.0.0.GA-src.zip&lt;/li&gt; &lt;/ul&gt;&lt;p&gt;&lt;strong&gt;特性介绍&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NHibernate 3.0.0版本历经Alpha1、Alpha2、Alpha3、Beta1、Beta2、RC版本，修复了200多个BUG，增加了很多新特性。下面我自己归类总结一下这些新特性吧。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;程序集部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新的日志系统模块Logging Abstraction，移除对log4net.dll程序集依赖，现在可以用CommonLogging或者NLog。&lt;/p&gt;&lt;p&gt;Castle的bytecode-providers：使用2010年11月15号发布的2.5.2正式版本，即Castle.Core.dll程序集。&lt;/p&gt;&lt;p&gt;NHibernate 3.0.0版本现在支持.NET 3.5 Client Profile平台。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Configuration部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;新增两种方式&lt;strong&gt;流配置(fluent-configuration)和lambda表达式配置(lambda-configuration)&lt;/strong&gt;配置SessionFactory。&lt;/p&gt;&lt;p&gt;新增对WCF的支持，提供&lt;strong&gt;WcfOperationSessionContext&lt;/strong&gt;，我们可以直接配置"current_session_context_class"为"wcf_operation"，直接在WCF中应用NHibernate。&lt;/p&gt;&lt;p&gt;在Configuration类中新增了&lt;strong&gt;AddDeserializedMapping&lt;/strong&gt;(HbmMapping mappingDocument, string documentFileName)方法，可以直接解析HbmMapping，我们可以选择不使用xml文件Mapping。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Mapping部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo完全重构了NHibernate.Cfg.MappingSchema部分，提高了性能，另外Fabio Maulo设计了一个配置ORM工具——&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;ConfOrm&lt;/a&gt;，解析Domain结构，按照模式适配器转换成HbmMapping类。当然了，&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;ConfOrm&lt;/a&gt;不是NHibernate的一部分，我们需要另外单独下载。这个工具介绍，参考下面分享。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Query部分&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在NHibernate 3.0.0版本中，新增了&lt;strong&gt;Linq Provider和strongly typed query API (QueryOver)&lt;/strong&gt;两种查询方式。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;QueryOver&lt;/strong&gt;是Lambda表达式方式的条件(Criteria)查询，可读性强且支持property-renaming特性。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Linq&lt;/strong&gt;是由Steve Strong贡献者开发的，完全基于AST的Linq Provider实现。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;其他&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;除了上面可以归类的新特性，还提供了很多新特性：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;属性延迟加载和No Proxy关联&lt;/strong&gt;特性：它仅支持Castle的bytecode-providers，不支持Spring.Net和LinFu。&lt;/p&gt;&lt;p&gt;内置hbm2ddl工具。&lt;/p&gt;&lt;p&gt;映射支持XDocument、System.Uri、XmlDoc、Local &amp;amp; Utc DateTime类型。&lt;/p&gt;&lt;p&gt;新增SQL Anywhere方言。&lt;/p&gt;&lt;p&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;&lt;/p&gt;&lt;p&gt;&lt;a href="http://nhforge.org/" target="_blank"&gt;NHibernate官方站点&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://nhforge.org/doc/nh/en/" target="_blank"&gt;NHibernate在线参考文档&lt;/a&gt;：已经更新至NHibernate 3.0.0版本，具体修改了一些错误和增加了QueryOver章节。&lt;/p&gt;&lt;p&gt;&lt;a href="http://kb.cnblogs.com/zt/nhibernate/" target="_blank"&gt;博客园NHibernate专题&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/tag/NHibernate/" target="_blank"&gt;NHibernate3剖析系列文章&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/tag/ConfORM/" target="_blank"&gt;ConfORM实战系列文章&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/10/11/nhibernate-3-0-cookbook.html" target="_blank"&gt;NHibernate新书：NHibernate 3.0 CookBook&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;工具&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://hqladdin.codeplex.com/" target="_blank"&gt;HQL Language Service for Visual Studio&lt;/a&gt;：为我们编写HQL查询提供了智能提示和语法验证检查功能。&lt;/p&gt;&lt;p&gt;&lt;a href="http://nhprof.com/" target="_blank"&gt;NHibernate Profile&lt;/a&gt;：可视化NHibernate性能检测优化工具。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.slyce.com/" target="_blank"&gt;Visual NHibernate&lt;/a&gt;：可视化设计和映射工具。&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.mindscape.co.nz/products/nhdesigner" target="_blank"&gt;Mindscape NHibernate Designer&lt;/a&gt;：VS设计工具，类似于EF设计器。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;未来&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;据我了解的情况来看，将来的版本发布预计一两个月后会发布3.0.1版本，然后就升级至.Net4平台开发NHibernate 4版本，主要就是逐步改写内部代码去掉Iesi.Collections.dll，使用.Net4提供的ISet集合和添加一些新功能，比如&lt;a href="http://fabiomaulo.blogspot.com/2010/06/duck-typing-with-nhibernate-reloaded.html" target="_blank"&gt;Duck Typing&lt;/a&gt;等。&lt;/p&gt;&lt;p&gt;还有NHibernate源码将迁移到CodePlex网站，使用Hg版本控制。&lt;/p&gt;&lt;p&gt;希望本文对你有所帮助。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1896839.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/12/05/nhibernate-30-released.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/11/17/hello-azure-appfabric.html</id><title type="text">Windows Azure Platform体验(3)：Azure AppFabric</title><summary type="text">使用AppFabric，可以轻松将内部部署应用程序与云连接。通过在内部部署的IT应用程序和基于云的服务之间启用安全连接和消息传送，AppFabric提供标识管理和防火墙友好的消息传送，从而保护您的资产。</summary><published>2010-11-17T00:51:00Z</published><updated>2010-11-17T00:51:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/11/17/hello-azure-appfabric.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/11/17/hello-azure-appfabric.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.azure.com/" target="_blank"&gt;Windows Azure Platform&lt;/a&gt;有Windows Azure、SQL Azure、Azure AppFabric三部分。&lt;/p&gt;&lt;p&gt;使用AppFabric，可以轻松将内部部署应用程序与云连接。通过在内部部署的IT应用程序和基于云的服务之间启用安全连接和消息传送，AppFabric提供标识管理和防火墙友好的消息传送，从而保护您的资产。&lt;/p&gt;&lt;p&gt;这节我们体验Azure AppFabric，必备软件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Microsoft Visual Studio 2010&lt;/li&gt;&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=129448" target="_blank"&gt;Windows Azure AppFabric SDK&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Windows Azure Platform账户&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这次体验有下面几个步骤，分别是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#appfabric"&gt;创建AppFabric项目&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#appfabricservicebus"&gt;体验AppFabric Service Bus&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="appfabric"&gt;创建AppFabric项目&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;AppFabirc由Service Bus和Access Control Service组成，为了使用这些功能和特性，我们必须创建一个Service Project。&lt;/p&gt;&lt;p&gt;首先我们使用账号登录Azure AppFabric门户，网址为&lt;a href="http://appfabric.azure.com" target="_blank"&gt;http://appfabric.azure.com&lt;/a&gt;，你可以看到下面页面，当前没有创建任何服务空间，我们需要添加一个服务空间。服务空间为暴露于Service Bus的应用程序定义了应用程序边界，以及用来为应用程序构建Service Bus端点。我们点击“Add Service Namespace”:&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/1.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/1.png" height="284" width="701"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;进入创建服务空间页面，输入服务空间名称、选择区域，选择服务总线连接包，可选0、5、25、100、500连接数。然后点击“Create”按钮：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/2.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/2.png" height="569" width="701"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;激活服务时请耐心等待，可能需要数分钟时间。一旦命名空间被激活，便出现在可用服务空间列表上。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/3.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/3.png" height="317" width="699"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们可以在可用服务空间列表上点击刚刚创建的服务空间，显示服务空间信息页面：在服务命名空间信息页面，我们需要记录下Default Issuer Name和Default Issuer Key。接下来会使用到它们。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/4.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/4.png" height="751" width="703"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="appfabricservicebus"&gt;体验AppFabric Service Bus&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这个示例演示了Client向Service发送消息，Service以相同的消息进行回应。展示了Service Bus如何在不同网络环境中的不同程序进行通信。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;原理&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们首先了解这个程序的运作原理：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/5.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/5.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;步骤1,2,4,5是利用AppFabric中的Access Control服务用来确保安全性。&lt;/p&gt;&lt;p&gt;步骤3是服务器程序与云端建立连接的过程。步骤6,7,8,9是客户端调用服务的过程。&lt;/p&gt;&lt;p&gt;Service Bus通过为服务提供了一套通用的命名规范简化了许多通信难题，在独立于网络拓扑和配置的节点之间提供直接或间接的通信。Service Bus允许WCF应用程序监听公共网络地址，即使其位于NAT或网络防火墙后方。该功能使得应用程序的通信可以无关于其网络结构。使用Service Bus便无需编写与维护复杂的逻辑和代码来跨越不同的网络通信。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;代码 &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们创建一个WCF服务和一个客户端，两者通过云端的Service Bus交互。解决方案项目结构如下：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/6.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/6.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;注意，都需要引用System.ServiceModel.dll和Microsoft.ServiceBus.dll程序集。前者为WCF的核心程序集之一。后者在%ProgramFiles%\Windows Azure AppFabric SDK\V1.0\Assemblies\NET4.0中。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;服务器端：&lt;/strong&gt;&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:green"&gt;//WCF的服务契约&lt;/span&gt;&lt;br/&gt;[&lt;span style="color:#2b91af"&gt;ServiceContract&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af"&gt;IAppFabricServiceBusContract&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:green"&gt;//定义了Hello操作契约，指明该方法为服务契约的一部分&lt;/span&gt;&lt;br/&gt;    [&lt;span style="color:#2b91af"&gt;OperationContract&lt;/span&gt;]&lt;br/&gt;    &lt;span style="color:blue"&gt;string &lt;/span&gt;Hello(&lt;span style="color:blue"&gt;string &lt;/span&gt;text);&lt;br/&gt;}&lt;br/&gt;&lt;span style="color:green"&gt;//实现WCF的服务契约&lt;/span&gt;&lt;br/&gt;[&lt;span style="color:#2b91af"&gt;ServiceBehavior&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;AppFabricServiceBusService &lt;/span&gt;: &lt;span style="color:#2b91af"&gt;IAppFabricServiceBusContract&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;Hello(&lt;span style="color:blue"&gt;string &lt;/span&gt;text)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"客户端请求: {0}"&lt;/span&gt;, text);&lt;br/&gt;        &lt;span style="color:blue"&gt;return &lt;/span&gt;text;&lt;br/&gt;    }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;配置WCF服务&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515"&gt;xml &lt;/span&gt;&lt;span style="color:red"&gt;version&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;" &lt;span style="color:red"&gt;encoding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;utf-8&lt;/span&gt;" &lt;span style="color:blue"&gt;?&amp;gt;&lt;br/&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;services&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;service &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;HelloAppFabricServiceBus.Service.AppFabricServiceBusService&lt;/span&gt;"&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;        &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;endpoint &lt;/span&gt;&lt;span style="color:red"&gt;binding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;netTcpRelayBinding&lt;/span&gt;"&lt;br/&gt;             &lt;span style="color:red"&gt;contract&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;HelloAppFabricServiceBus.Service.IAppFabricServiceBusContract&lt;/span&gt;" &lt;span style="color:blue"&gt;/&amp;gt;&lt;br/&gt;      &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;service&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;services&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;主方法&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:green"&gt;//通过AppFabric Service Bus来托管服务&lt;/span&gt;&lt;br/&gt;&lt;span style="color:blue"&gt;static void &lt;/span&gt;Main()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:green"&gt;//基于服务命名空间来创建服务URI&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;address = &lt;span style="color:#2b91af"&gt;ServiceBusEnvironment&lt;/span&gt;.CreateServiceUri(&lt;span style="color:#a31515"&gt;"sb"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"[Service Namespace]"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;&lt;br/&gt;                                "AppFabricServiceBusService"&lt;/span&gt;);&lt;br/&gt;    &lt;span style="color:green"&gt;//为端点(endpoint)创建凭据对象(credential object)&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;sharedSecretServiceBusCredential = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;TransportClientEndpointBehavior&lt;br/&gt;                &lt;/span&gt;{&lt;br/&gt;                  CredentialType = &lt;span style="color:#2b91af"&gt;TransportClientCredentialType&lt;/span&gt;.SharedSecret&lt;br/&gt;                };&lt;br/&gt;    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = &lt;span style="color:#a31515"&gt;"[Issuer Name]"&lt;/span&gt;;&lt;br/&gt;    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = &lt;span style="color:#a31515"&gt;"[Issuer Key]"&lt;/span&gt;;&lt;br/&gt;    &lt;span style="color:green"&gt;//创建会读取配置文件的服务宿主(service host)&lt;br/&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;host = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ServiceHost&lt;/span&gt;(&lt;span style="color:blue"&gt;typeof&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;AppFabricServiceBusService&lt;/span&gt;), address);&lt;br/&gt;    &lt;span style="color:green"&gt;//为端点创建ServiceRegistrySettings行为&lt;br/&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;var &lt;/span&gt;serviceRegistrySettings = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ServiceRegistrySettings&lt;/span&gt;(&lt;span style="color:#2b91af"&gt;DiscoveryType&lt;/span&gt;.Public);&lt;br/&gt;    &lt;span style="color:green"&gt;//为配置文件中所有端点加入Service Bus凭据&lt;br/&gt;    &lt;/span&gt;&lt;span style="color:blue"&gt;foreach &lt;/span&gt;(&lt;span style="color:blue"&gt;var &lt;/span&gt;endpoint &lt;span style="color:blue"&gt;in &lt;/span&gt;host.Description.Endpoints)&lt;br/&gt;    {&lt;br/&gt;        endpoint.Behaviors.Add(serviceRegistrySettings);&lt;br/&gt;        endpoint.Behaviors.Add(sharedSecretServiceBusCredential);&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color:green"&gt;//打开服务&lt;/span&gt;&lt;br/&gt;    host.Open();&lt;br/&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"服务地址: " &lt;/span&gt;+ address);&lt;br/&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"按[Enter]键关闭宿主服务"&lt;/span&gt;);&lt;br/&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine();&lt;br/&gt;    &lt;span style="color:green"&gt;//关闭服务&lt;/span&gt;&lt;br/&gt;    host.Close();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;客户端：&lt;/strong&gt;&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:green"&gt;//WCF的服务契约&lt;/span&gt;&lt;br/&gt;[&lt;span style="color:#2b91af"&gt;ServiceContract&lt;/span&gt;]&lt;br/&gt;&lt;span style="color:blue"&gt;public interface &lt;/span&gt;&lt;span style="color:#2b91af"&gt;IAppFabricServiceBusContract&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    [&lt;span style="color:#2b91af"&gt;OperationContract&lt;/span&gt;]&lt;br/&gt;    &lt;span style="color:blue"&gt;string &lt;/span&gt;Hello(&lt;span style="color:blue"&gt;string &lt;/span&gt;text);&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;配置&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;&amp;lt;?&lt;/span&gt;&lt;span style="color:#a31515"&gt;xml &lt;/span&gt;&lt;span style="color:red"&gt;version&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;1.0&lt;/span&gt;"&lt;span style="color:blue"&gt;?&amp;gt;&lt;br/&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;  &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;    &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;client&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;      &amp;lt;&lt;/span&gt;&lt;span style="color:#a31515"&gt;endpoint &lt;/span&gt;&lt;span style="color:red"&gt;name&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;RelayEndpoint&lt;/span&gt;"&lt;br/&gt;          &lt;span style="color:red"&gt;  contract&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;HelloAppFabricServiceBus.Client.IAppFabricServiceBusContract&lt;/span&gt;"&lt;br/&gt;           &lt;span style="color:red"&gt; binding&lt;/span&gt;&lt;span style="color:blue"&gt;=&lt;/span&gt;"&lt;span style="color:blue"&gt;netTcpRelayBinding&lt;/span&gt;"&lt;span style="color:blue"&gt;/&amp;gt;&lt;br/&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;client&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;system.serviceModel&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;br/&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#a31515"&gt;configuration&lt;/span&gt;&lt;span style="color:blue"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;主方法&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:green"&gt;//使用通过AppFabric Service Bus托管的WCF服务&lt;/span&gt;&lt;br/&gt;&lt;span style="color:blue"&gt;static void &lt;/span&gt;Main()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color:green"&gt;//基于服务命名空间来创建服务URI&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;serviceUri = &lt;span style="color:#2b91af"&gt;ServiceBusEnvironment&lt;/span&gt;.CreateServiceUri(&lt;span style="color:#a31515"&gt;"sb"&lt;/span&gt;, &lt;span style="color:#a31515"&gt;"[Service Namespace]"&lt;/span&gt;,&lt;br/&gt;                                  &lt;span style="color:#a31515"&gt;"AppFabricServiceBusService"&lt;/span&gt;);&lt;br/&gt;    &lt;span style="color:green"&gt;//为端点(endpoint)创建凭据对象(credential object)&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;sharedSecretServiceBusCredential = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;TransportClientEndpointBehavior&lt;br/&gt;            &lt;/span&gt;{&lt;br/&gt;                CredentialType = &lt;span style="color:#2b91af"&gt;TransportClientCredentialType&lt;/span&gt;.SharedSecret&lt;br/&gt;            };&lt;br/&gt;    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = &lt;span style="color:#a31515"&gt;"[Issuer Name]"&lt;/span&gt;;&lt;br/&gt;    sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = &lt;span style="color:#a31515"&gt;"[Issuer Key]"&lt;/span&gt;;&lt;br/&gt;    &lt;span style="color:green"&gt;//创建读取配置文件的信道工厂(channel factory)&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;channelFactory = &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ChannelFactory&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;IAppFabricServiceBusContract&lt;/span&gt;&amp;gt;(&lt;span style="color:#a31515"&gt;"RelayEndpoint"&lt;/span&gt;,&lt;br/&gt;                             &lt;span style="color:blue"&gt;new &lt;/span&gt;&lt;span style="color:#2b91af"&gt;EndpointAddress&lt;/span&gt;(serviceUri));&lt;br/&gt;    &lt;span style="color:green"&gt;//应用Service Bus凭证&lt;/span&gt;&lt;br/&gt;    channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential);&lt;br/&gt;    &lt;span style="color:green"&gt;//创建并打开客户端信道&lt;/span&gt;&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;channel = channelFactory.CreateChannel();&lt;br/&gt;    ((&lt;span style="color:#2b91af"&gt;ICommunicationObject&lt;/span&gt;)channel).Open();&lt;br/&gt;    &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"输入文字(或者按[Enter]键关闭连接):"&lt;/span&gt;);&lt;br/&gt;    &lt;span style="color:blue"&gt;var &lt;/span&gt;input = &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine();&lt;br/&gt;    &lt;span style="color:blue"&gt;while &lt;/span&gt;(input != &lt;span style="color:#2b91af"&gt;String&lt;/span&gt;.Empty)&lt;br/&gt;    {&lt;br/&gt;        &lt;span style="color:blue"&gt;try&lt;br/&gt;        &lt;/span&gt;{&lt;br/&gt;            &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"服务器返回: {0}"&lt;/span&gt;, channel.Hello(input));&lt;br/&gt;        }&lt;br/&gt;        &lt;span style="color:blue"&gt;catch &lt;/span&gt;(&lt;span style="color:#2b91af"&gt;Exception &lt;/span&gt;e)&lt;br/&gt;        {&lt;br/&gt;            &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color:#a31515"&gt;"错误: " &lt;/span&gt;+ e.Message);&lt;br/&gt;        }&lt;br/&gt;        input = &lt;span style="color:#2b91af"&gt;Console&lt;/span&gt;.ReadLine();&lt;br/&gt;    }&lt;br/&gt;    ((&lt;span style="color:#2b91af"&gt;ICommunicationObject&lt;/span&gt;)channel).Close();&lt;br/&gt;    channelFactory.Close();&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;测试&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;注意你需要将Service Namespace，Issuer Name和Issuer Key替换你的，这些都是基于Azure付费账户。 &lt;/p&gt;&lt;p&gt;先启动Service，在启动两个Client，测试，我们可以看到它们之间的交互了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/7.png" target="_blank"&gt;&lt;img alt="Azure AppFabric" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloAppFabric/7.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;好了，Windows Azure Platform的三部分我们稍微体验了一番，以后有机会在说说更深入的内容。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1879502.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/11/17/hello-azure-appfabric.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/11/16/hello-sql-azure.html</id><title type="text">Windows Azure Platform体验(2)：SQL Azure</title><summary type="text">Windows Azure Platform有Windows Azure、SQL Azure、Azure AppFabric三部分。SQL Azure是云关系数据库。您的数据：随时随地管理。SQL Azure是云中的完全关系数据库。</summary><published>2010-11-16T01:07:00Z</published><updated>2010-11-16T01:07:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/11/16/hello-sql-azure.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/11/16/hello-sql-azure.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.azure.com/" target="_blank"&gt;Windows Azure Platform&lt;/a&gt;有Windows Azure、SQL Azure、Azure AppFabric三部分。&lt;/p&gt;&lt;p&gt;SQL Azure是云关系数据库。您的数据：随时随地管理。SQL Azure是云中的完全关系数据库。&lt;/p&gt;&lt;p&gt;这节我们体验SQL Azure，必备软件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Microsoft SQL Server 2008 R2&lt;/li&gt;&lt;li&gt;Windows Azure Platform账户&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这次体验有下面几个步骤，分别是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#SQLAzurePreparingYourAccount"&gt;初始化SQL Azure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SQLAzureConnectingTo"&gt;连接到SQL Azure&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SQLAzureManagingLoginsAndSecurity"&gt;配置SQL Azure数据库安全&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#SQLAzureCreatingObjects"&gt;在SQL Azure中创建数据库对象&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="SQLAzurePreparingYourAccount"&gt;初始化SQL Azure&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先我们使用账号登录SQL Azure门户，网址为&lt;a href="http://sql.azure.com" target="_blank"&gt;http://sql.azure.com&lt;/a&gt;，你可以看到下面页面。我们点击项目名称。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/1.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/1.png" height="350" width="721"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出现使用条款页面。阅读后，如果同意接受这些条款，单击“I accept”(我接受)，开始使用实际的SQL Azure数据库。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/2.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/2.png" height="290" width="717"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出现创建服务器页面。我们首先创建一台实际的服务器。就服务器种类而言，通常我们熟悉的服务器可能是物理服务器或虚拟服务器，这里，我们创建一个虚拟服务器，即SQL Azure服务器。也就是说它是通过逻辑方式组合到一起的数据库组合，而不是通过物理方式组合起来的。指定管理员用户名密码和实际要在哪个SQL Azure数据中心创建这台服务器的数据库组。如果在中国大陆，则可以选择东亚。我选择“东亚”的数据中心，点击创建服务器。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/3.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/3.png" height="318" width="710"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;当我完成后，出现服务器详细信息页面，这个页面显示了登录到这台服务器的详细信息和已有的数据库以及防火墙配置。页面的顶部提供了唯一的ID和“.database.windows.net”的组合是服务器地址。页面的底部，我们可以看到所有已经创建的数据库。现在只有用来存储其他数据库记录的默认SQL主数据库，我们还没有创建任何数据库。接下来我创建的所有数据库都在这个服务器账户中。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/4.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/4.png" height="474" width="712"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;点击“Create Database”创建一个数据库，出现下面页面，这里我将其命名为“lyjDB”，选择版本类型和数据库大小。这些是由你购买的的选择决定，Web版本有1G和5G两个容量，Business版本有10G、20G、30G、40G、50G的大容量。由于这个账户没有限制，我选择最小的配置体验下。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/5.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/5.png" height="248" width="709"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;创建完之后，我们可以点击“Connection Strings”连接字符串。SQL Azure为我们提供了两种数据库连接：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/6.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/6.png" height="221" width="703"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们单击底部的“Test Connectivity”(测试连接)按钮，输入用户名和密码，点击连接，提示下面错误提示框。因为在默认情况下，SQL Azure安全设置不允许任何计算机、服务器或者客户端连接到SQL Azure。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/7.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/7.png" height="315" width="698"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这时我们点击“Firewall Settings”(防火墙设置)选项卡。&lt;/p&gt;&lt;p&gt;你会发现SQL Azure安全设置默认不允许Microsoft服务都无法连接到这个服务器或者数据库，这时我选择“Allow Microsoft Services access to this service”(允许Microsoft服务访问这台服务器)复选框允许连接。这时网站会刷新，并且为我创建一条新的规则，出现一个特定MicrosoftServices条目，允许Microsoft服务本身进行连接，这样我们就可以进行连接了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/8.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/8.png" height="489" width="696"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;返回“Databases”(数据库)选项卡，单击底部的“Test Connectivity”(测试连接)按钮，输入用户名和密码，然后就可以启动测试连接，并看到连接成功。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/9.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/9.png" height="297" width="694"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="SQLAzureConnectingTo"&gt;连接到SQL Azure&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.防火墙设置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;打开SQL Server Management Studio R2，用指定的用户名和密码进行登录，连接到这台服务器。注意必须使用R2版本才能连接到云中的SQL Azure数据库。不过登录到SQL Azure与登录内部部署SQL数据库方式的登录名的约定略有不同。除了需要指定用户名还需要加上“@”符号，然后是服务器名称的唯一的ID的部分。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/10.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/10.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;单击“连接”按钮，我们尝试进行连接。出现下面对话框提示连接失败，原因是因为在默认情况下，SQL Azure安全设置不允许任何计算机、服务器或者客户端连接到SQL Azure。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/11.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/11.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们需要配置防火墙，返回门户，并转到“Firewall Settings”(防火墙设置)选项卡，配置防火墙规则设置为允许特定连接通过，为我的本地创建一条规则。这样，我们就可以在本地通过SQL Server Management Studio R2进行实际连接了。输入规则名称和IP地址或者IP范围。系统已经识别了我正在连接的IP地址。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/12.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/12.png" height="338" width="707"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;创建完成之后，在防火墙规则中出现新增了一条规则。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/13.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/13.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.与SQL Azure交互&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;切换到SQL Server Management Studio R2尝试再次连接，这一次一切都设置好了，现在成功实现连接，它连接了实际的SQL Azure实例。请注意，这台服务器的图标略有不同。它显示的是一个小小的蓝色数据库符号，表示这是一个Azure连接，而不是一个标准的内部部署SQL服务器连接。进入数据库组，你会看到我们刚刚创建的lyjDB数据库。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/14.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/14.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我现在可以通过SQL Server Management Studio R2和SQL Azure数据库进行交互，方式与使用内部部署数据库方式非常像，也就是我在Management Studio R2中的惯用方式。但是，设计体验略微有些不同，这是因为我们使用的是基于云的数据库。因此，它只具备SQL Server 2008的部分功能，例如，我们无法获得拖放式设计图面。大多数是使用实际的SQL脚本语言来指定表的架构。&lt;/p&gt;&lt;p&gt;在数据库上右击并执行常规的脚本操作，比如Select命令。执行这个命令，并在底部查看显示的结果，与我们使用内部部署数据库非常类似。因此，对于那些标准操作，这与我所习惯的使用和执行方式非常类似。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.连接到master数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们执行“SELECT @@version”查询，查看SQL Azure的版本。可以看到它返回一个信息：SQL Azure由Microsoft SQL Server 2008派生的。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/15.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/15.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们使用master数据库查询sys.databases视图，我们能够看到我们的服务器上创建的所有数据库。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/16.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/16.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.创建一个新数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们使用Management Studio R2在SQL Azure中创建一个新数据库。这一步非常简单。在SQL Azure中，我们使用简单的创建数据库执行语句，将立即创建一个新的数据库。 &lt;/p&gt;&lt;p&gt;执行“CREATE DATABASE yjingleeDB”&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/17.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/17.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;再次查询服务器上数据库，注意我们刚刚创建的yjingleeDB数据库在这个列表中了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/18.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/18.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5.连接到新数据库&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;为了连接到新的数据库，我们必须断开当前连接并重新打开新连接。因为在SQL Azure中，我们的数据库不一定储存在相同的物理服务器上面的。&lt;/p&gt;&lt;p&gt;这点与SQL Server有点不同，SQL Server中，我们可以使用USE语句来更改数据库，在SQL Azure中，我们需要重新连接一次以确保重新连接到SQL Azure的物理服务器群集节点客户端是正确的。我们关闭查询标签，单击更改连接图标。&lt;/p&gt;&lt;p&gt;使用相同账户登录，由于我们想要连接到制定数据库，所以需要点击选项按钮，指定“yjingleeDB”数据库。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/19.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/19.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;连接成功了，我们调用DB_NAME()函数查看当前数据库名称。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/20.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/20.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="SQLAzureManagingLoginsAndSecurity"&gt;配置SQL Azure数据库安全&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们将配置yjingleeDB数据库的安全。学习一下如何为一个数据库创建和配置一个新的登录用户。&lt;/p&gt;&lt;p&gt;我们使用服务器用户名和密码登录默认SQL Azure数据库，创建一个登录用户。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/21.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/21.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后我们使用服务器用户名和密码重新登录yjingleeDB数据库。我们为yjingleeDB数据库创建一个登录用户并把这个用户增加到db_owner角色中，即对这个数据库拥有操作权限。即依次执行下面两行脚本。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/22.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/22.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们就创建好了，使用这个新账户登录yjingleeDB数据库吧。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/23.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/23.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;执行一个查询，验证当前用户。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/24.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/24.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="SQLAzureCreatingObjects"&gt;在SQL Azure中创建数据库对象&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.创建简单的表&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们创建一个简单的表，只有一个单一的int类型的列。这里必须注意，SQL Azure里面的表必须要有一个聚集索引。如果没有的话不能插入任何数据。聚集索引的不一定是主键列。出于性能的原因，最好在其他列上。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/25.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/25.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后插入三笔数据，再执行查询，检索出这些数据。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/26.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/26.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.创建复杂的表和索引&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我这次依次创建一个Customer表，然后增加一个索引，最后插入一笔数据并查询出来。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/27.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/27.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.检查查询计划&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们看看从Customer表中查询数据来体验一下SQL Azure的查询计划。我们先执行一些T-SQL插入10000行数据比较差异。&lt;/p&gt;&lt;p&gt;1行数据的查询计划：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/28.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/28.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;10000行数据的查询计划&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/29.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/29.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;调用“Ctrl+L”可视化：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/30.png" target="_blank"&gt;&lt;img alt="SQL Azure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloSQLAzure/30.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1878186.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/11/16/hello-sql-azure.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/11/15/hello-windows-azure.html</id><title type="text">Windows Azure Platform体验(1)：Windows Azure</title><summary type="text">Windows Azure Platform有Windows Azure、SQL Azure、Azure AppFabric三部分。Windows Azure提供一个具有计算、存储、托管和管理功能的可扩展环境。它通过安全的连接、消息传送和标识管理链接到内部部署的应用程序。</summary><published>2010-11-15T00:42:00Z</published><updated>2010-11-15T00:42:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/11/15/hello-windows-azure.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/11/15/hello-windows-azure.html"/><content type="html">&lt;p&gt;&lt;a href="http://www.azure.com/" target="_blank"&gt;Windows Azure Platform&lt;/a&gt;有Windows Azure、SQL Azure、Azure AppFabric三部分。&lt;/p&gt;&lt;p&gt;Windows Azure提供一个具有计算、存储、托管和管理功能的可扩展环境。它通过安全的连接、消息传送和标识管理链接到内部部署的应用程序。&lt;/p&gt;&lt;p&gt;这节我们体验Windows Azure，必备软件：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Microsoft Visual Studio 2010&lt;/li&gt;&lt;li&gt;Microsoft SQL Server 2008 R2&lt;/li&gt;&lt;li&gt;&lt;a href="http://go.microsoft.com/fwlink/?LinkID=156784" target="_blank"&gt;Windows Azure Tools for Microsoft Visual Studio 2010&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Windows Azure Platform账户&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;这次体验有下面几个步骤，分别是：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="#create"&gt;创建云服务项目&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#debug"&gt;调试云服务项目&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#publish"&gt;发布云服务项目&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#upload"&gt;上传云服务项目&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="create"&gt;创建云服务项目&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;首先理解下Web托管角色功能，利用这个功能，我们创建一个新网站，然后将它托管在Windows Azure内。&lt;/p&gt;&lt;p&gt;以管理员身份启动Visual Studio 2010，创建一个新的Azure云服务项目。选择“云”模板类型的“Windows Azure 云服务”项目模板。将这个新项目命名为“HelloAzure”，单击“确定”之后，立即弹出一个新的向导。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/1.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/1.png" height="453" width="718"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在这个向导中，可以为这个云应用程序创建一些不同类型的角色，这样我可以在实际应用程序中安装和配置这些角色。可以看到，这里有一些不同的ASP.NET Web角色，最上面的是ASP.NET标准Web角色。如果要开发MVC类型的应用程序，可以使用MVC 2 Web角色。另外，这里还有一个WCF服务Web角色。所有这些角色（包括最下面的CGI Web角色）都将在标准的Windows Azure Web角色内运行。通过单击右侧（即屏幕中央）的箭头，可以完成上述任务，进而在同一个解决方案中添加多个这类项目。&lt;/p&gt;&lt;p&gt;这节我介绍Web角色，所以我选择“ASP.NET Web 角色”项并单击右箭头移到右侧，如果需要，还可以选择将其他角色（如工作者角色）添加到本项目中。请注意，实际上，您还可以创建多个同样的应用程序。例如，如果要在Windows Azure解决方案内托管两个不同的ASP.NET网站，我可以选择ASP.NET Web角色之后再次添加这个角色。 现在，我只选择一个，将Web角色添加到解决方案中。&lt;/p&gt;&lt;p&gt;单击项目右侧的编辑按钮，将“WebRole1”重命名为“HelloAzure_WebRole”。将鼠标悬停在项目上将会显示编辑按钮。单击“确定”。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/2.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/2.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在向导运行完毕，创建所有文件之后，应具有一个包含以下两个项目的解决方案：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;云服务项目&lt;/li&gt;&lt;li&gt;作为 ASP.NET Web 应用程序的 Web 角色&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;解决方案资源管理器看起来如下图所示：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/3.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/3.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们简单修改下Web网页，和平常的一样，打开Default.aspx并切换到设计视图。打开工具箱，并双击“按钮”工具向页面中添加一个按钮。双击页面上的新按钮添加事件处理程序。这就不截图了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;修改Azure应用程序的某些配置&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;可以看到，云服务项目有一些配置文件，一个是ServiceConfiguration文件，另一个是ServiceDefinition文件。 例如，如果要在两个独立的实例中运行这个Web角色，以便扩展Web应用程序。&lt;/p&gt;&lt;p&gt;在“解决方案资源管理器”中的“角色”节点下选择一个角色，然后右击并选择“属性”。这将显示该Web角色的属性页。使用属性页可以编辑服务定义文件和服务配置文件中的每个角色级别的元素和特性。将实例计数从 1 更改为2。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/4.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/4.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我在用户界面中进行更改，然后保存这些更改。可以看到，这样就更改了下面的配置文件。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/5.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/5.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="debug"&gt;调试云服务项目&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;选择“调试”-&amp;gt;“开始调试”(F5)。&lt;/p&gt;&lt;p&gt;如果出现一个错误对话框，显示“Windows Azure Tools: Failed to initialize Development Storage service. Unable to start Development Storage. Failed to start Development Storage: the SQL Server instance ‘localhost\SQLExpress’ could not be found.Please configure the SQL Server instance for Development Storage using the ‘DSInit’ utility in the Windows Azure SDK.”错误，则需要手动配置开发存储的数据库实例。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/6.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/6.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;打开开始菜单Windows Azure SDK v1.2目录的Windows Azure SDK Command Prompt。键入“DSInit /sqlinstance:.”即配置开发存储的数据库实例。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/7.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/7.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果是第一次使用开发存储，则将显示开发存储初始化对话框：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/8.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/8.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;初始化完成之后，单击“确定”关闭对话框。&lt;/p&gt;&lt;p&gt;浏览器将自动启动并指向您的网站。完整地址将类似于 http://127.0.0.1:81/default.aspx。&lt;/p&gt;&lt;p&gt;当单击按钮时，这时会命中在调试器中设置的断点。我可以像以前一样调试。将鼠标悬停在标签的实际文本属性上，可以看到，属性值的设置正确无误。 我可以像以前一样执行所有的标准调试任务，例如，我可以按F10和F11来单步执行和逐过程执行代码，开发体验和以往并无不同。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/9.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/9.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/10.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/10.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;请注意，所有的这些都托管在本地工作站的虚拟Windows Azure云基础结构中，并且采用了称为“开发结构用户界面”和“开发存储用户界面”的形式，系统任务栏中提供一个Windows Azure图标，您可以通过此图标显示Development Fabric用户界面和开发存储用户界面或者关闭这些服务。我们可以打开这些用户界面，看看你这些服务时如何运行的。&lt;/p&gt;&lt;p&gt;当然，存储基础结构模拟的是Windows Azure存储服务，开发结构功能则代表最终在云中部署后要运行的Web角色功能和工作者角色功能。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/11.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/11.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;现在加载开发结构用户界面，单击“Show Development Fabric UI”，Development Fabric实用工具将出现。您可以使用此实用工具来管理本地开发并查看这些开发的日志数据。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/12.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/12.png" height="544" width="715"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以看到，左侧是工作站中运行所有的Windows Azure开发基础结构或项目的预览。 在这里只有一个项目，它的ID是4，右侧是这个Web应用程序以及在这个服务中运行的所有其他Web应用程序的详细信息。可以看到，这里只有一项。另外请注意，从这里可以看出，部署到云中后，最终配置将从默认端口80运行。 不过，为了进行本地部署，已对它进行映射，在这里是映射至端口81，和之前浏览器窗口中显示的一样。&lt;/p&gt;&lt;p&gt;然后，我们看部署的每个Web角色和工作者角色的详细信息。我们可以看到有两个独立的WebRole控制台：一个是“0”，一个是“1”。这是因为他们被当做两个独立的实例在本地工作站中运行。 两个实例的旁边都有一个绿色小圆圈，说明他们的运行和加载都是成功的。 每个控制台内显示的具体详细信息，这些信息十分详尽，所有组成部分都紧密相连，保证了实际角色在计算机中的正确运行。如果出现需要解决的问题，可以利用这些信息来排除故障。如果需要输出跟踪信息，也可以在这里显示这些信息。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/13.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/13.png" height="554" width="716"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;如果您正在使用开发存储服务，则可以右击 Windows Azure 任务栏图标并选择“Show Development Storage UI”以显示下面的对话框，该对话框将使您能够控制正在运行的存储服务并重置所有数据。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/14.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/14.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;好，一切运行正常，我们有了一个本地运行的Windows Azure云应用程序。接下来，可以继续进行开发或调试等等工作，本地开发体验相当完善。不过，在应用程序运行之后，现在需要将它实际部署到Windows Azure云中， 这样，就可以与能够访问实际云的用户共享我的应用程序。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="publish"&gt;发布云服务项目&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;右击“云服务”项目节点并选择“发布”，将这个应用程序发布到云中。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/15.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/15.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;从“发布云服务”对话框中，这里有两个选项：可以将服务包直接部署到 Windows Azure中。也可以选择生成服务包并通过开发人员门户网站自己上载它。在这里，我选择仅创建服务包，单击“确定”按钮。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/16.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/16.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这样，应用程序的应用程序文件便打成了包，然后会启动一个新的Windows资源管理器窗口，显示创建的文件。 &lt;/p&gt;&lt;p&gt;可以看到，最上面的是一个“CS Package”类型的文件“HelloCloud”这就是实际的云服务应用程序，这个文件有点大。第二个文件是整个应用程序的配置文件。Windows Azure根据这个文件进行实际配置，如每个角色需要运行的实例数、角色需要的配置方式等等。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/17.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/17.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="upload"&gt;上传云服务项目&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这时使用账号登录Windows Azure开发人员门户网站，网址为&lt;a href="http://windows.azure.com/" target="_blank"&gt;http://windows.azure.com/&lt;/a&gt;，创建一个新项目，然后部署这些文件。&lt;/p&gt;&lt;p&gt;点击我的项目中的项目名称：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/18.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/18.png" height="406" width="723"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出现Window Azure概况页，可以看到当前没有任何服务，我们点击“New Service”创建一个新的Windows Azure服务。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/19.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/19.png" height="494" width="722"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;在创建服务页面中，我可以选择创建“Storage Account”（存储账户）还是“Hosted Services”（托管服务）。我们选择托管服务，这是因为我们有一个需要托管的ASP.NET网站。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/20.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/20.png" height="499" width="722"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;接下来，为新服务填写有意义的标签和描述，以便以后区分。点击“Next”(下一步)完成服务的创建。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/21.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/21.png" height="507" width="736"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;然后进行最后的一些设置工作。首先，需要为它提供一个公共托管的URL，用来访问这个Web应用程序。不过，因为这是一个共享服务，其他人可能选用过类似的名称。 因此，需要执行“check availablity”(检查可用性)执行可用性检查，确保名称可用。接下来，需要选择将Windows Azure应用程序托管在哪个数据中心或地区，可以在整个清单中选择，比如说，我选择“东亚”。如果有多个应用程序，例如需要相互交流数据信息的Windows Azure应用程序与SQL Azure数据库，就可以使用本页面底部的相关性组，确保这些应用程序位于同一个数据中心内。完成这一段设置之后，最后一个步骤是单击“Create”(创建)按钮，创建可以部署应用程序的最终基础结构。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/22.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/22.png" height="510" width="733"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;创建需要几分钟的时间，可以看到，这个服务的名称以及刚才输入的描述都显示出来了，在下面的“Hosted Service”(托管服务)中，可以选择是将应用程序部署在“Production”(生产)还是“Staging”（分段）环境中。这个两个选项都可以选择，我也可以在两者之间方便的切换，因此可以在生产环境和分段环境之间轻松转移应用程序和部署。不过，现在我不选择分段环境，而是直接选择生产环境，以便直接查看实际托管的应用程序。&lt;/p&gt;&lt;p&gt;我们直接开始部署，单击“Deploy...”(部署)按钮。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/23.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/23.png" height="500" width="729"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;这时会出现一个新窗体，在这个窗体中，上传实际的应用程序文件和整个应用程序的配置文件。操作系统选择默认设置，填写部署标签。单击“Deloy”(部署)按钮。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/24.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/24.png" height="501" width="721"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;系统上传应用程序文件和配置文件，将这些文件放到Windows Azure中确定以最佳方式部署应用程序,这一过程需要持续5到10分钟。&lt;/p&gt;&lt;p&gt;完成这一步骤后，可以将应用程序实际投入运行，因为现在它处于一个类似于“暂停状态”的最后阶段。如果停止运行，也会出现这个状态，这个状态执行其它设置步骤或升级一个已经投入运行的应用程序。不过，现在我们单击“Run”(运行)。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/25.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/25.png" height="506" width="723"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;可以看到，应用程序已经部署到虚拟环境中，正在启动这些虚拟环境。这时有一个很小的黄色状态指示器，说明Web角色正在初始化状态。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/26.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/26.png" height="494" width="722"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;屏幕进行自动刷新，可以看到从“Initializing”（正在初始化）状态变成了“Busy”(忙)。最后变成了绿色状态，只有当状态图标变为绿色，状态变成“Ready”（就绪）的时候，说明已经完成部署，并且在Windows Azure中投入运行。 &lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/27.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/27.png" height="288" width="716"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;我们可以通过URL访问这个云服务了。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/28.png" target="_blank"&gt;&lt;img alt="HelloWindowsAzure" src="http://images.cnblogs.com/cnblogs_com/lyj/Azure/HelloWindowsAzure/28.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;好了，我从头到尾体验了一下Windows Azure云应用程序。使用VS工具进行开发，和以前使用的本地化开发结构环境一样，我们可以执行本地调试等任务。最后一切准备就绪之后，通过简单的步骤，将应用程序部署到Microsoft Windows Azure云服务中。 &lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1877362.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/11/15/hello-windows-azure.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/11/01/the-future-of-silverlight.html</id><title type="text">Silverlight的未来[译文]</title><summary type="text">自从微软专业开发者大会PDC10结束之后，网络上关于Silverlight被抛弃之说甚嚣尘上，拜读ZDNet访问BobMu的原文。Silverlight Team在2010年9月1日发表的博文"Silverlight的未来"目前也许微软公司对外正式的回应。</summary><published>2010-11-01T10:58:00Z</published><updated>2010-11-01T10:58:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/11/01/the-future-of-silverlight.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/11/01/the-future-of-silverlight.html"/><content type="html">&lt;p&gt;自从&lt;a href="http://www.microsoftpdc.com/?WT.mc_id=aff-n-cn-loc-PDC-cnblogs" target="_blank"&gt;微软专业开发者大会PDC10&lt;/a&gt;结束之后，网络上关于&lt;a href="http://www.cnblogs.com/topic/58/" target="_blank"&gt;Silverlight被抛弃之说&lt;/a&gt;甚嚣尘上，拜读ZDNet访问&lt;a href="http://news.cnblogs.com/n/79114/" target="_blank"&gt;BobMu的原文&lt;/a&gt;。&lt;/p&gt;&lt;p&gt;Silverlight Team在2010年9月1日发表的博文&amp;quot;&lt;a href="http://team.silverlight.net/announcement/the-future-of-silverlight/" target="_blank"&gt;Silverlight的未来&lt;/a&gt;&amp;quot;目前也许微软公司对外正式的回应。不过Silverlight Team在11月1号发布了&lt;a href="http://team.silverlight.net/announcement/pdc-and-silverlight/" target="_blank"&gt;PDC and Silverlight&lt;/a&gt;彻底澄清了Silverlight的局面。本文参考一篇&lt;a href="http://blogs.msdn.com/b/tomleetaiwan/archive/2010/11/01/the-future-of-silverlight-silverlight.aspx" target="_blank"&gt;繁体中文&lt;/a&gt;版整理发表。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Silverlight的未来&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;近来许多讨论一直围绕Web 与HTML 5 标准，尤其是HTML 5。人们一直在问微软Silverlight研发团队一个问题；当开发人员面对浏览器已经内建了HTML 5 &amp;lt;video&amp;gt; 标签的未来世界里，Silverlight 该扮演何种角色融入这样的环境。&lt;/p&gt;&lt;p&gt;这是一个很直接的问题，我会提供一个很完整的答复，但我认为对于在“标准”下Silverlight的角色问题，这是一个过于简化的提问，为了理清问题我希望先描述，为什么Silverlight在进阶媒体使用经验和应用程序的情境下是较佳的跨越浏览器，桌面环境和多种设备的技术。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;标准与创新&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img height="167" src="http://team.silverlight.net/files/media/image/WindowsLiveWriter/108f9d16f34d_DBB9/InnovationAndStandards.jpg" width="221" /&gt;&lt;/p&gt;&lt;p&gt;许多朋友或许不知道，微软公司接触超过150个国际标准制定组织，并参与400余项标准制定的工作，其中一项微软公司参与多年的标准就是HTML，我们承诺持续支持此一Web标准。这不仅只是空谈，微软公司现有许多技术投资是建立在HTML相关技术的基础上， 例如SharePoint，Ineternet Explorer 浏览器与ASP.NET。我们相信，未来HTML 5 将成为无所不在的标准，就如同今日的HTML 4.01。&lt;/p&gt;&lt;p&gt;但是就整个产业的进步而言，标准只是整个故事的一部分。各家厂商与组织可以广泛地依照标准实作出技术，像是铺设好的道路一般，引导整个业界往共同的方向迈进。但在康庄大道出现之前，必须有人先尝试走出一条小径，这就是创新。创新和标准往往是共生的，创新走在其他标准之前，使得日后建立标准时无须针对每个遇到的问题去“重新发明轮子”，寻求解决的方法。创新能够专注处理特定待解决的问题，创新也可补足或扩展现有的标准，最终成为被广泛接受的标准，羊肠小径扩展为康庄大道。&lt;/p&gt;&lt;p&gt;在过去已经发生好几次，浏览器中某些创新的功能，日后成为业界标准。目前HTML最新标准中许多的创新是来自于浏览器Pulg-in技术，例如Flash与Silverlight。这是必要的，因为其中某些功能目前已如此的普及，早已被网络用户视为是必须有的基本功能。所以用户对于Web标准需求的基准线，往往比过去的标准来的高，而用户的新需求往往出现得更快，未来仍有更多新的需求必须透过创新来加以解决。&lt;/p&gt;&lt;p&gt;这就是未来Silverlight可发挥之处，在Web应用中微软从未尝试以Silverlight取代HTML，Silverlight是协助开发人员更简易地处理HTML（和其他技术）所不容易解决的问题。微软仍然承诺利用Silverlight来扩展HTML所无法涵盖之Web应用情境。从简纯的让HTML网页内容更丰富( “islands of richness” )，到全功能与视窗桌面程序相似之应用，Silverlight提供各种用户想要的丰富使用经验，我们归类为三大类：进阶媒体使用经验，消费性应用程序与游戏，以及商业/企业应用程序。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;进阶媒体使用经验&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;应用情境包含:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;视讯会议Webam/麦克风&lt;/li&gt;&lt;li&gt;如Netflix 般的随选视讯(Video on demand) 之DVR (digital video recorder) 数位录影功能与数位内容保护&lt;/li&gt;&lt;li&gt;重要网络媒体直播事件，如NBC，CTV，NRK，法国电视针对奥运会所提供的网络直播&lt;/li&gt;&lt;li&gt;以搭配IIS 之Smooth Streaming 技术将影音串流传送至桌面环境，浏览器，iPhone/iPad 等&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;尽管这些使用经验都集中在媒体播放，实际上这些是融合多种频道媒体，并为用户提供全面掌控权的全方位应用，用户可以自由决定何时何地以自己想要的形式来欣赏媒体内容。Silverlight 媒体功能的远超出了HTML 5 所能提供的功能，使得用户在目前的浏览器与未来的浏览器中都能享有一致的功能，与HTML 5 主要差别之应用情境如下：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;高解析度（HD）H.264 和VC-1 视讯播放&lt;/li&gt;&lt;li&gt;数位内容保护，包括数位版权管理&lt;/li&gt;&lt;li&gt;&lt;a href="http://team.silverlight.net/announcement/microsoft-nvidia-and-istreamplanet-stream-nascar-in-3d/" target="_blank"&gt;立体3D 视讯播放&lt;/a&gt;&lt;/li&gt;&lt;li&gt;多点广播(Multicast)&lt;/li&gt;&lt;li&gt;支持现场直播&lt;/li&gt;&lt;li&gt;依用户端运算能力与频宽自动调整播放画质的(Adaptive) Smooth Streaming 技术&lt;/li&gt;&lt;li&gt;视讯播放时额外附加资讯(Information overlays) / 子母画面(Picture-in-picture)&lt;/li&gt;&lt;li&gt;以Silverlight Analytics Framework 提供视讯分析功能&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;消费性应用程序与游戏&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;消费者对于应用程序与设备之使用经验的要求不断提升，无论生产力应用程序或游戏都希望看起来，用起来与感受上都要达到一定之水准，透过美术设计师和软体开发人员Silverlight 实现人们想要拥有的这些功能：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;完全可客制化之样式和外观&lt;/li&gt;&lt;li&gt;透过微软工具与共享专案档能力，提供最佳之美术设计师与开发人员协同合作工作流程&lt;/li&gt;&lt;li&gt;运用点阵图快取(bitmap caching) 提供流畅的动画与效果&lt;/li&gt;&lt;li&gt;投影式3D 功能(Perspective 3D )&lt;/li&gt;&lt;li&gt;运用.NET 与多执行绪(multithreading) 所呈现出反应快速之使用者界面&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;商业/企业应用程序&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;当用户在消费性市场中习惯了更丰富，更好的使用者经验之后，他们将会把对于应用软体与设备的高标准期望值带到了工作环境，今日的商业应用亦需要一个平台，能够满足并超越这些期望。但是传统的商业应用程序是针对内部员工所开发的，目的在于快速开发而缺乏专业美术设计师。为达到此一目的，Silverlight 提供以下丰富功能：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;全套60+ 内建之控制项，并支持客制化样式&lt;/li&gt;&lt;li&gt;微软提供高生产力之美术设计工具与软体开发工具&lt;/li&gt;&lt;li&gt;高执行效率之.NET 与C#&lt;/li&gt;&lt;li&gt;功能强大，具备与用户互动能力之控制项，透过图表与&lt;a href="http://team.silverlight.net/announcement/silverlight-pivotviewer-control-is-here/" target="_blank"&gt;Silverlight PivotViewer&lt;/a&gt;将资料视觉化&lt;/li&gt;&lt;li&gt;灵活的资料支持功能：提供资料系结(databinding)，二进制XML，LINQ 和本机资料存储能力&lt;/li&gt;&lt;li&gt;列印虚拟化功能(Virtualized printing)&lt;/li&gt;&lt;li&gt;支持COM automation（包括Microsoft Office 连结能力），群组原则（Group Policy）管理&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;其它技术考量&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;对于一般性的简单应用，我们或许不需要使用到上面提到的进阶功能，此时Silverlight和未来的HTML标准都能符合需求。然而，当您考量到兼顾现状与未来的平台技术，仍有一些其它的技术考量因素，例如执行效率，呈现一致性与时效。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;执行效率&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://bubblemark.com/" target="_blank"&gt;&lt;img src="http://team.silverlight.net/files/media/image/WindowsLiveWriter/108f9d16f34d_DBB9/clip_image002[4]_74244343-c751-4424-9b4d-b25e67ae2fb3.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;应用程序的反应速度，是否有能力处理现代应用程序所需之复杂运算，往往是关系用户使用者经验好坏的主要因素。Silverlight 运用CLR (Common Language Runtime) 与硬体加速提升视讯播放能力，此外，并可运用.NET 与多执行绪(multithreading) 呈现出反应快速之使用者界面。今日在许多情况之下，Silverlight 是Web 上速度最快的执行环境。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;呈现一致性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://team.silverlight.net/files/media/image/WindowsLiveWriter/108f9d16f34d_DBB9/clip_image003[4].jpg" /&gt;&lt;/p&gt;&lt;p&gt;针对不同品牌浏览器之HTML 5 与CSS3 呈现一致性问题，微软正在提供呈现一致性之测试套件，以协助改善HTML 5 与CSS3 在不同品牌浏览器间显示差异的问题。HTML 与CSS 在不同浏览器间呈现差异性问题过去即存在，HTML 5 与CSS 3 的推出，将会这项问题继续存在一阵子，毕竟新规格扩展了新的应用领域，所有厂商的浏览器实作也都是新加入的。反之，以Silverlight 开发之应用程序，我们可以确保它在各种不同的环境呈现效果是一致的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;时效性&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://team.silverlight.net/files/media/image/WindowsLiveWriter/108f9d16f34d_DBB9/Timeline.jpg" /&gt;&lt;/p&gt;&lt;p&gt;在HTML 5 规格制定过程的一半时间之中，微软公司已经释出了四个主要的Silverlight 版本。目前还不清楚何时HTML 5 规格与相关测试套件会完成。对于HTML 5 中的各项新功能，目前应该关注的，是已经稳定下来所有的浏览器都支持的规格。支持HTML 5 浏览器若要达到高普及率，需要超过十亿用户安装最新版本浏览器，或是购买新设备与新机器，这将需要一段时间方能普及。当HTML 5 到达能被广为接受的时间点时，同时Silverlight 已经演进出新的重要功能。Silverlight 现在就可以应用于所有流行的浏览器与作业系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;浏览器之外的执行能力&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://team.silverlight.net/files/media/image/WindowsLiveWriter/108f9d16f34d_DBB9/OutOfBrowser.png" /&gt;&lt;/p&gt;&lt;p&gt;这次讨论Silverlight的未来中，有一个关键点，Silverlight经常被提到仅是个浏览器的plug-in，甚至过去微软也曾这样定位Silverlight。现今Web不断演进，同样的Silverlight也不断地在演变发展，虽然应用程序执行于浏览器仍是我们的研发焦点，但两年之前，我们便开始展示Silverlight远超过仅是个单纯的浏览器技术。&lt;/p&gt;&lt;p&gt;Silverlight投资在三个浏览器以外的领域，视窗桌面，行动设备与客厅。今日Silverlight即可开发功能强大之桌面应用程序，这些桌面应用程序并不需要额外的下载，当用户安装Silverlight，这类桌面程序即可透过浏览器寻得与下载，并且每个独立的桌面应用程序都可无痛的安装或删除。Silverlight现在还可执行于行动设备，并且是Windows Phone 7的主要开发平台。学习Silverlight的开发人员，能够迅速转变成为一个能够&lt;a href="http://team.silverlight.net/guest-posts/an-integrator-rsquo-s-take-on-developing-for-windows-phone-7-series/" target="_blank"&gt;开发手机应用的开发人员&lt;/a&gt;。最后，今年推出的Silverlight 4与在&lt;a href="http://team.silverlight.net/announcement/microsoft-silverlight-recap-at-nab-2010/" target="_blank"&gt;美国国家广播工作者协会(NAB，National Association of Broadcasters) 2010年年会中的展示&lt;/a&gt;，展示了如何使用Silverlight可以作为一个强大的，功能丰富的客厅设备平台。&lt;/p&gt;&lt;p&gt;我们期望看到Silverlight 有更多的应用在这些领域，特别是高画质的影音媒体经验，消费性应用程序与游戏，以及企业应用。当你投资时间学习Silverlight，你将有能力开发各种类型的应用程序，从商业应用到娱乐应用，从浏览器到行动设备与家庭客厅，兼顾了有趣与获利。而最好的地方是- 你可以从现在就开始开发Silverlight，并执行于600,000,000 台已经安装Silverlight 的桌上型电脑与设备。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1866550.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/11/01/the-future-of-silverlight.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/10/11/nhibernate-3-0-cookbook.html</id><title type="text">推荐NHibernate新书：NHibernate 3.0 CookBook[附下载]</title><summary type="text">NHibernate 3.0 CookBook这本书在2010年10月4号出版，出版后NHibernate的Lead：Fabio Maulo赠送我一份免费优惠券，我花了几天时间阅读了这本电子书，以下是我阅读NHibernate 3.0 CookBook这本书的读书心得分享一下。</summary><published>2010-10-11T00:43:00Z</published><updated>2010-10-11T00:43:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/10/11/nhibernate-3-0-cookbook.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/10/11/nhibernate-3-0-cookbook.html"/><content type="html">&lt;p&gt;NHibernate 3.0 CookBook这本书在2010年10月4号出版，出版后NHibernate的Lead：&lt;a href="http://fabiomaulo.blogspot.com" target="_blank"&gt;Fabio Maulo&lt;/a&gt;赠送我一份免费优惠券，我花了几天时间阅读了这本电子书，以下是我阅读NHibernate 3.0 CookBook这本书的读书心得分享一下。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NHibernate近况&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;目前我们很难对NHibernate整个技术体系有个完整的把握。其原因是官方文档不全，关于NHibernate的书也没几本。NHibernate 3.0 CookBook这本书可以算是弥补了NHibernate文档很多空白。&lt;/p&gt;&lt;p&gt;在国内更是资料寥寥无几。甚至可以说是空白。但是从今年的NHibernate下载量&lt;a href="http://bit.ly/90JuFh" target="_blank"&gt;官方统计&lt;/a&gt;来看，中国居然是全球第一，占24%，高达4万之多，从这么大的数字来看，不知道有多少人真正的把NHibernate使用地“灵活自如”呢，这的确是个未知数。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这本书概述&lt;/strong&gt;&lt;/p&gt;&lt;a href="https://www.packtpub.com/nhibernate-3-0-cookbook/book" target="_blank"&gt;&lt;img alt="NHibernate 3.0 CookBook" height="431" src="https://www.packtpub.com/sites/default/files/3043OS_MockupCover_Cookbook.jpg" width="350" style="float: right" /&gt;&lt;/a&gt;&lt;p&gt;从全部的内容来看，这本书几乎涵盖了NHibernate 3版本的全部内容，基本上对NHibernate有了一个整体的把握：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;NHibernate功能介绍&lt;/strong&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Configuration&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Query&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Test&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Extending&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;NHibernate贡献项目介绍&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;strong&gt;各种环境(ASP.NET MVC、ASP.NET、WPF、WinForms)里的最佳实践&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;现在我们使用到的技术在这本书都有一个比较全面的介绍。&lt;/p&gt;&lt;p&gt;每一个章节都是采用真实实战的方式去写的，基本上有四步：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;strong&gt;准备工作(Getting ready)&lt;/strong&gt;：为这个知识点准备下实体。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;如何实现(How to do it...)&lt;/strong&gt;：进行实际编码完成功能。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;分析原理(How it works...)&lt;/strong&gt;：详细描述了为什么这样做以及这样做的原因。&lt;/li&gt;&lt;li&gt;&lt;strong&gt;必要扩展(There&amp;#39;s more...)&lt;/strong&gt;：对这个知识点进行适当扩展。&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;在完成之后你也基本上对这节有了一个清晰的把握了。而且可以仔细阅读源代码实际运行看结果。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这本书分析&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第一章：Models and Mappings&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;本书把映射作为出发点，介绍了三种映射方式：XML、Fluent、ConfORM。然后分析一些映射实例：类继承映射、一对多映射、版本映射、枚举映射、组件映射。通过这一章基本上已经熟悉了映射，但是有一些内容没有介绍，例如数据库对象(DatabaseObjects)、筛选定义(FilterDefinitions)、结果集(ResultSets)、类型定义(TypeDefinitions)等等。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第二章：Configuration and Schema&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们使用NHibernate，必须先配置NH。这一章作者使用了App.config、hibernate.cfg.xml、Loquacious、FluentNH方式配置NHibernate，并使用NHibernate架构生成工具创建数据库架构。这一章是必不可少的基础内容，往往很多初学者在这里过不去，我想看看这一章就完全清楚了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第三章：Sessions and Transactions&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;个人觉得这一章写的最好了，介绍了Session接口和几种Session策略，实例分析ASP.NET Web Forms和ASP.NET MVC程序中session per web request策略应用并对其扩展。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第四章：Queries&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;NHibernate3版本里所有的查询方式，应该是7种：HQL(NHibernate查询语言)、Criteria(条件查询)、QueryOver(Lambda表达式查询)、LINQ(语言集成查询)、H-SQL(NHibernate特定SQL查询)、SQL(原生SQL查询)、Custom DSL(自定义特定领域语言查询)。不过作者在这一章介绍了常见的几种。每种查询都是举了一些实际例子。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第五章：Testing&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;作者写个测试环境，并介绍NHibernate Profiler、SQLite和重影。推荐使用这些可以有效的提高工作效率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第六章：Data Access Layer&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们在程序中NH相关查询代码是写在数据访问层的，作者在这一章介绍了各种查询的写法并阐述了几种模式（Repository、LINQ specifications）在数据访问层的应用。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第七章：Extending NHibernate&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;扩展NHibernate，这个比较高级，但是在企业级应用里必不可少。作者在这一章介绍的几种扩展都是挺实用的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;第八章：NHibernate Contribution Projects&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这一章介绍了NHibernate贡献项目，对于我们使用这些贡献项目有个参考了。&lt;/p&gt;&lt;p&gt;最后作者结合ASP.NET MVC、ASP.NET、WPF、WinForms环境对全书内容整理了一个学习、应用思路。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;推荐链接&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;最后觉得应该把这本书推荐给所有NHibernate开发人员。从这本书中你肯定可以学到很多你不知道的东西。如果有的公司使用NHibernate，推荐采购一本实体书作为手上的参考书。以后我也会结合这本书的内容适当的补充写写博客。当然前提你读过了这本书了。&lt;/p&gt;&lt;p&gt;书名：&lt;a href="https://www.packtpub.com/nhibernate-3-0-cookbook/book" target="_blank"&gt;NHibernate 3.0 Cookbook&lt;/a&gt;&lt;/p&gt;&lt;p&gt;作者：&lt;a href="http://www.jasondentler.com/" target="_blank"&gt;Jason Dentler&lt;/a&gt;&lt;/p&gt;&lt;p&gt;购买地址：&lt;a href="https://www.packtpub.com/nhibernate-3-0-cookbook/book" target="_blank"&gt;https://www.packtpub.com/nhibernate-3-0-cookbook/book&lt;/a&gt;&lt;/p&gt;&lt;p&gt;出版社：&lt;a href="http://www.packtpub.com/" target="_blank"&gt;Packt Publishing&lt;/a&gt;&lt;/p&gt;&lt;p&gt;提供本地下载(2010年11月6号22点更新)：&lt;a href="http://files.cnblogs.com/lyj/Packtpub.NHibernate.3.0.Cookbook.Oct.2010.zip" target="_blank"&gt;Packtpub.NHibernate.3.0.Cookbook.Oct.2010.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;这本书评价&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://nhforge.org/blogs/nhibernate/archive/2010/10/05/nhibernate-3-0-cookbook.aspx" target="_blank"&gt;NHibernate 3.0 Cookbook&lt;/a&gt;(今年底购买输入优惠码NHIBCBK20(区分大小写)享受20%优惠)&lt;/p&gt;&lt;p&gt;Mogens Heller Grabe：&lt;a href="http://mookid.dk/oncode/archives/1596" target="_blank"&gt;Book review: NHibernate 3.0 Cookbook&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望本文对你有所帮助。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1847579.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/10/11/nhibernate-3-0-cookbook.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/lyj/archive/2010/10/03/inside-nh3-conform-component.html</id><title type="text">NHibernate3剖析：Mapping篇之ConfORM实战(5):Component语义</title><summary type="text">使用ConfORM“映射”组件，我们无需特别设置，ConfORM内部会根据Domain定义来判定组件，一般而言，没有主键的类就是组件。</summary><published>2010-10-03T05:46:00Z</published><updated>2010-10-03T05:46:00Z</updated><author><name>李永京</name><uri>http://www.cnblogs.com/lyj/</uri></author><link rel="alternate" href="http://www.cnblogs.com/lyj/archive/2010/10/03/inside-nh3-conform-component.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/lyj/archive/2010/10/03/inside-nh3-conform-component.html"/><content type="html">&lt;p&gt;&lt;em&gt;&lt;strong&gt;本节内容&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;&lt;a href="#insidenh3"&gt;系列引入&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="#introduction"&gt;ConfORM概述&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#component"&gt;Component语义&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#summary"&gt;结语&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="#reference"&gt;参考资料&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="insidenh3"&gt;系列引入&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NHibernate3剖析系列&lt;/strong&gt;分别从Configuration篇、Mapping篇、Session篇、Core篇、Tool篇、Practice篇、Extension篇等方面全面揭示NHibernate3版本内容、特性及其应用，完全基于NHibernte3版本。&lt;/p&gt;&lt;ul&gt;&lt;li&gt;NHibernate专题：&lt;a href="http://kb.cnblogs.com/zt/nhibernate/" target="_blank"&gt;http://kb.cnblogs.com/zt/nhibernate/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;NHibernate官方站点：&lt;a href="http://nhforge.org/" target="_blank"&gt;http://nhforge.org/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;NHibernate参考文档：&lt;a href="http://nhforge.org/doc/nh/en/" target="_blank"&gt;http://nhforge.org/doc/nh/en/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;获取NHibernate地址：&lt;a href="http://sourceforge.net/projects/nhibernate/files/" target="_blank"&gt;http://sourceforge.net/projects/nhibernate/files/&lt;/a&gt; &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="introduction"&gt;ConfORM概述&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;ConfORM实战系列：&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/04/21/inside-nh3-conform-introduction.html" target="_blank"&gt;ConfORM实战(1):概览&lt;/a&gt;：ConfORM简单使用&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/09/inside-nh3-conform-theory.html" target="_blank"&gt;ConfORM实战(2):原理&lt;/a&gt;：ConfORM的基本实现原理&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/10/inside-nh3-conform-onetoone.html" target="_blank"&gt;ConfORM实战(3):OneToOne语义&lt;/a&gt;：使用ConfORM“映射”一对一关联&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/09/26/inside-nh3-conform-manytomany.html" target="_blank"&gt;ConfORM实战(4):ManyToMany语义&lt;/a&gt;：使用ConfORM“映射”多对多关联&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;如果你不熟悉ConfORM请查看前几篇文章，你可以到&lt;a href="http://code.google.com/p/codeconform/" target="_blank"&gt;http://code.google.com/p/codeconform/&lt;/a&gt;获取ConfORM最新版本。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="component"&gt;Component语义&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用ConfORM“映射”组件，我们无需特别设置，ConfORM内部会根据Domain定义来判定组件，一般而言，没有主键的类就是组件。&lt;/p&gt;&lt;span class="notranslate"&gt;[&lt;span style="color: #2b91af"&gt;Test&lt;/span&gt;]&lt;br/&gt;&lt;span style="color: blue"&gt;public void &lt;/span&gt;ComponentMappingDemo()&lt;br/&gt;{&lt;br/&gt;    &lt;span style="color: green"&gt;//show how work with components and how ConfORM understands OOP&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;orm = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;ObjectRelationalMapper&lt;/span&gt;();&lt;br/&gt;    &lt;span style="color: blue"&gt;var &lt;/span&gt;mapper = &lt;span style="color: blue"&gt;new &lt;/span&gt;&lt;span style="color: #2b91af"&gt;Mapper&lt;/span&gt;(orm);&lt;br/&gt;    &lt;span style="color: green"&gt;//use the definition of table-to-class strategy class by class&lt;br/&gt;    &lt;/span&gt;orm.TablePerClass&amp;lt;&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;&amp;gt;();&lt;br/&gt;    &lt;span style="color: green"&gt;// Show the mapping to the console&lt;br/&gt;    &lt;/span&gt;&lt;span style="color: blue"&gt;var &lt;/span&gt;mapping = mapper.CompileMappingFor(&lt;span style="color: blue"&gt;new&lt;/span&gt;[] { &lt;span style="color: blue"&gt;typeof&lt;/span&gt;(&lt;span style="color: #2b91af"&gt;Person&lt;/span&gt;) });&lt;br/&gt;    &lt;span style="color: #2b91af"&gt;Console&lt;/span&gt;.Write(mapping.AsString());&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;一些Domain范例&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;我们使用各种集合定义Domain：&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1.Mapping a class with components&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Person实体有两个组件：&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Person&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Address &lt;/span&gt;Address { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;br/&gt;&lt;br/&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;First { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;Last { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;br/&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Address&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;Street { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;CivicNumber { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出HbmMapping的映射字符串结果：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-ClassWithComponents.png" target="_blank"&gt;&lt;img alt="ClassWithComponents" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-ClassWithComponents.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2.Mapping a class with double usage of same component&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在上面Domain的基础上新增一个Name类型的属性：&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Person&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;ShowBusinessAlias { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Address &lt;/span&gt;Address { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出HbmMapping的映射字符串结果：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-ClassWithDoubleSameComponents.png" target="_blank"&gt;&lt;img alt="ClassWithDoubleSameComponents" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-ClassWithDoubleSameComponents.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3.Collection of components&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用一个集合，而不是单一组件：&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Person&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;private &lt;/span&gt;Iesi.Collections.Generic.&lt;span style="color:#2b91af"&gt;ISet&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Address&lt;/span&gt;&amp;gt; addresses;&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;Person()&lt;br/&gt;    {&lt;br/&gt;        addresses = &lt;span style="color:blue"&gt;new &lt;/span&gt;Iesi.Collections.Generic.&lt;span style="color:#2b91af"&gt;HashedSet&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Address&lt;/span&gt;&amp;gt;();&lt;br/&gt;    }&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;ICollection&lt;/span&gt;&amp;lt;&lt;span style="color:#2b91af"&gt;Address&lt;/span&gt;&amp;gt; Addresses { &lt;span style="color:blue"&gt;get &lt;/span&gt;{ &lt;span style="color:blue"&gt;return &lt;/span&gt;addresses; } }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出HbmMapping的映射字符串结果：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-CollectionOfComponents.png" target="_blank"&gt;&lt;img alt="CollectionOfComponents" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-CollectionOfComponents.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4.Bidirectional relation&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;实现实体与组件的双向关联关系：&lt;/p&gt;&lt;span class="notranslate"&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Person&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public int &lt;/span&gt;Id { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;Name { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name &lt;/span&gt;ShowBusinessAlias { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Address &lt;/span&gt;Address { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;br/&gt;&lt;span style="color:blue"&gt;public class &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Name&lt;br/&gt;&lt;/span&gt;{&lt;br/&gt;    &lt;span style="color:blue"&gt;public &lt;/span&gt;&lt;span style="color:#2b91af"&gt;Person &lt;/span&gt;Person { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;First { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;    &lt;span style="color:blue"&gt;public string &lt;/span&gt;Last { &lt;span style="color:blue"&gt;get&lt;/span&gt;; &lt;span style="color:blue"&gt;set&lt;/span&gt;; }&lt;br/&gt;}&lt;/span&gt;&lt;p&gt;&lt;strong&gt;Mapping&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;输出HbmMapping的映射字符串结果：&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-BidirectionalRelation.png" target="_blank"&gt;&lt;img alt="BidirectionalRelation" src="http://images.cnblogs.com/cnblogs_com/lyj/NH3/ConfOrm-BidirectionalRelation.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="summary"&gt;结语&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这篇文章展示ConfORM的Components语义应用，映射了一些Domain示例。接下来继续介绍ConfORM。Are you ConfORM?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;a name="reference"&gt;参考资料&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Fabio Maulo：&lt;a href="http://fabiomaulo.blogspot.com/2010/03/conform-mapping-components.html" target="_blank"&gt;ConfORM:“Mapping” Components&lt;/a&gt;&lt;/p&gt;&lt;p&gt;希望本文对你有所帮助。&lt;/p&gt;&lt;img src="http://www.cnblogs.com/lyj/aggbug/1841589.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/lyj/archive/2010/10/03/inside-nh3-conform-component.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
