毕业论文——CF数据服务的多层开发_第1页
毕业论文——CF数据服务的多层开发_第2页
毕业论文——CF数据服务的多层开发_第3页
毕业论文——CF数据服务的多层开发_第4页
毕业论文——CF数据服务的多层开发_第5页
免费预览已结束,剩余16页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

CF数据服务的多层开发到目前为止,我们花了整本书通过示例说明如何在连接状态使用数据,也就是说,直接连接到数据库,并以直接的方式处理数据。虽然这在很多情况下没有什么神秘的,越来越多的业务和应用程序需要工作在断开连接,多层环境下来支持SOA(面向服务架构)领域不断扩大。微软通过.Net Fx3.0,推广WCF真正进入了这个领域,选择提供整个企业的沟通能力以及网络的.Net技术去构建快速的SOA应用程序已迅速得到认可。紧跟着.NET RIA服务之后,在ASP.NET和Silverlight平台上提供一个简单的方法开发多层应用程序。.NET RIA服务的目的是提供一个简单的开发模式,重点是控制数据访问通过管理进行查询,修改和自定义业务数据访问中间层应用程序逻辑。紧跟着WCF和.NET RIA服务(而不是被遗忘)的ADO.NET数据服务,为开发人员提供依据公开数据作为通过URI的资源寻址来创建和访问数据web服务的能力。ADO.NET 数据服务还使用实体数据模型和实体关系公约来公开基础源的实体,从而使开发人员能够在熟悉的实体概念中工作。在过去的几年里,微软已经意识到,这三种技术之间有一些共性,并且花费更多的时间工作,以更好地支持那些需要丰盛的和灵活的解决方案的应用程序类型。因此,微软做出某些名称变更,以更好地协调这些技术。因此,ADO.NET数据服务是现在的WCF数据服务,.NET RIA服务是现在的WCF RIA服务。这是正确的微软正在构建他们所谓的“一站式服务点”的构建和部署服务和多层应用程序。因此,这一章我们将专注于 WCF 数据服务,开始讨论了如何创建和测试在关系数据库中使用实体框架的数据服务。我们将着眼于WCF数据服务功能和如何使用WCF数据服务的基础数据的几个例子。我们将花本章的剩余部分通过一个例子使用该服务,然后使用该服务来查询关系数据并使用WinForms前端显示数据。构建 WCF 数据服务书中所有的例子,主要是通过创建一个WinForms应用程序的数据模型开始。如前文所述,这种方法可能会工作在某些要求一个应用程序在离线模式下操作的环境下,也就是说,在多层环境中。然而,本章的例子中,将改变方向,因为它将使我们能够看到WCF数据服务与EF交互,我们也会看到他们的交互所提供的功能。首先,打开Visual Studio 2010并创建一个新的ASP.NRT Web应用程序项目,如图11-1所示。图 11-1 创建 ASP.NET web 应用程序在图11-1中我使用默认的项目名称,但你可以自由的改变它。在Add New Item对话框中单击确定。一旦创建了项目,我们现在就有了一个空的和非功能性的web应用程序。然而,我们很快用少量代码来实现它的功能。正如你以前做过很多次,将一个ADO.NET实体数据模型添加到项目中。在添加新项目对话框,如图11-2所示,把模型命名为AWModel ,然后单击添加。在这个例子中,将生成AdventureWorks数据库的模型。如果你没有创建连接到AdventureWorks数据库,你可以继续通过向导,直到你到达在您选择的数据库对象模型包含在向导中的步骤。我们将只选择很少的表帮助展示WCF数据服务功能。图 11-2 添加 ADO.NET 实体数据模型在选择数据库对象向导的步骤,选择以下表: HumanResources.Employee HumanResources.EmployeeAddress Person.Address Person.Contact Person.StateProvince Purchasing.PurchaseOrderHeader Sales.SalesPerson Sales.SalesTerritory 如图11-3 ,保持检查的多元化和外键选项,输入值为模Adventure-WorksModel的命名空间,然后单击完成。这个示例不需要任何存储过程或视图。此时我们有的是包含一个实体数据模型ASP.NET Web应用程序。这没有任何实际功能,但是在这里,我们可以介绍WCF数据服务组件,所以让我们这样做。注意:在向导的选择数据连接步骤中的实体连接设置应默认为Adventure-WorksEntities 。如果它未默认正确则改变这个值,本章中的代码示例将说明此值,如果你保持相同的值它将更容易地跟随和调试应用程序。图 11-3 选择表 右键单击解决方案资源管理器中的项目,向项目中添加一个新的项目。添加新项对话框出现时,选择 Web 选项,然后向下滚动的已安装的模板列表中直到你看到 ADO.NET 数据服务的模板。给此对象命名为 AWService.svc,如图11-4所示,然后单击添加。图 11-4 将ADO.NET 数据服务添加到项目向项目中添加的 ADO.NET 数据服务做几件事情。首先,正如你在图11-5看到的,它添加了一些命名空间委托到你的项目中,System.ServiceModel命名空间是突出显示在图11-5中的其中一个。该命名空间包含生成服务和多层环境中的客户端应用程序所需的所有类和接口。也通过ADO.NET数据服务模板添加到项目中的引用如下: System.Data.Services System.Data.Services.Web System.Data.Entity System.ServiceModel.Web 看到这个列表你可能会想,当一个实体数据模型添加到项目中则System.Data.Entity的引用被添加。这是正确的。然而,如果第一次向项目中添加一个数据服务(在添加实体数据模型之前),然后System.Data.Entity引用也会被自动添加。图 11-5 System.ServiceModel 命名空间其次,很明显通过ADO.Net数据服务模板添加服务本身。如图11-6所示,该服务由AWService.svc和其配套的AWService.svc.cs文件组成。你不能直接打开和修改.svc文件。事实上,如果你双击.svc 文件,将打开其配套的AWService.svc.cs文件。如果右键单击.svc 文件,然后选择打开方式,然后选择 XML 编辑器,您将看到.svc 文件是由简单的单行XML文件组成。与实体框架和 EDM 中不同的是您可以更改底层的 XML,微软 (以及我) 强烈建议您不要修改.svc 文件和其底层的 XML。这完全是因为修改.svc 文件不提供任何的好处。图 11-6 AWService WCF 服务当ADO.NET数据服务被添加到项目中,相关的.cs文件会自动显示在IDE中。图11-7显示ADO.NET数据服务模板为我们生成了什么文件。结果基本上是我们数据服务的开始。图 11-7 数据服务界面正如你在图11-7中所看到,该模版会生成一些指令,为接下来我们需要做什么提供一些指导。首先,我们需要连接数据服务为数据模型提供服务,以便服务知道从哪获取数据。我们知道这样做是因为,正如图11-7所显示的代码告诉我们在哪里。因此,更换代码注释AdventureWorksEntities的名称(看了几页回到关于此值的注释)。当您进行更改时,公共类的代码行将如下所示: public class AWService : DataService 连接我们的数据服务模型是那么简单。不管你相不相信,我们已经准备好测试我们的服务。测试 WCF 数据服务测试WCF数据服务不仅为我们提供了查看我们的应用程序的机会,还有机会探索WCF数据服务的一些功能和EF与WCF数据服务之间的交互。您还将看到我们为什么要构建这一项目在 ASP.NET Web 应用程序。按 Ctrl + F5 以编译并运行该项目。该项目在运行时,web浏览器将打开并显示如图11-8所示。图 11-8 初始测试结果从表面上看,在图 11-8 所显示的结果真的不告诉我们很多,但事实上有一种基于 REST (表述性状态转移) 的服务,在使用实体框架的数据库上运行。虽然如此,这仍然是非常酷的。然而,不能够在浏览器中输出显示我们想要的。我们真正想要看到来自于数据库的数据。当然我们看不到数据,默认情况下,WCF.NET 的数据服务是安全的。WCF数据服务需要明确的告诉它你要查看哪些数据。在代码中的指令告诉我们这一点,因为你可以在图11-7 TODO注释中看到。一些实例甚至提供注释帮助我们,但是这些注释起到提醒作用。我们还需要做一些工作,让我们选择不限制在我们的示例中的任何东西。相反,我们会解锁所有实体。我们这样做是通过将下面突出显示的代码添加到 InitializeService 方法: public static void InitializeService(DataServiceConfiguration config) / TODO: set rules to indicate which entity sets and service operations /are visible, updatable, etc. / Examples: / config.SetEntitySetAccessRule(MyEntityset, EntitySetRights. /AllRead); / config.SetServiceOperationAccessRule(MyServiceOperation, /ServiceOperationRights.All); config.SetEntitySetAccessRule(*, EntitySetRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; 在我们的模型中,突出显示的代码为指定的实体集设置权限。SetEntitySetAccessRule方法接受两个参数。第一个参数是我们要设置权限的实体,而第二个参数是要授予该资源(实体)的访问权限。第一个参数值被指定为“*”,表示为所有实体集设定权限。第二个参数取枚举类型EntitySetRights,它包含以下成员: None: Denies all rights to data access ReadSingle: Authorizes read rights to single items ReadMultiple: Authorizes read rights to sets of data WriteAppend: Authorizes create rights on data items in data sets WriteReplace: Provides rights to replace data WriteDelete: Authorizes deletes on data items from data sets WriteMerge: Authorizes rights to merge data AllRead: Authorizes read data rights AllWrite: Authorizes write data rights All: Authorizes read, create, update, and delete rights on data 在我们的实例中,所枚举的所有权利授予所有实体集。再次运行应用程序,当网页出现时你会看到回传底层模型中的所有实体集列表,如图11-9所示。图 11-9 实体集列表前面我们提到,WCF数据服务是依据公开数据作为通过URI的资源寻址,并且我可以使用任何在图11-9的URIs中看到的数据。通过利用公开的 URlS探讨基础模型中的数据。例如,例如,让我们来看看SalesTerritory资料数据通过使用该实体集相关联的URI,并把它添加到URI的这个页面。通过使用适当的 URI,显示在图 11-10,我们获得所有销售区域列表。图 11-10 销售区域当您尝试浏览销售区域时会有两件事情将要发生。你要么得到的所有销售区域的列表就像你在图11-10看到的,或者你会得到类似图11-11页,表明我们正在接收销售区域的RSS提要。图 11-11 RSS 订阅页面要解决该RSS源的问题,我们需要关闭RSS订阅功能,使用Internet Explorer。用IE浏览器打开时,从工具菜单选项选择打开Internet选项对话框。这个对话框的顶部有多个可能熟悉的选项卡。选择内容选项卡,点击源和网页快讯下的设置按钮。点击设置按钮,将显示设置对话框,在此对话框中您需要取消选中打开源阅读视图复选框,如图11-12所示。此对话框与Internet选项对话框上单击OK。图 11-12 关闭源阅读视图回到 web 页面上,按 f5 键以刷新页面。现在你应该回到销售界面较早前在图 11-10 所示的集合。该列表的数据源是针对销售界面底层的数据库查询的。我们尚未探索所有的服务功能在这仍有很多我们可以做的。例如,着眼于现在显示所有销售区域的页面,怎么返回一个特定的领域。纵观数据,我们可以看到,每个记录包含特定行的ID ,我们可以利用它包括在我们的URI 里。在这个例子中,使用销售区域ID 4 。通过在括号里附加数字4到URI的结尾修改的URI,如示于图11-13。通过加载包括特定记录ID的URI ,可以进一步深入或者返回到刚刚要找的记录。这就像应用WHERE子句的T-SQL查询,在TerritoryID = 4的情况下 。在这种情况下,我已经通过传递对应的ID在URI查询特定销售区域的底层存储。图 11-13 具体销售区域然而这不是所有的。由于我们的服务基于 EDM 实体框架,我们可以很容易的浏览实体之间的相关数据。例如,假设我们想看看有关的具体销售区域的所有销售人员。通过简单地将销售人员实体追加到 URI 的末尾我们可以在实体之间进行导航。通过图11-13和11-10采取一个更好的信息,我们可以看到一些称为链接元素的元素,这意味着目前的销售区域有其他项目,如StateProvince和销售人员的关系。您可以使用这些链接去导航其关系,首先选择你想要的特定销售区域,然后在URI包含特定链接项。图11 - 14显示了这是如何实现的。在这个例子中,我们仍然使用SalesTerritory ID 4,然后我们将销售人员项目添加到URI结尾,它允许我们在给定TerritoryID SalesTerritory与销售人员之间的关系。图 11-14 所选销售区域的销售人员当刷新界面,会出现与销售区域TerritoryID4相关联的所有销售人员。您可能已经猜到了我们可以更进一步向下探索,通过添加属性到URI结尾来带回的特定列数据。我们终究将要你迄今为止我们所做的全部例子。这些都是有趣的,让我们把它带到下一个级别,添加 WinForms 应用程序以使用该服务。这也将使我们能够利用该服务,并编写 LINQ 查询使用这项服务。使用 WCF 数据服务在上一节,知道怎样创建一个WCF数据服务,然后着眼于数据使用REST基层接口。本节将引导您如何使用建立在上一节中的服务,然后使用该服务从基础的EF模型查询数据。我们需要做的第一件事是将 WinForms 项目添加到解决方案。解决方案资源管理器中,右键单击解决方案,选择添加 新项目的上下文菜单。在解决方案资源管理器中,右键单击并从上下文菜单中选择添加新建项目。在新建项目对话框中,在模版列表中选择Windows Forms Application ,你根据自己的感觉自由定义项目名称我保持默认名称。在新建项目对话中点击确定。你的解决方案资源管理器现在看起来应像图11-15所示。图 11-15 添加 WinForms 项目我们在这一章开头创建的服务项目在这,只是在活动中补充添加的新WinForms项目。所以我们需要能够在其他项目中沟通与服务的东西。我们需要的是一个代理对象,我们可以将其添加到我们的 WinForms 项目,可以使用它在其他项目中与服务进行通信。有若干种方式这样做,但是我们要用最容易的方式,是简单地通过添加服务引用到我们 WinForms 项目。添加服务引用在我们的新 WinForms 项目中使用 WCF 数据服务,我们需要添加一个能够与其他项目通信的代理对象。若要添加此代理对象,右键单击解决方案资源管理器中的引用节点 WinForms 项目和选择添加服务引用,如见图 11-16 中。图 11-16 添加服务引用 选择添加服务引用菜单选项,打开添加服务引用对话框中所示在图 11-17所示。这个对话框允许我们寻找和发现服务存在当前的解决方案或网页上。图 11-17 服务信息在图 11-17添加服务引用对话框中,您将看到Discover按钮。稍后,我们会单击它来找到解决方案内的服务。选中解决方案Services的服务选项,单击OK按钮,如图 11-18 所示。图 11-18 发现解决方案内服务你讲在图11-17中看到一个标有“地址”的文本框。这也允许键入并使用一个在web上存在的服务URI地址到我们的应用程序。通过键入的URI并单击Go按钮,该应用程序将访问指定URI的服务及其元数据的位置,然后创建该服务的对象。继续单击发现按钮并选择服务解决方案。应用程序将访问解决方案,寻找任何服务包含到我们的解决方案中。你会在图11-19所示的对话框看到这些服务显示。单击已经创建了名为AWService.svc的服务。图 11-19 AWService 和相关的类型没有更多命名空间的名称在添加服务引用对话框以外提供我们的服务。为了这个例子中,保留默认的名字。在此对话框点击OK之前复制URI是一个明智的选择,因为它将很快派上用场。然后在对话框中点击OK按钮。这样做将导致添加服务引用向导生成客户端对象并将它们添加到WinForms 解决方案。现在看看我们的 WinForms 项目,可以在图11-20中看到服务代理已添加到我们的解决方案。图 11-20 解决方案资源管理器中的服务如果你还没有这样做,在解决方案资源管理器中单击显示所有文件按钮,我们应该查看新加入的服务文件。展开 ServiceReference1 节点,您将看到生成的一些代码。打开并查看 Reference.cs 文件的代码。在 Reference.cs 文件中我们可以看到多个分部类被创建。第一类,称为 AdventureWorksEntities,表示整个服务,并允许致力于服务级别。您还会发现一个分部类为每个实体在远程服务创建,使我们可以单独使用实体。下面的代码段显示了一个分部类。public partial class AdventureWorksEntities : global:System.Data.Services.Client.DataServiceContext/ / Initialize a new AdventureWorksEntities object./ public AdventureWorksEntities(global:System.Uri serviceRoot) : base(serviceRoot)this.ResolveName = new global:System.Func(this.ResolveNameFromType);this.ResolveType = new global:System.Func(this.ResolveTypeFromName);this.OnContextCreated();partial void OnContextCreated();/ / Since the namespace configured for this service reference./ / There are no comments for AdventureWorksModel.Contact in the schema./ / / ContactID/ global:System.Data.Services.Common.EntitySetAttribute(Contacts)global:System.Data.Services.Common.DataServiceKeyAttribute(ContactID)public partial class Contact : global:System.ComponentModel.INotifyPropertyChanged/ / Create a new Contact object.AdventureWorksEntities 类是我们已经消耗了该服务的逻辑表示形式。她不使用连接;它不会打开、关闭或者管理任何连接信息。此类只允许我们与服务工作。此时我们已经在应用程序中消耗WCF数据服务。现在让我们好好利用这一服务。利用服务到目前为止,我们已经创建了服务和在WinForms应用程序中消费该服务。我们的下一步是编写代码来利用服务查询底层数据存储。在WinForms项目中,打开表单的设计视图,添加两个按钮和一个列表框。双击第一个按钮来查看代码。我们需要做的第一件事是为服务代理添加一条using语句,(我们只看生成的类),如此处的代码所示。 namespace WindowsFormsApplication1 using ServiceReference1; Now add the following code to the Click event of the first button. try AdventureWorksEntities svc = new AdventureWorksEntities(new Uri(http:/localhost:1089/AWService.svc); foreach (Employee emp in svc.Employees) listBox1.Items.Add(string.Format(0 1, emp.ContactID, emp.Title); catch (Exception ex) MessageBox.Show(ex.Message); 此代码的第一行将表示该服务的类的实例化。作为实例化的一部分,我们需要通过URI跟踪服务。记得你从添加服务引用对话框复制的信息吗?在这里将其添加,作为此类的构造函数的参数。当你在这个项目中选择发现服务,发现回传并发现服务在对话框中显示的位置处。为了使你的应用程序使用该服务,你需要包含这个URI,使你的应用程序知道与那个服务谈话。下一节的代码循环遍

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论