1. 介绍
微软Silverlight(银光)为构建RIA(富互联网应用)提供了强大的基础。本文中介绍的微软.NET RIA服务进一步简化了LOB(行业)RIA的开发。 它们补充了.NET框架和Silverlight中现有的数据访问层和表现组件。它们建立在ASP.NET基础之上,编码、衍生和支持WEB应用中的一些共同模式。
.NET RIA服务通过框架、工具和服务来处理构建N层应用的复杂性。框架组件支持书写应用逻辑和验证的说明性模式,这样就能容易地用于表现层。 工具通过在一个单一的解决方案中链接客户端和中间层项目,以及在客户端项目中启用智能代码生成来增强现有Visual Studio的能力。 伴随的服务利用了说明性模式来支持常用功能,如认证和用户设置管理。
在本文中,我们将查看.NET RIA服务预览的主要方面。 在本节,我们将介绍构建N层RIA面临的挑战和迎接这些挑战的方法。下列章节作为一组以任务为焦点的快速入门来概述核心特征。 它们补充了那个通过一个简单但详细的例子来介绍.NET RIA服务的详细贯通实例。
1.1 在N层应用中使用数据面临的挑战
行业应用使用的数据需要跨层流动。 它可以通过基本的创建、读取、更新和删除(CRUD)操作来建立和使用,也可以通过以封装形式存在的特定领域的定制操作来访问,如费用报告的审批操作。 在互联网应用中,客户端和中间层服务器间有一个信任边界。 因此,重要的是有一套程式化方法来向客户层表达什么资源是可用的及什么操作是容许的。还有,如果资源在客户端容易得到,操作能够从表现层以最小的代价调用,那么就对生产力有帮助。
除定义资源和操作外,开发人员需要在数据创建或更新时对其进行验证。验证需要在表现层进行,以便向用户给出及时的反馈;还要在中间层进行,以便保证为应用定义的规则得到执行。 这样,可能既有跨层的共同验证,也有特定于层的验证,需要与资源和操作整合。
最后,应用常常需要可能与其它应用共享的服务和因太常见而不必重复的服务。认证、角色、用户设置就是一些需要的服务。 它们需要加以管理并与N层应用中资源和操作的使用整合。
图1显示了一个N层应用的简化版本。 .NET RIA服务集中在视图和数据访问层(DAL)间的框上,以对付上面所概述的多层挑战。
接下来,我们将看看用于对付这些挑战的关键价值主张和核心结构。
1.2 价值主张
核心价值主张是:
1. 支持数据的端到端使用
2. 应用的客户端和服务器部分的统一开发过程
3. 通过一组说明性的模式和针对常见场景的服务来提高生产力
.NET RIA服务集中在数据的端到端使用。 它可以通过你选择的数据层(DAL)来提取。它可以通过调整以供表现层使用,还可附注适当的元数据以供验证和访问控制。 新的框架组件通过一组受控的操作来支持数据和元数据跨层流动。
.NET RIA服务通过提供一套一并建立应用的多个层的工具来简化跨层和信任边界的应用开发。应用逻辑仍然知道层和信任边界,但是它利用了.NET和Silverlight在各层的能力,并且利用了早先描述的数据和元数据的端到端流动。 代码生成和共享代码通过提供多种共享逻辑选择来增强体验,同时尊重层和信任边界。
.NET RIA服务定义和支持一种模式来呈现一组资源上的操作。开发人员创作一个DomainService来定义一组资源上的操作。 框架和工具协同为相应的客户层产生代码,可用于数据绑定和验证等。 认证服务和用户设置可现成地与操作和资源一起使用。模式和服务以ASP.NET等同物为基础,扩展一些共同的ASP.NET WEB应用模式,以与Silverlight使能的更丰富的表现层一起使用。 当前预览版主要通过与Silverlight端到端的体验,其次通过一基本的html视图的早期一瞥,来说明这种模式。它既包括对实体框架和LINQ to SQL数据访问层的直接支持,也包括对用户所创建对象的直接支持。 但是,它的设计是跨不同表现层技术和访问层的,如图2所示。
1.3 关键概念
本节概述一些核心概念。 它们在贯通文档和下面的章节中会更详细地论述。
创建操作的主类是DomainService(领域服务)。 下例显示一个人力资源应用的名为HRService的DomainService。它派生自针对LING to SQL数据访问层的.NET RIA服务基类(LingToSqlDomainService), 并带有LING to SQL数据场景类型(AdventureWorksDataContext)的参数。它包括三种操作: 一个用于查询,一个用于更新,还有一个作为定制操作来审批安息日。
操作定义在实体(即带有由键定义的标识的对象)上。数据访问层里使用的Employee(员工)实体也被HRService使用。 开发人员可以添加可选的元数据来调整实体或验证其属性。
[EnableClientAccess]
public class HRService :
LinqToSqlDomainService<AdventureWorksDataContext>
{
public IQueryable<Employee> GetEmployees()
{
// Restrict access as appropriate
return from e in Context.Employees
where e.SalariedFlag == true
select e;
}
public void UpdateEmployee(Employee currentEmployee)
{
// Check/enforce app-specific rules for changes
this.Context.Employees.Attach(currentEmployee,
this.ChangeSet.GetOriginal(currentEmployee));
}
public void ApproveSabbatical(Employee employee)
{
// Ensure that employee has required tenure
// and annual review ratings
}
}
.NET RIA服务注意到应用在此DomainService上的EnableClientAccess(启用客户访问)属性而生成相应的客户层类:与HRService对应的HRContext和Employee实体的客户端版本。这些类概述如下。 DormainContext类与生成的实体类协作以提供基本的服务如调用操作、聚积结果、识别对象和跟踪变化。 EntityList为数据绑定提供丰富的集合。
public sealed partial class HRContext : DomainContext
{
. . .
public EntityList<Employee> Employees { . . . }
// Creates an EntityQuery corresponding to the GetEmployees
// Query operation
public EntityQuery<Employee> GetEmployeesQuery() { . . . }
public void ApproveSabbatical(Employee emp) { . . . }
. . .
}
public sealed partial class Employee : Entity
{
…
}
除上述外,开发人员还可以将共享代码用于验证或其它目的。 图3显示构建模块的概念流程。
1.4 路线图
一个分别的贯通例文档为实做学习提供了最佳起点。 本文包括额外的快速入门,描写概念并概述如何完成特定的重点突出的任务,以补充那个贯通例。它们对发布在其它地方的例子进行补充。
本概述含盖下列内容:
1. 基本概念和共同任务: 第2-15节
2. 高级概念和特殊任务: 第16-22节
3. 与ASP.NET和ADO.NET一同使用DomainService: 第23-24节
4. 与2009年5月的CTP相比的重大变化: 第25节
1.5 2009年7月的CTP中的新内容
这里是2009年7月的CTP中新内容的列表:
1. 一个新的改进了的在客户端处理操作的模型——你可以更容易地为操作指定回调函数和事件,跟踪其状态和取消它。
2. 改进的类库支持
3. 生成代码中的扩展点
4. 更清晰的用户模型和对应用服务更好的扩展支持
5. 更强的DomainDataSource能力,以处理分页和更新。
6. 更清晰的共享代码支持
7. 第一波ADO.NET数据服务结合(把DomainService增加到DataService,以编写应用逻辑和将DomainService表现为DataService)。
8. 修正缺陷并改进服务器上的初始性能。