Your SlideShare is downloading. ×
N bear
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

N bear

379
views

Published on

NBear PPT

NBear PPT

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
379
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1.  
  • 2.  
  • 3.
    • NBear 是一个基于 .Net 2.0 、 C#2.0 开放全部源代码的的软件开发框架类库。 NBear 的设计目标是尽最大努力减少开发人员的工作量,最大程度提升开发效率,同时兼顾性能及可伸缩性。
    • 开源协议: BSD
  • 4.
    • N 代表 .Net ,也代表 No ; Bear 既可以翻译成熊,也有忍受之意。
    • Bear 虽然是那种看起来憨憨的样子,但是攻击时身手“敏捷”,因此 .Net Bear 代表了 NBear 是一个基于 .Net2.0 、为敏捷开发而生的快速开发框架。
    • 我们大多数项目的开发需要 Bear (忍受)太多的不必要的重复和繁琐的配置。如数据持久化、对象池、 Web 开发中的 URL 重定向、输入验证、客户端脚本等等,为了简化许多常用组件充用, NBear 为您提供了许多灵活的工具和组件;为了简化繁琐的配置(尤其是如 nhibernate 这类 ORM 组件的繁 琐的配置文件格式、高高的学习曲线和噩梦般的需求变更时的维护更新), NBear 向您提供零配置 需要的数据访问(持久化)接口和可重用组件。
    • 因此, NBear 也代表 No Bear ,充分运用 .Net2.0 中的许多新技术 Generic 、 Emit 、 HttpModule 等, NBear 让我们一起不( No )再忍受( Bear )这种种繁琐的束缚,大大提高我们的软件开发效率、需 求变更时的响应效率,您会注意到,在需要您敲打的代码量(工作量)变得越来越少的同时, NBear 也会带给您许多优雅高效的开发体验。
  • 5.
    • NBear 的核心包括一个泛型、强类型的的数据持久化接口、一组接口式的 Entity 定义组件、高性能 XML/JSON 序列化支持、服务工厂、分布式服务队列和 Web 组件,因此:
      • NBear 最适合开发各类基于 ASP.NET 2.0 ,对性能要求较高的 Web 程序。 JSON 序列化和 XML 序列化的结合使用将可以使您的服务端和客户端数据交互变得更简单高效;
      • NBear.Web 组件提供了许多加 速 Web 开发的组件,将使您基于标准 ASP.NET 方式的开发效率大大提高;同时,简单易用、性能突出的泛型持久化支持,则将使您能够将更多注意力集中到业务开发,同时也不会有传统 ORM 持久化 框架的性能问题和繁琐配置需要( NBear 几乎不需要配置,性能则可与 DAAB 相当)。
  • 6.
      • 高性能的 XML 和 JSON 序列化支持和灵活高效的持久化支持,也使得 NBear 能为开发各种类型的基 于远程数据交换( Web Service 、 Remoting 等等)的分布式应用程序提供便利 .
      • 内置的基于 IoC 容器和分布式服务队列的服务工厂能够使您的程序拥有良好的可伸缩性,可以完全透明的将一个普通构架的程序设置为一个分布式程序,甚至不需要修改消费端或服务实现段 的任何代码,基于服务工厂的系统天然就是 SOA 构架,这就使得您的系统可以以极小的成本和其他 SOA 构架进行整合。
      • 对于桌面应用程序, NBear 同样是一个几乎没有什么学习曲线(多少人会为写一个小小的日历程序而仔细研究透彻 Hibernate 的参考手册?)、实用高效的数据持久化方案。
  • 7.
    • O/R 映射时无需配置文件 , 充分利用命名约定
    • 接口式实体类定义 , 简单清晰 , 易于描述系统
    • 提供实体类生成工具 , 免除手写实体的工作量
    • 动态实体类工厂 , 运行时动态 Emit 及缓存实体类接口的实现类
    • 高性能实体类 XML 及 JSON 序列化
    • 基于 Provider 模式的可扩展持久化数据库源支持
    • 支持多数据库源
    • 基于范型的强类型实体持久化及数据访问接口
    • 基于容器的分布式服务工厂 , 透明的分布式服务调用和分发
    • 基于 .Net Remoting 的分布式服务队列
    • 扩展 ASP.NET MasterPage, Pae, UserControl 基类
    • 基于用户控件的 AJAX 支持
    • URL 重写支持
    • 常用 UI 控件
  • 8.
    • NBear 官方站点: http://nbear.org
    • NBear at CodePlex: http://www.codeplex.com/nbear
    • 团队博客 | Team Blog: http://nbear.cnblogs.com
    • 论坛 | Google Group: http://groups.google.com/group/nbeargroup
    • 源代码 |SVN : https://svn.sourceforge.net/svnroot/nbear/trunk/
    • Teddy's Knowledge Base - 博客园 : http://teddyma.cnblogs.com/
    • 博客园 | CNBLOGS : http://www.cnblogs.com
  • 9.  
  • 10.
    • 重点介绍
      • ORM 模块
      • IoC 模块
      • NBear.Web 提供
      • ORM 最新版 NBearLite
  • 11.
      • 1.1 访问 http://www.codeplex.com/nbear ,下载 NBearV3 的最新版本到本地目录。
      • 1.2 将下载的 zip 文件解压至 C: ,您将看到,加压后的 NBearV3 目录中包括: dist 、 doc 、 cases 、 src 等目录。其中,在本教程中将会使用的是 dist 目录,该目录下包含所有 release 编译版本的 dll 和 exe 。
  • 12.
      • 2.1 打开 VS2005 开发环境,新建一个空的解决方案 sln 。
      • 2.2 向 sln 中添加两个新建的 C# 类库工程,两个类库工程的名称分别为 EntityDesigns 和 Entities ,删除 IDE 自动创建的 Class1.cs 文件。
      • 2.3 向 sln 中新建一个名叫 website 的 ASP.NET Web 应用程序,为 website 添加一个 Web.config 文件。
  • 13.
      • 3.1 在 2.2 创建的 EntityDesigns 工程中,新建一个名为 ClassDiagram.cd 的类图文件。注:如果您的 IDE 不支持类图设计,或者您更习惯写代码,您也可以参照下面的步骤直接创建代码。
  • 14.
      • 3.2 为 EntityDesigns 工程添加到 dist 目录下的 NBear.Common.Design.dll 的引用。因为下面的每一个设计实体接口必须继承自 NBear.Common.Design.Entity 这个接口。在 Entities 工程中创建一个名为 UserName 的 struct 包含 FirstName 和 LastName 两个 string 类型的 Field 。同时在 Entities 工程中创建一个名为 UserStatus 的枚举类型,包含两个枚举选项: Availale 和 Deleted 。注:这两个类型将用于后面的设计实体的设计。之所以这两个类型定义在 Entities 工程中而不是 EntityDesigns 工程中是,最终,所有生成的实体将放在 Entities 工程,且 Entities 工程最后对 EntityDesigns 工程是没有依赖关系的。
      • 3.3 双击 ClassDiagram.cd 打开设计界面,您现在就可以设计实体了。注意,所有的设计实体必须是接口。为了使用 3.2 创建的类型,需要让 EntityDesigns 工程引用 Entities 工程。
  • 15.
      • 3.4 向类图中添加一个 User 接口,继承自 NBear.Common.Design.Entity 。添加属性 ID , Name , Status 和 Birthday 。类型分别为 Guid 、 UserName 、 UserStatus 和 DateTime? 。注意,这里的 Name 和 Status 的类型为 3.2 创建的自定义符合类型 UserName 和枚举类型 UserStatus 。而 Birthday 属性的类型为一个 Nullable 类型的 DateTime? 。注意 DateTime 后面的问号,表示这个类型实际是一个 Nullable<DateTime> ,也就是说, Birthday 类型如果不赋初始值的话,它的值为 null 。
      • 3.5 向类图中再添加一个 LocalUser 接口,继承自 NBear.Common.Design.Entity 。添加属性 LoginName 和 Password 。类型都为 string 。
      • 3.6 从工具栏添加继承线条,让 LocalUser 继承 User 。
  • 16.
    • 3.7 向类图中添加一个 UserProfile 接口,继承自 NBear.Common.Design.Entity 。添加属性 ID , UserID 和 ProfileContent 。类型分别为 Guid , Guid 和 string 。注:这里的 ProfileContent 仅仅象征型的代表 profile 数据,用于演示 1 对 1 关联,实际的项目中可能会有更多属性。
  • 17.
    • 3.8 从工具栏添加关联线条,让 User 包含一个名叫 Profile 的 UserProfile 类型的属性。这样我们就 1 对 1 关联 了 User 和 UserProfile 实体。注:如果操作图形设计界面觉得麻烦,也可以切换到源代码界面,直接编码。
  • 18.
    • 3.9 向类图中添加一个 LocalUserPhone 接口,继承自 NBear.Common.Design.Entity 。添加属性 ID , UserID , Description , Number 。类型分别为 Guid , Guid , string 和 string 。
    • 3.10 从工具栏添加关联线条,让 LocalUser 包含一个名叫 Phones 的类型为 LocalUserPhone[] 的数组类型的属性。这样我们就 1 对多关联 了 LocalUser 和 UserPhone 。
  • 19.
      • 4.1 切换到源代码视图。首先,我们要为除了关联实体 UserGroup 之外(对于关联实体,凡是标记为 RelationKey 的属性,会被自动认为是复合主键)的所有设计实体的主键设置 PrimaryKey 这个 Attribute ,可以为多主键实体的每个主键添加该属性。如果不正确设置主键,代码生成工具将不能正确生成数据库创建脚本。例如,对于 User 实体的 ID 属性,设置后的代码象下面这样:
      •          [PrimaryKey]         Guid ID         {             get;             set;         }
      • 注:大家可能有疑问,为什么这里主键 ID 能不能是 int ,并且是自增长的只读属性呢?答案是完全可以的,完全可以设置某个 ID 属性为下面这样,无需额外设置,它将映射到一个自增长只读的 int 类型的数据库字段:
      •          [PrimaryKey]         int ID         {             get;         }
  • 20.
    • 4.2 在后面的步骤生成实体对应的数据库创建脚本时,对于数值类型, nullable 类型和枚举类型, NBear 能够自动将他们对应到数据库的对应类型,但是, 对 string 类型,一般需要指定其映射到数据库时的具体类型和长度。当然,也可以不指定,如果不指定,则 string 类型默认被映射为 nvarchar(127) 。 例如,对于 UserProfile 的 ProfileContent 属性,我们添加下面的 Attribute ,设置其映射到数据库的类型为 ntext :
    •          [SqlType(&quot;ntext&quot;)]         string ProfileContent         {             get;             set;         }
    • 又如,对于 LocalUserPhone 的 Number 属性,我们添加下面的 Attribute ,设置其映射到数据库的类型为 nvarchar(20) :
    •          [SqlType(&quot;nvarchar(20)&quot;)]         string Number         {             get;             set;         }
  • 21.  
  • 22.
    • 5.1 至此,所有的实体的设计就完毕了。编译 EntityDesigns 工程。
    • 5.2 运行 dist 目录中的 NBear.Tools.EntityDesignToEntity.exe 工具,载入 EntityDesigns 工程编译生成的 EntityDesigns.dll 。
    • 5.3 点击 Generate Entities 按钮,将生成的代码保存到 Entities 工程中的一个名叫 Entities.cs 的新代码文件。并为 Entities 工程添加到 distNBear.Common.Common.dll 的引用。
    • 5.4 点击 Generate Configuration 按钮,将生成的代码保存到 website 工程下的名为 EntityConfig.xml 的新文件中。
    • 5.5 点击 Generate DB Script 按钮,将生成的代码保存到 website 工程下的名为 db.sql 的新文件,可以在某个新建的 SQL Server 数据库中执行这些脚本,创建对应于所有实体的数据库脚本。
  • 23.  
  • 24.  
  • 25.  
  • 26.
    • 6.1 现在我们就可以使用前面生成的实体了。我们先要让 website 工程引用 Entities 工程,以及 dist/NBear.Data.dll 。
    • 6.2 我们还需要设置 website 的 Web.config 文件,添加一个 entityConfig section 以包含 EntityConfig.xml 这个实体配置文件,并设置数据库连接字串。下面是设置完的 Web.config ,注意,粗体的部分都是我们添加的代码(注意,这里的 connectionstring 连接到 SQL Server 数据库的 tempdb 数据库,我们需要对 tempdb 数据库执行 5.5 生成的数据库创建脚本,另外也注意修改数据库登录密码。):
  • 27.  
  • 28.  
  • 29.
    • 6.3 好了,现在,我们就可以随心所欲的访问数据库了。将下面的代码添加至 website 工程的 Default.aspx.cs 文件(您也可以直接打开 tutorials ORM_Tutorialwebsite 目录下的 Default.aspx.cs ,从那里复制代码)。这些代码演示了一个非常典型的创建和级联更新有复杂关系的实体的过程,并伴有详细解说。关于 Gateway 支持的更多方法的介绍,可以参考 doc 目录下的 SDK 类库文档。
  • 30.  
  • 31.  
  • 32.  
  • 33.  
  • 34.  
  • 35.  
  • 36.
    • 6.4 运行以上代码,您将得到类似到下面的结果:
    • Create a new local user and set property values. Create & set the user name. Create & set the local user phones Create & set the user groups. Save the new local user. After we saved the local user. We found the saved local user itself. We found the saved local user itself as a user. We found the 1 to 1 related user profile of the saved local user was also saved. Oh! many to many related local user group of the saved local user was NOT saved!! Do you know why? - It is NOT because it is many to many related while profile and phones are 1 to 1 or 1 to many. It is not because your are not Teddy, either. :) It IS because in the entity design of User, the Groups property is NOT marked with the [Contained] attribute. To save an uncontained property value, such as user‘s Groups, you have to manually do this. Firstly, you should save the group it self. Furthermore, you have to create & save a usergroup relation entity manually. Let’s do it. Let‘s find the saved local user again. Was the group saved this time? Yes, conguratulation! This time, we found the many to many related local user group of the saved local user was finally saved. Do you want to know the saved user name’s details, which is a compoundunit property? Ok, show you what you want, in fact, it is serialized as xml by the NBear.Common.SerializationManager class, looks like: <?xml version=“1.0” encoding=“utf-16”?> <UserName xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=“http://www.w3.org/2001/XMLSchema”> <FirstName>teddy</FirstName> <LastName>ma</LastName> </UserName> Ok, I heard you considering whether you can save it into some other format because you do not want it to be XML? You do have chance to control this!! What youshould do is easily register a custom serialize/deserialize delegate method pair. Let‘s save the user name again. What does the details of the user name now become? It becomes: teddy,ma Cool!~~ Right? But remember, in real project, you must register the custom serialize/deserialize delegate method pair at application started up. For example, in Application_Start(). Thank you so much for having completed this tutorial. You can look up the appendixes, for more information about the usage of the Gateway. See you later! Warm regards, Teddy 2006-11-3
  • 37.
    • 重点介绍
      • ORM 模块
      • IoC 模块
      • NBear.Web 提供
      • NBearLite
  • 38.
      • 1.1 访问 http://www.codeplex.com/nbear ,下载 NBearV3 的最新版本到本地目录。
      • 1.2 将下载的 zip 文件解压至 C: ,您将看到,加压后的 NBearV3 目录中包括: dist 、 doc 、 cases 、 src 等目录。其中,在本教程中将会使用的是 dist 目录,该目录下包含所有 release 编译版本的 dll 和 exe 。
  • 39.
    • 2.1 打开 VS2005 开发环境,新建一个空的解决方案 sln 。
    • 2.2 向 sln 中添加两个新建的 C# 类库工程,两个类库工程的名称分别为 EntityDesigns 和 Entities ,删除 IDE 自动创建的 Class1.cs 文件。
    • 2.3 向 sln 中再添加两个新建的 C# 类库工程,两个类库工程的名称分别为 ServiceInterfaces 和 ServiceImpls ,删除 IDE 自动创建的 Class1.cs 文件。
    • 2.4 向 sln 中新建一个名叫 website 的 ASP.NET Web 应用程序,为 website 添加一个 Web.config 文件。
  • 40.
    • 3.1 运行 dist NBear.Tools.DbToEntityDesign.exe ,在 Connection String 文本框中输入下面的连接子串:
    • Server=(local);Database=Northwind;Uid=sa;Pwd=sa
    • 我们将从 SQL Server 2000 自带的演示数据库 Northwind ,为我们需要的某些表和视图生成设计实体。
    • 点击 Connect 按钮,连接上数据库后,从左边的 Tables 和 Views 列表中分别选择下面这些表或视图(因为这里主要是演示,我们只选择和 Category 和 Product 相关的几个表和视图): Categories , Products , Products by Category 。点击 Generate Entities Design 按钮,在代码生成文本框内的任意位置右键单击鼠标,并选择 Copy to ClipBoard ,这将能把所有的代码复制到剪贴板。
    • 3.2 为 EntityDesigns 工程添加到 dist 目录下的 NBear.Common.Design.dll 的引用,因为每一个设计实体接口必须继承自 NBear.Common.Design.Entity 这个接口。在 EntitiyDesigns 工程中新建一个代码文件 EntityDesigns.cs ,添加 using System 和 using NBear.Common.Design 设置 namespace 为 EntityDesigns 。并将刚才从 DbToEntityDesign 复制的代码粘贴至该文件中。
  • 41.  
  • 42.
    • 此时, EntityDesigns.cs 文件中的内容应该象下面这样:
    • using System; using NBear.Common.Design; namespace EntityDesigns {     public interface Categories : Entity     {         [PrimaryKey]         int CategoryID { get; }         [SqlType(&quot;nvarchar(15)&quot;)]         string CategoryName { get; set; }         [SqlType(&quot;ntext&quot;)]         string Description { get; set; }         byte[] Picture { get; set; }     }     //… }
  • 43.
    • 生成的代码中,数据库中的表或视图名称对应设计实体的名称,字段名称对应设计实体的属性名称,如果名称中包含空格,空格会被转换为 _nbsp_ 。同时,是主键的标字段对应的属性,会自动包含 PrimaryKey 这个 Attribute ,而所有的文本类型的字段,则会自动包含从数据库中继承的数据类型和长度。另外,所有从视图生成的实体接口会包含 ReadOnly 这个 Attribute ,代表,该实体是一个只能用来从数据库取数据,不能用来保存数据到数据库的实体。
  • 44.
    • 3.3 下面,我们可以对这些生成的代码做一下改造,让我们看着更舒服。比如,用 _nbsp_ 代表空格多少影响视觉审美,我们可以给设计实体添加 MappingName 这个 Attribute ,来修改实体接口名称,但是,保证实体还是对应数据库中的这个表或视图。例如,对于 Products_nbsp_by_nbsp_Category 视图,我们可以将它修改为下面的样子:
  • 45.
    • 我们可能同样不喜欢实体名称是复数的英文单词,所以,我们也可以象下面这样把 Categories 实体的名称改为 Category :
  • 46.
    • 我们可以用同样的方法,修改所有的实体名称,和属性名称 。属性名称同样支持 MappingName 这个 Attribute 。我们将所有的实体名称的复数改为单数,并去掉 _nbsp_ 。现在,所有的设计实体应该象下面这个样子:
  • 47.  
  • 48.
    • 4.1 至此,实体的设计就完毕了。编译 EntityDesigns 工程。下面我们将从设计实体生成实际的实体代码和配置文件。注意,这里和之前的 ORM 教程不同的是,我们不生成数据库创建脚本,而直接使用一个已经存在的数据库 Northwind 。
    • 4.2 运行 dist 目录中的 NBear.Tools.EntityDesignToEntity.exe 工具,载入 EntityDesigns 工程编译生成的 EntityDesigns.dll 。
    • 4.3 点击 Generate Entities 按钮,将生成的代码保存到 Entities 工程中的一个名叫 Entities.cs 的新代码文件。并为 Entities 工程添加到 distNBear.Common.Common.dll 的引用。
    • 4.4 点击 Generate Configuration 按钮,将生成的代码保存到 website 工程下的名为 EntityConfig.xml 的新文件中。
  • 49.
    • 5.1 现在我们就可以使用前面生成的实体了。我们先要让 website 工程引用 Entities 工程,以及 dist/NBear.Data.dll 。
    • 5.2 我们还需要设置 website 的 Web.config 文件,添加一个 entityConfig section 以包含 EntityConfig.xml 这个实体配置文件,并设置数据库连接字串。下面是设置完的 Web.config ,注意,粗体的部分都是我们添加的代码(注意修改数据库登录密码。):
  • 50.  
  • 51.
    • 6.1 下面我们开始定义一个基于 NBear.IoC 的 Service 。我们先要为 ServiceInterfaces 工程添加到 distNBear.Common.dll 和 distNBear.IoC.dll 的引用。一个 Service 由一个接口定义。我们这个 Service 的功能很简单,就是我们想获得一些需要的 Category 和 Product 。所以,我们还需要为 ServiceInterfaces 工程添加到 Entities 工程的引用。在 ServiceInterfaces 工程中定义接口 ICategoryService 和 IProductService 如下:
  • 52.
    • 6.2 定义完 Service 接口,我们还需要实现它。在 ServiceImpls 工程中,添加到 Entities , ServiceInterfaces 和到 distNBear.Common.dll , distNBear.Data.dll 和 distNBear.IoC.dll 的引用,分别实现这两个接口如下:
  • 53.
    • 7.1 编译 ServiceImpls 。我们就可以准备在 website 中使用 Service 了。为 website 添加到 Entities 、 ServiceInterfacs 、 distNBear.Common.dll 、 distNBear.IoC.dll 的引用。
    • 注意,这里无需为 website 添加到 ServiceImpls 的引用 。想想为什么?如果 website 依赖 ServiceImpls 的实现代码,那么就不叫 IoC 了。 IoC 的核心是基于容器的依赖注入。换句话说,我们只需要在配置文件中指定一个 Service 的接口和对应的实现类的位置,从而使得 Service 的调用者与 Service 的实现者松散耦合。但是, 为了能让我们的 website 能根据配置文件找到 Service 的实现类,我们还是需要复制 ServiceImpls 编译输出的 ServiceImpls.dll 到 website 的 Bin 目录中 。
  • 54.
    • 7.2 接着,我们需要在 Web.config 中配置 IoC 容器。 NBearV3 的 IoC 组件使用 castle 作为 IoC 容器,因此,可以使用标准的 castle 配置与法进行配置。不过一般,只需要使用下面这样最简单的语法就行了:
  • 55.  
  • 56.
    • 7.3 接着,在 Default.aspx.cs 文件中的 PageLoad 中,添加下面的代码,访问 Service 。
    • 注意,所有的 Service 只需简单地从 ServiceFactory.GetService<ServiceType>() 得到。然后就能使用了。
  • 57.  
  • 58.
    • 在 website 中,您一定注意到,我们使用 NBear.IoC.Service.ServiceFactory.Create() 方法获得了 ServiceFactory 实例,并通过他获得 Service 接口的实现类实例。
    • 在实际的项目中,您也无需在一个统一的地方定义全局的 ServiceFactory 实例引用, 可以在每一个需要 ServiceFactory 实例的地方直接调用 ServiceFactory.Create() ,因为 ServiceFactory.Create() 内部实际上使用了 Singleton 模式,它总是返回的唯一的一个 ServiceFactory 实例 。
    • 同时,除了在 website 中通过 ServiceFactory 访问 service 之外,在某一个 Service 的实现代码中,也可以访问 ServiceFactory.Create() ,从而访问另一个同样在 Web.config 的 castle 块中配置的 service 。这样,当不同的 Service 实现程序集之间互相调用 Service 时,只需要互相引用 Service Interfaces , Service 的实现代码互相就能避免任何依赖,从而将模块间的耦合度降至最低。
  • 59.
    • 重点介绍
      • ORM 模块
      • IoC 模块
      • NBear.Web 提供
      • NBearLite
  • 60.
    • 本教程结合实例演示 NBear.Web 提供的 Page/MasterPage/UserControl 扩展基类。您将看到,使用这些基类能大大提高 ASP.NET 2.0 网页开发速度,轻松获得 Ajax 和多语言支持等功能。对应的源码包含在从 sf.net 下载的 zip 包中的 tutorialsWeb_Tutorial 目录中。 内容目录 1 、 Helper Methods - 辅助 Web 常用方法 2 、 ClientScriptFactory - 辅助生成客户端 JS 脚本 3 、 LoadResources()/GetString() - 多语言支持 4 、 AjaxHelper - 基于 UserControl 的 AjaxHelper 集成
  • 61.
    • 本文讨论的内容只涉及 NBear.Web 这一个程序集,如果要在您自己的 Web 项目中使用本文所讨论的功能,只需要添加到 NBear.Web.dll 的引用。 NBear 是一个基于 .Net Framework 2.0/C# 2.0/ASP.NET 2.0 的框架,因此,本文讨论的内容只能用于 ASP.NET 2.0 开发。 本文只讨论了 NBear.Web 中由 NBear.Web.UI 命名空间下的 Page/MasterPage/UserControl 这组扩展基类中定义的功能,因此,要在网页中使用这些组件的功能,必须将这些类设为您的 WebForm 页面, MasterPage 页面或 User Control 的基类。 由于为 Page , MasterPage 和 UserControl 这三个基类所作的扩展基本上是等价的,所以,本文下面的内容,主要演示对于 Page 这个基类的扩展功能,对于 MasterPage 和 UserControl 使用方法类似,只需保证使 MasterPage 和 UserControl 继承相应的基类即可。
  • 62.
    • 示例代码中的 HelperMethodsDemo.aspx 页面演示了一组 NBear.Web.UI.Page 基类的扩展辅助方法。 1) GetIntParam()/GetStringParam()/GetDateTimeParam() 。这组方法用于方便地获取从 QueryString 和 Form 传递而来的参数。如果网页包含相同键值的 Form 参数和 QueryString 参数,则优先返回 Form 参数。 下面的代码简单的使用这组函数,并输出参数的值:
    • 注意,这组函数包含两个参数,第二个参数指定默认的错误返回值,如果指定的键值不存在,或类型转换失败,则返回该错误返回值。
  • 63.
    • 2) StrongTyped<IEntityType>() 。该方法用于将一个任意类型的对象转换为指定的强类型对象,从而简化形如 (ReturnType)obj 这样的语法。该方法尤其适合于用于页面的数据绑定表达式中,代替基于反射的 eval 语法。 下面的示例将一个弱类型的 Session 值转换为一个强类型的对象:          Session[&quot;hello time&quot;] = DateTime.Now;         Response.Write(string.Format(&quot;Test StrongTyped&lt;T&gt;(), current time ticks = {0}<br />&quot;, StrongTyped<DateTime>(Session[&quot;hello time&quot;]).Ticks));
    • 3) TextToHtml()/ToXXXString() 。这组方法帮助进行常见的字符串转换。执行示例页面可以看到其中两个方法的演示,这里就不列举了。
  • 64.
    • 可以通过 Page.ClientScriptFactory 访问一组用于生成客户端 JS 脚本的服务端方法,包含了常见的一些 JS 代码的构造封装。在服务端构造客户端 JS 的好处可以使得构造客户端脚本的过程获得编译期的错误检测,避免手写 JS 代码的一些不小心的不那么容易调试的错误。 示例代码中的 ClientScriptFactoryDemo.aspx 页面演示了使用 ClientScriptFactory 的两种典型场景。 一种是在 aspx 页面中直接输出脚本。例如:
  • 65.
    • 该语句将直接向页面输出一个 <script> 块,包含一个 alert 效果。注意,如果不使用 WrapScriptTag 的话,自然生成的脚本就不会包含在一个 script 中,当在某一段 script 块中插入部分 JS 片段时,不需包含 WrapScriptTag 。 第二种也是非常常见的使用方法,则是在页面的某个 Postback 方法执行完毕后,直接在事件处理函数中 Response 一段脚本,给出一个客户端提示。例如,下面的代码在一个事件处理函数中输出了一段相对复杂的客户端 JS 脚本:        
  • 66.
    • 这组方法提供了基于 .resx 和 .resources 资源文件,支持多语言网站构架的功能。 Global.asax 和 GlobalizationDemo.aspx 页面演示了这组方法的使用。 注: ASP.NET 2.0 本身就提供了很不错的多语言支持方案,本组件中提供的可以作为另一个选择,但是一般还是推荐使用 ASP.NET 2.0 默认提供的方案。 在 Global.asax 中的 Application_Start 事件中,初始化资源为一个默认语言:
  • 67.
    • AjaxHelper 源自 Teddy 以前的一个同名 Ajax 框架。原来的实现基于对 prototype 这个开源 Ajax 实现的封装,实现了 ASP.NET 下基于 UserControl 实现各种 Ajax 效果的功能。自动 ASP.NET 2.0 发布以后, Teddy 已经将 AjaxHelper 完美集成到 NBear 中的扩展页面基类中,并且使用 ASP.NET 2.0 内置的 Callback 机制代替原来的 prototype 依赖。 集成到 NBear 使得基于这个集成本版的 AjaxHelper 的使用更简单优雅。 示例代码中的 AjaxDemo.aspx 和 AjaxDemo2.aspx 这两个页面演示了集成到 Page 基类的 Ajax 功能的使用。 NBear 中目前这个 AjaxHelper 支持两中使用模式。 模式一,不支持浏览器刷新模式。 所谓不支持浏览器刷新指的是,在打开页面,并以该模式执行了某些 Ajax 效果后,如果点击浏览器的刷新按钮,或者按 F5 ,页面状态会回复到初始载入状态。
  • 68.
    • 重点介绍
      • ORM 模块
      • IoC 模块
      • NBear.Web 提供
      • NBearLite
  • 69.
    • NBearLite 是一个 .NET 2.0 开源 (BSD 协议 ) 通用数据访问组件,支持 SQL Server 、 Oracle 、 MS Access , MySQL , SQLite , PostgreSQL 等多种数据库的透明切换(改变数据库类型时无需修改具体的查询代码)。 NBearLite 实现了一套类似 LINQ 的强类型数据库查询语法 ( 支持从简单的 CRUD 查询到 GroupBy 、 InnerJoin , Paging , SubQuery 等常用复杂查询 ) 。 NBearLite 提供的代码生成工具还可以为您自动生成所有的存储过程调用包装代码,可以让您像使用一个 .NET 类的方法一样访问存储过程(支持 SQL Server , Oracle , MySQL , PostgreSQL 数据库)。
    •  
    • NBearLite 不是一个 ORM 工具,它不涉及实体类, NBearLite 的所有查询返回 Scalar/DataSet/IDataReader 等 ADO.NET 原生数据类型。
    •  
    • 推荐在使用 NBearLite 的同时结合使用 NBearMapping 进行 IDataReader/DataRow 数据类型和自定义 .NET 类 ( 如:实体类或业务类 ) 之间的填充转换,以及任意自定义 .NET 类和自定义 .NET 类之间的数据映射转换(如异构系统间的数据类型整合)。
  • 70.
    • 本演示使用 Visual Studio 2005 创建一个 Web 程序,使用 NBearLite 查询 SQL Server 2000 自带的 Northwind 数据库的典型过程。对于 WinForm 程序开发者而言,同样具有参考价值,只需注意在 WinForm 程序中应用程序配置文件为 App.config ,而 Web 程序中为 Web.config 。
  • 71.
    •   在 VS2005 中新建一个 Website ,为 Website 新建一个 App_Code 目录。
    •  
    • 在 Default.aspx 文件中新建一个名叫 GridView1 的 GridView 控件和一个名叫 GridView2 的 GridView 控件。
  • 72.
    • 修改 Web.config 文件,在 <configuration> 中添加一个下面的 <connectionStrings> 配置节 ( 如果您使用的是其他数据库,请参考 配置 ConnectionString ) ,请注意修改其中访问您本地 SQL Server 数据库的帐号密码。
    •  
    • <connectionStrings>
    •    <add name=&quot;Northwind&quot; connectionString=&quot;Server=(local);Database=Northwind;Uid=sa;Pwd=sa&quot; />
    • </connectionStrings>
  • 73.
    • 为 Website 项目添加 NBearLite.dll 引用 ( 位于下载的 zip 包的 dist 目录 ) ,如果您使用的是其他数据库类型,您可能需要引用额外的 dll ,请访问 NBearLite 支持的数据库 。
  • 74.
    • 运行 QueryColumnsGenerator.exe 工具 ( 位于下载的 zip 包的 dist 目录 ) 。
    •  
    • 在该工具的主界面上的 Connection String 文本框内输入 Server=(local);Database=Northwind;Uid=sa;Pwd=sa ( 请注意修改其中访问您本地 SQL Server 数据库的帐号密码 ) ,在 Root Class Name 文本框内输入 Northwind 。
    •  
    • 点击 Connect 按钮,左边的列表会显示所有的表和视图。
    •  
    • 点击左上角的 CheckBox ,选中所有的表和视图。
    •  
    • 选择输出语言为 C# 。
    •  
    • 点击 Generate Code 按钮,您将看到 output 文本区域显示了生成的 C# 代码。
    •  
    • 点击 Save Output As 按钮,将生成的代码保存到你的 Website 工程的 App_Code 目录中,文件名为 Northwind.cs 。
  • 75.
    • 在 Website 工程中,刷新项目文件,您将看到 App_Code 目录中的 Northwind.cs 文件。
    •  
    • 编译 Website ,如果编译成功,没有任何错误或警告,则代表生成的代码和之前对 NBearLite.dll 的引用都正确。
  • 76.
    • 打开 Default.aspx.cs 文件,在文件顶部添加两个 using 如下:
    •  
    • using NBearLite;        // 这个是 NBearLite 的命名空间
    • using QueryColumns;        // 这是生成的查询辅助类的命名空间,如果您希望使用别的命名空间,可以在步骤 4 的工具界面修改 Output Namespace 文本框的内容,指定您要的命名空间。
    •  
    • 在 Page_Load 事件方法处理中添加如下代码, 实例化 Database 对象 :
    •  
    • Database db = new Database(&quot;Northwind&quot;);
  • 77.
    • 在 Page_Load 事件处理方法中继续添加如下代码 ( 这里只是简单的读取数据,更多复杂查询语法,请参见 NBearLite 查询 ) :
    •  
    • GridView1.DataSource = db.Select(Northwind.Categories).ToDataSet().Tables[0];        // 读取所有的 Categories
    • int ret = -1;
    • string outStr = &quot;1&quot;;
    • GridView2.DataSource = Northwind.SalesByCategoryTest(db, out ret, &quot;test1&quot;, &quot;1997&quot;, ref outStr);        // 调用存储过程
  • 78.  
  • 79.  
  • 80.
    • 应用工具介绍
      • ConfigurationEncrypter
      • EntityDesigns
      • EntityDesignToEntity
      • NBearVsPlugin
      • DbToEntityDesign
  • 81.  
  • 82.  
  • 83. Thank you!

×