高级OData/WCF数据服务任务指南

WCF数据服务是一个强大的工具,但同时也存在一些限制。本文将介绍这些限制,并展示如何通过创建自定义数据服务提供者、定制服务引用生成等方法来解决这些问题。

WCF数据服务的局限性

WCF数据服务虽然功能强大,但目前存在一些关键的局限性:

  • 难以将多个数据源聚合到一个单一的数据服务中。
  • 很难将WCF数据服务与标准的WCF服务相结合。
  • 不生成服务操作的客户端代理。
  • 还有一些更微妙的局限性,将在后面看到。

运行示例服务

以下是如何开始使用示例服务的步骤:

  1. 打开CompositeDataServiceFramework解决方案。
  2. 双击文件Samples > Composite Data Service Sample > CreateDatabases.sql。
  3. 运行此脚本(如果没有安装完整的MS SQL Server,可以使用SQL Server Express Edition作为数据库平台)。
  4. 运行CompositeDataServiceSample项目。
  5. 浏览到http://localhost:65110/CompositeDataServiceSample.svc/$metadata,可以看到CompositeDataService已经将Orders和Users数据服务组合成一个单一的数据服务,并且该服务是完全可用的。

复合数据服务框架

考虑到这些局限性,创建了一个名为复合数据服务框架的项目。该项目的主要目的是允许将多个数据源聚合在一起,创建一个单一的复合WCF数据服务,如下图所示。

创建复合数据服务

创建复合数据服务非常简单。首先,为每个要公开的模型添加一个WCF数据服务类 - 在提供的示例解决方案中,有两个模型 - OrdersDataModel和UsersDataModel。这些模型是实体框架数据模型。现在创建另一个WCF数据服务,命名为CompositeDataService。现在所需要做的就是派生自CompositeDataService并添加每个不同的WCF数据服务作为CompositeDataSource。

通过向应用程序添加WCF数据服务来创建复合数据服务:

public class CompositeDataServiceSample : CompositeDataServiceFramework.Server.CompositeDataService { private WcfDataServiceDataSource ordersDataService; private WcfDataServiceDataSource usersDataService; }

接下来,像初始化任何正常的WCF数据服务一样初始化服务 - 指定每个对象和操作的访问权限。

public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.All); config.SetServiceOperationAccessRule("*", ServiceOperationRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; }

在构造函数中,构建两个数据源并将它们添加到复合数据服务中,然后初始化它。

public CompositeDataServiceSample() { ordersDataSource = new WcfDataServiceDataSource(new OrdersDataService(), new OrdersModelContainer(), new Uri("http://localhost:65110/OrdersDataService.svc")); usersDataSource = new WcfDataServiceDataSource(new UsersDataService(), new UsersDataModelContainer(), new Uri("http://localhost:65110/UsersDataService.svc")); AddDataSource(ordersDataSource); AddDataSource(usersDataSource); Initialise(); }

它是如何工作的?

这个项目中已经有很多代码了,随着构建完整的功能集,还会有更多的代码。因此,将以更高层次的方式描述代码,而不是像大多数文章中那样逐行讲解。

首先,派生一个类自DataService。这将是代表复合数据服务的主要对象。这个对象还必须实现IServiceProvider接口,以允许实例化支持接口的实例。

  • IDataServiceMetadataProvider接口暴露了有关服务本身的信息 - 它公开了哪些集合,它公开了哪些对象类型,它的服务操作,以及对象之间的关系。
  • IDataServiceQueryProvider接口允许实际查询数据服务中的数据。其中最重要的函数是GetQueryRootForResourceSet,它必须返回一个IQueryable,用于特定的资源集。
  • IDataServiceUpdateProvider接口暴露了函数,以启用在元数据提供程序中定义并在查询提供程序中公开的数据的操纵。它允许更新、删除等数据。

保持最新

复合数据服务框架托管在CodePlex上:。项目的主要页面上有路线图。欢迎任何建议或想法!随着这个项目的发展,将完成以下任务:

  • 允许将实体框架模型用作复合数据源 - 无需首先通过WCF数据服务公开它。
  • 允许将标准CLR对象的集合用作复合数据源。
  • 演示通过创建一个特殊的属性来定制客户端服务引用的创建,该属性在客户端标记一个属性为仅客户端。
  • 演示在添加服务引用时如何自动生成服务操作代理。
  • 展示如何通过自定义模板扩展Visual Studio,用于项目和项目项,并展示如何使用向导自定义这些项目的生成。
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485