• [织梦吧]唯一域名:www.dedecms8.com,织梦DedeCMS学习平台.

当前位置: > 编程与数据库 > net编程 >

OData的实际应用-通过开放数据协议构建富Internet应用程序(2)

来源: www.dedecms8.com 编辑:织梦吧 时间:2012-06-27点击:

另一项用户期待的功能是投影查询结果返回的实体的属性子集。为此已经添加了 LINQ 支持,这种支持通过 LINQ Select 语句实现。这有两方面的好处:可以减小 HTTP 查询响应的大小,还可以减小客户端方对象的内存占用量。当您针对别人的服务开发客户端应用程序,而且该服务中每个实体都有很多对客户端无意义的属性时,这就特别有用。我将在后文中演示如何使用有很多实体、每个实体又有无数属性的大型公共服务。示例中的投影非常有用,因为它只包括一个实体上的少数几个必需的属性。

为了帮助您了解 OData 生态系统的价值,我们将创建一个 Web 应用程序,让访问者浏览一家虚拟的房地产公司 Contoso Ltd. 的网站,查看其管理的房产销售清单。

 

关系数据

Contoso.com 的 Home Finder 应用程序的主要数据源是一个 SQL Server 数据库,其中包含该公司管理的所有房产的信息,以及为这些房产发布的所有销售清单(在售的和已售出的)。

借助 .NET Framework 3.5 SP1 中提供的 WCF 数据服务和 ADO.NET 实体框架,很容易将关系数据库作为 OData 源提供,所需的只是在关系数据上创建实体框架模型。OData 源是基于 HTTP 的,因此您需要一个网站或 Web 服务来托管该服务。

若要在关系数据上创建 OData 源,第一步是在 Visual Studio 2010 中创建 ASP.NET Web 应用程序以托管 OData 服务。在 Visual Studio 中,选择“文件”|“新建”|“项目”|“ASP.NET Web 应用程序”。这将创建用来托管 OData 源的 Web 服务的框架。

创建并配置 Web 服务后,我们接着创建 OData 源将提供的实体框架数据模型。Visual Studio 提供了“添加新项”向导,帮助您从现有的数据库自动生成模型,从而让操作变得很容易。图 1 显示了使用“添加新项”向导根据 SQL Server 数据(包含 Contoso 管理的房产和销售清单)创建的简单数据模型。

图 1 关系数据的实体框架数据模型

现在让我们来创建一个 WCF 数据服务,将此数据模型作为 OData 源提供。Visual Studio 在“添加新项”向导中提供了 WCF 数据服务选项,可帮助您轻松完成此操作。选择此选项后,Visual Studio 提供了一个代码文件(在此示例中,此文件称为 Listings.svc.cs),用于配置数据服务。

图 2 中的代码演示了如何定义 WCF 数据服务。Listings 类是提供数据服务的服务类,实现了泛型 DataService<T>。图 2 中用于定义 DataService<T> 的类型是 ListingsEntities 类型,就是图 1 中创建的实体框架上下文。由于这个类将接受实体框架上下文,因此这种方法可以快速简便地启动并运行用来提供关系数据的 WCF 数据服务。但是 DataService 类并未局限在只是处理实体框架上下文,该类将接受实现 IQueryable 接口的任何 CLR 对象集合。在 .NET Framework 4 中,已添加了针对 WCF 数据服务的新的自定义提供程序模型,以便使用几乎所有数据源来创建服务。

图 2 定义 WCF 数据服务

// The ListingsEntities is the Entity Framework Context that the Service exposes
public class Listings : DataService< ListingsEntities >
{
public static void InitializeService(DataServiceConfiguration config)
{
// These lines set the access rights to "Read Only" for both entity sets
config.SetEntitySetAccessRule("Listings", EntitySetRights.AllRead);
config.SetEntitySetAccessRule("Properties", EntitySetRights.AllRead);

// There are currently no service operations in the service 
config.SetServiceOperationAccessRule("MyServiceOperation", 
ServiceOperationRights.All);

config.DataServiceBehavior.MaxProtocolVersion =
DataServiceProtocolVersion.V2;
}
}

 

About D8

  • ©2014 织梦吧(d8) DedeCMS学习交流平台
  • 唯一网址 www.DedeCMS8.com 网站地图
  • 联系我们 1170734538@qq.com ,  QQ