现在的位置: 首页 > 综合 > 正文

理解N层Silverlight应用程序——微软 .NET RIA SERVICES Framework 白皮书(简译)

2013年01月18日 ⁄ 综合 ⁄ 共 3415字 ⁄ 字号 评论关闭

(文章出自微软RIA Services Framework 7月版白皮书,边读边译,未作润饰,语句不尽通顺合理,但绝不影响理解,仅以此让大家对该框架有个简单了解)
 

理解N层Silverlight应用程序

微软 .NET RIA Services 通过将Asp.net和Silverlight相结合来简化传统的多层应用模式。使用queries,updates,自定义方法和服务操作,将应用逻辑代码在中间层编写, .NET RIA Services 特性自动在客户端产生相应的代理类来调用这些操作,因为中间层和客户端都是基于同一CLR,开发者可以编写代码在两端都能运行。

本文档通过构建一个简单的多层应用来解释关键概念。

 

1.1 建立一个工程

通过建立一个Silverlight的Web应用工程来开始一个 .NET RIA Services多层应用。File | New Project[1]:

image

从上述对话框开始,如果.NET RIA Services 已经安装了,则可以看到如下对话框高亮标记的复选框:


[1] 可以使用Add New Project在已经存在的web应用程序中添加Silverlight应用程序。

image

缺省情况下该复选框没有选择,要使用.Net RIA Services创建多层应用,我们必须手工选择它。

解决方案结果如下所示:

image

 

此时,我们建立了一个有2个工程组成的一个解决方案:

1. SilverlightApplication1 – 此工程包括Silverlight代码,我们把此作为客户端工程,也就是我们的客户端层

2. SilverlightApplication1.Web – 此工程为Asp.net Web应用程序代码,是服务端工程,是我们的中间层。

使用Enable .Net RIA Services选择框和标准的Silverlight应用程序的主要区别在于该选择框建立了服务端工程和客户端工程的联系,允许逻辑共用。具体参考后面介绍。

1.2 转换一个存在的Web应用程序(Converting an existing web application)

如上提到,你可以后期改变是否建立“RIA link”. 如下图所示:

image

1.3 从中间层公布数据(Exposing data from the mid-tier

为了解释新功能,我们需要在中间层准备一些有效的数据

1.4 从中间层访问数据

这个例子,中间层需要使用数据库中数据,数据库不是.Net RIA Services必须的,客户端对数据访问计数及它的结构并不关心。

在中间层使用数据库,我们使用实体框架来访问AdventureWorks示例数据库,我们在服务器端工程上添加新项,然后选择Data分类:

为该应用程序从数据库中选择两个表

image

 

为该应用程序从数据库中选择两个表

 

image

1.5 在中间层建立一个DomainService

现在到了关键的步骤来演示.Net RIA Services框架的特性来。在中间层建立一个DomainService. 一个 DomainService是用来公布特定数据域(a specific data domain)实体和操作的类,也是开发者添加应用逻辑的地方。.NET RIA Services框架包括管道代码(plumbing code)使在DomainService类中声明的实体和操作在其他层可以访问。

我们通过模板来建立样例的DomainService(添加新项目/Web分类/Domain Service),并设置该DomainService的名字为 ProductService:

image

模板请求一个向导帮助构建DomainService类,此例我们选择刚建立的模型,并且公布一个实体:Product,不选择“Enabled editing”,表示Product实体只读。

(译注:必须Build一下才出现下面列表)

image

 

确认对话框,新的DomainService将在选择的工程中建立。下面是生成的代码:

 

image

注意生成代码的特征:

- 此类继承自 LinqToEntitiesDomainService,(内建于 .NET RIA Services 框架中的基类)[1].

- 该泛型基类和我们先前建立的AdventureWorks_DataEntities 关联。

- 该DomainService 类标记 [EnableClientAccess] 特性表明对客户端层可见

- 产生一个 GetProduct() 唯一的查询方法,用来公布Product实体。

- GetPruduct()实现代码从AdventureWorks_DataEntities 对象上下文获得数据

这个新的DomainService 类是我们添加应用逻辑的地方。例如,我们可以修改GetProduct()方法来仅选择库存中的产品。或我们可以添加参数指定那个产品分类。

最重要的是读中间层数据提供了公共接口,向导生成的代码仅仅是个起点,我们要在此添加应用逻辑。

其次,事实上不需要任何修改,我们可以运行应用程序,Product实体在客户端和中间层都可见,下面我们将介绍是这成为可能的机制。


[1]The .NET RIA Services framework has base classes for the Entity Framework and LINQ to SQL. It also has a technology-agnostic DomainService base class.

1.6 从Silverlight客户端访问数据

还会想起当我们创建工程的时候的 “RIA link”吧?现在它起作用了。

如果我们编译解决方案,并在客户端工程上单击 “Show All Files”,则可看到:

image

 

注意到客户端工程有一个包含生成的文件的文件夹Generated_Code. 上面截屏上显示了这个文件的几行代码。

这个生成的文件包含我们称之为客户端代理的类,这些类是由服务端的DomainService类综合生成的。

这种机制我们将在 “理解Silverlight客户端代码生成“章节介绍。这里我们要意识到:

· 这些代理类只要服务端DomainService类修改或客户端或解决方案重新编译的时候会重新生成,所以不要修改此类因为它们会被覆盖。

· 为每个DomainService类产生独立的代理类,本示例是Product实体。

·一个生成的DomainContext类用来提供客户端访问每个DomainService类公布的操作。本例中,生成一个ProductContext 类, 并且公布了一个 GetProductQuery() 方法,用来作为一· 个 DomainContext.Load() 方法的参数请求服务端的ProductService DomainService类的GetProduct查询方法。具体参见 “How to Query Entities.”

1.7 在Silverlight客户端使用数据

服务器端每一个标记[EnableClientAccess]自定义特性的DomainService类都会在客户端生成的文件中生成一个DomainContex类。 Silverlight客户端可以实例化这些DomainContext类并与之交互,下面例示在一个网格中显示产品信息:

像下面这样添加一个DataGrid到客户端工程中:

image

 

 

然后再后端代码文件中实例化生成的DomainContext,从服务端检索数据并绑定到DataGrid:

image

 

 

这时运行应用程序,显示如下:

 

image

 

1.8 小结

本章节概述了使用.Net RIA Serives框架构建多层Silverlight应用程序中关键概念 :

· 一个标准Silverlight Web应用程序可以通过建立“RIA Link”和Web应用程序之间建立多层应用程序。[1].

· 这个多呈应用程序最简化形式是由一个单一解决方案中的两个独立工程组成,一个是Asp.net 服务器工程(中间层),另一个是Silverlight客户端工程(客户端)

· 服务端的一个DomainService类公布一系列实体和操作,开发者在这个类里进行应用多级的定制。

· 当解决方案编译的时候,服务端端DomainService公布的实体和操作对应的客户端代理类自动生成并加入Silverlight客户端工程。

· Silverlight客户端代码与生成的DomainContext交互获得或操作相应的实体。

· 客户端和服务端操作一套共有的实体类型,使跨层共享业务逻辑和验证规则成为可能。


[1] 在工程建立期间选择 “Enable .NET RIA Services” 复选框

抱歉!评论已关闭.