收藏 分享(赏)

CF数据服务的多层开发.doc

上传人:wo7103235 文档编号:6153822 上传时间:2019-03-30 格式:DOC 页数:21 大小:1.68MB
下载 相关 举报
CF数据服务的多层开发.doc_第1页
第1页 / 共21页
CF数据服务的多层开发.doc_第2页
第2页 / 共21页
CF数据服务的多层开发.doc_第3页
第3页 / 共21页
CF数据服务的多层开发.doc_第4页
第4页 / 共21页
CF数据服务的多层开发.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、中原工学院毕业设计(论文) 第 1 页CF 数据服务的多层开发到目前为止,我们花了整本书通过示例说明如何在连接状态使用数据,也就是说,直接连接到数据库,并以直接的方式处理数据。虽然这在很多情况下没有什么神秘的,越来越多的业务和应用程序需要工作在断开连接,多层环境下来支持 SOA(面向服务架构)领域不断扩大。微软通过.Net Fx3.0,推广 WCF 真正进入了这个领域,选择提供整个企业的沟通能力以及网络的.Net 技术去构建快速的 SOA 应用程序已迅速得到认可。紧跟着.NET RIA 服务之后,在 ASP.NET 和 Silverlight 平台上提供一个简单的方法开发多层应用程序。.NET

2、 RIA 服务的目的是提供一个简单的开发模式,重点是控制数据访问通过管理进行查询,修改和自定义业务数据访问中间层应用程序逻辑。紧跟着 WCF 和.NET RIA 服务(而不是被遗忘)的 ADO.NET 数据服务,为开发人员提供依据公开数据作为通过 URI 的资源寻址来创建和访问数据 web服务的能力。ADO.NET 数据服务还使用实体数据模型和实体关系公约来公开基础源的实体,从而使开发人员能够在熟悉的实体概念中工作。在过去的几年里,微软已经意识到,这三种技术之间有一些共性,并且花费更多的时间工作,以更好地支持那些需要丰盛的和灵活的解决方案的应用程序类型。因此,微软做出某些名称变更,以更好地协调

3、这些技术。因此,ADO.NET 数据服务是现在的 WCF 数据服务,.NET RIA 服务是现在的 WCF RIA 服务。这是正确的微软正在构建他们所谓的 “一站式服务点”的构建和部署服务和多层应用程序。因此,这一章我们将专注于 WCF 数据服务,开始讨论了如何创建和测试在关系数据库中使用实体框架的数据服务。我们将着眼于 WCF 数据服务功能和如何使用 WCF 数据服务的基础数据的几个例子。我们将花本章的剩余部分通过一个例子使用该服务,然后使用该服务来查询关系数据并使用 WinForms 前端显示数据。构建 WCF 数据服务书中所有的例子,主要是通过创建一个 WinForms 应用程序的数据模

4、型开始。如前文所述,这种方法可能会工作在某些要求一个应用程序在离线模式下操作的环境下,也就是说,在多层环境中。然而,本章的例子中,将改变方向,因为它将使我们能够看到 WCF 数据服务与 EF 交互,我们也会看到他们的交互所提供的功能。首先,打开 Visual Studio 2010 并创建一个新的 ASP.NRT Web 应用程序项目,如图 11-1 所示。图 11-1 创建 ASP.NET web 应用程序在图 11-1 中我使用默认的项目名称,但你可以自由的改变它。在 Add New Item 对话框中单击确定。一旦创建了项目,我们现在就有了一个空的和非功能性的 web 应用程序。然而,我

5、们很快用少量代码来实现它的功能。正如你以前做过很多次,将一个 ADO.NET 实体数据模型添加到项目中。在添加新项目对话框,如图 11-2 所示,把模型命名为 AWModel ,然后单击添加。在这个例子中,将生成 AdventureWorks 数据库的模型。如果你没有创建连接到 AdventureWorks 数据库,你可以继续通过向导,直到你到达在您选择的数据库对象模型包含在向导中的步骤。我们将只选择很少的表帮助展示 WCF 数据服务功能。图 11-2 添加 ADO.NET 实体数据模型在选择数据库对象向导的步骤,选择以下表: HumanResources.Employee HumanReso

6、urces.EmployeeAddress Person.Address Person.Contact Person.StateProvince Purchasing.PurchaseOrderHeader Sales.SalesPerson Sales.SalesTerritory 如图 11-3 ,保持检查的多元化和外键选项,输入值为模 Adventure-WorksModel 的命名空间,然后单击完成。这个示例不需要任何存储过程或视图。此时我们有的是包含一个实体数据模型 ASP.NET Web 应用程序。这没有任何实际功能,但是在这里,我们可以介绍 WCF 数据服务组件,所以让我们这样做

7、。注意:在向导的选择数据连接步骤中的实体连接设置应默认为 Adventure-WorksEntities 。如果它未默认正确则改变这个值,本章中的代码示例将说明此值,如果你保持相同的值它将更容易地跟随和调试应用程序。图 11-3 选择表 右键单击解决方案资源管理器中的项目,向项目中添加一个新的项目。添加新项对话框出现时,选择 Web 选项,然后向下滚动的已安装的模板列表中直到你看到 ADO.NET 数据服务的模板。给此对象命名为 AWService.svc,如图11-4 所示,然后单击添加。图 11-4 将 ADO.NET 数据服务添加到项目向项目中添加的 ADO.NET 数据服务做几件事情。

8、首先,正如你在图 11-5 看到的,它添加了一些命名空间委托到你的项目中,System.ServiceModel 命名空间是突出显示在图 11-5 中的其中一个。该命名空间包含生成服务和多层环境中的客户端应用程序所需的所有类和接口。也通过 ADO.NET 数据服务模板添加到项目中的引用如下: System.Data.Services System.Data.Services.Web System.Data.Entity System.ServiceModel.Web 看到这个列表你可能会想,当一个实体数据模型添加到项目中则System.Data.Entity 的引用被添加。这是正确的。然而,如

9、果第一次向项目中添加一个数据服务(在添加实体数据模型之前) ,然后 System.Data.Entity 引用也会被自动添加。图 11-5 System.ServiceModel 命名空间其次,很明显通过 ADO.Net 数据服务模板添加服务本身。如图 11-6 所示,该服务由 AWService.svc 和其配套的 AWService.svc.cs 文件组成。你不能直接打开和修改.svc 文件。事实上,如果你双击.svc 文件,将打开其配套的AWService.svc.cs 文件。如果右键单击 .svc 文件,然后选择打开方式,然后选择 XML 编辑器,您将看到.svc 文件是由简单的单行

10、XML 文件组成。与实体框架和 EDM 中不同的是您可以更改底层的 XML,微软 (以及我) 强烈建议您不要修改.svc 文件和其底层的 XML。这完全是因为修改.svc 文件不提供任何的好处。图 11-6 AWService WCF 服务当 ADO.NET 数据服务被添加到项目中,相关的.cs 文件会自动显示在 IDE中。图 11-7 显示 ADO.NET 数据服务模板为我们生成了什么文件。结果基本上是我们数据服务的开始。图 11-7 数据服务界面正如你在图 11-7 中所看到,该模版会生成一些指令,为接下来我们需要做什么提供一些指导。首先,我们需要连接数据服务为数据模型提供服务,以便服务知

11、道从哪获取数据。我们知道这样做是因为,正如图 11-7 所显示的代码告诉我们在哪里。因此,更换代码注释 AdventureWorksEntities 的名称(看了几页回到关于此值的注释) 。当您进行更改时,公共类的代码行将如下所示:public class AWService : DataService 连接我们的数据服务模型是那么简单。不管你相不相信,我们已经准备好测试我们的服务。测试 WCF 数据服务测试 WCF 数据服务不仅为我们提供了查看我们的应用程序的机会,还有机会探索 WCF 数据服务的一些功能和 EF 与 WCF 数据服务之间的交互。您还将看到我们为什么要构建这一项目在 ASP.

12、NET Web 应用程序。按 Ctrl + F5 以编译并运行该项目。该项目在运行时,web 浏览器将打开并显示如图 11-8 所示。图 11-8 初始测试结果从表面上看,在图 11-8 所显示的结果真的不告诉我们很多,但事实上有一种基于 REST (表述性状态转移) 的服务,在使用实体框架的数据库上运行。虽然如此,这仍然是非常酷的。然而,不能够在浏览器中输出显示我们想要的。我们真正想要看到来自于数据库的数据。当然我们看不到数据,默认情况下,WCF.NET 的数据服务是安全的。WCF 数据服务需要明确的告诉它你要查看哪些数据。在代码中的指令告诉我们这一点,因为你可以在图 11-7 TODO 注

13、释中看到。一些实例甚至提供注释帮助我们,但是这些注释起到提醒作用。我们还需要做一些工作,让我们选择不限制在我们的示例中的任何东西。相反,我们会解锁所有实体。我们这样做是通过将下面突出显示的代码添加到 InitializeService 方法:public static void InitializeService(DataServiceConfiguration config) / TODO: set rules to indicate which entity sets and service operations /are visible, updatable, etc. / Exampl

14、es: / config.SetEntitySetAccessRule(“MyEntityset“, EntitySetRights./AllRead); / config.SetServiceOperationAccessRule(“MyServiceOperation“, /ServiceOperationRights.All); config.SetEntitySetAccessRule(“*“, EntitySetRights.All); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion

15、.V2; 在我们的模型中,突出显示的代码为指定的实体集设置权限。SetEntitySetAccessRule 方法接受两个参数。第一个参数是我们要设置权限的实体,而第二个参数是要授予该资源(实体)的访问权限。第一个参数值被指定为“*” ,表示为所有实体集设定权限。第二个参数取枚举类型 EntitySetRights,它包含以下成员: None: Denies all rights to data access ReadSingle: Authorizes read rights to single items ReadMultiple: Authorizes read rights to se

16、ts 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 righ

17、ts All: Authorizes read, create, update, and delete rights on data 在我们的实例中,所枚举的所有权利授予所有实体集。再次运行应用程序,当网页出现时你会看到回传底层模型中的所有实体集列表,如图 11-9 所示。图 11-9 实体集列表前面我们提到,WCF 数据服务是依据公开数据作为通过 URI 的资源寻址,并且我可以使用任何在图 11-9 的 URIs 中看到的数据。通过利用公开的 URlS 探讨基础模型中的数据。例如,例如,让我们来看看 SalesTerritory 资料数据通过使用该实体集相关联的 URI,并把它添加到 URI

18、的这个页面。通过使用适当的 URI,显示在图 11-10 ,我们获得所有销售区域列表。图 11-10 销售区域当您尝试浏览销售区域时会有两件事情将要发生。你要么得到的所有销售区域的列表就像你在图 11-10 看到的,或者你会得到类似图 11-11 页,表明我们正在接收销售区域的 RSS 提要。图 11-11 RSS 订阅页面要解决该 RSS 源的问题,我们需要关闭 RSS 订阅功能,使用 Internet Explorer。用 IE 浏览器打开时,从工具菜单选项选择打开 Internet 选项对话框。这个对话框的顶部有多个可能熟悉的选项卡。选择内容选项卡,点击源和网页快讯下的设置按钮。点击设置

19、按钮,将显示设置对话框,在此对话框中您需要取消选中打开源阅读视图复选框,如图 11-12 所示。此对话框与 Internet 选项对话框上单击OK。图 11-12 关闭源阅读视图回到 web 页面上,按 f5 键以刷新页面。现在你应该回到销售界面较早前在图 11-10 所示的集合。该列表的数据源是针对销售界面底层的数据库查询的。我们尚未探索所有的服务功能在这仍有很多我们可以做的。例如,着眼于现在显示所有销售区域的页面,怎么返回一个特定的领域。纵观数据,我们可以看到,每个记录包含特定行的 ID ,我们可以利用它包括在我们的 URI 里。在这个例子中,使用销售区域 ID 4 。通过在括号里附加数字

20、 4 到 URI 的结尾修改的 URI,如示于图 11-13。通过加载包括特定记录 ID 的 URI ,可以进一步深入或者返回到刚刚要找的记录。这就像应用 WHERE 子句的 T-SQL 查询,在 TerritoryID = 4 的情况下 。在这种情况下,我已经通过传递对应的 ID 在 URI 查询特定销售区域的底层存储。图 11-13 具体销售区域然而这不是所有的。由于我们的服务基于 EDM 实体框架,我们可以很容易的浏览实体之间的相关数据。例如,假设我们想看看有关的具体销售区域的所有销售人员。通过简单地将销售人员实体追加到 URI 的末尾我们可以在实体之间进行导航。通过图 11-13 和

21、11-10 采取一个更好的信息,我们可以看到一些称为链接元素的元素,这意味着目前的销售区域有其他项目,如StateProvince 和销售人员的关系。您可以使用这些链接去导航其关系,首先选择你想要的特定销售区域,然后在 URI 包含特定链接项。图 11 - 14 显示了这是如何实现的。在这个例子中,我们仍然使用SalesTerritory ID 4,然后我们将销售人员项目添加到 URI 结尾,它允许我们在给定 TerritoryID SalesTerritory 与销售人员之间的关系。图 11-14 所选销售区域的销售人员当刷新界面,会出现与销售区域 TerritoryID4 相关联的所有销售

22、人员。您可能已经猜到了我们可以更进一步向下探索,通过添加属性到 URI 结尾来带回的特定列数据。我们终究将要你迄今为止我们所做的全部例子。这些都是有趣的,让我们把它带到下一个级别,添加 WinForms 应用程序以使用该服务。这也将使我们能够利用该服务,并编写 LINQ 查询使用这项服务。使用 WCF 数据服务在上一节,知道怎样创建一个 WCF 数据服务,然后着眼于数据使用 REST基层接口。本节将引导您如何使用建立在上一节中的服务,然后使用该服务从基础的 EF 模型查询数据。我们需要做的第一件事是将 WinForms 项目添加到解决方案。解决方案资源管理器中,右键单击解决方案,选择添加 新项

23、目的上下文菜单。在解决方案资源管理器中,右键单击并从上下文菜单中选择添加新建项目。在新建项目对话框中,在模版列表中选择 Windows Forms Application ,你根据自己的感觉自由定义项目名称我保持默认名称。在新建项目对话中点击确定。你的解决方案资源管理器现在看起来应像图 11-15 所示。图 11-15 添加 WinForms 项目我们在这一章开头创建的服务项目在这,只是在活动中补充添加的新WinForms 项目。所以我们需要能够在其他项目中沟通与服务的东西。 我们需要的是一个代理对象,我们可以将其添加到我们的 WinForms 项目,可以使用它在其他项目中与服务进行通信。有若

24、干种方式这样做,但是我们要用最容易的方式,是简单地通过添加服务引用到我们 WinForms 项目。添加服务引用在我们的新 WinForms 项目中使用 WCF 数据服务,我们需要添加一个能够与其他项目通信的代理对象。若要添加此代理对象,右键单击解决方案资源管理器中的引用节点 WinForms 项目和选择添加服务引用,如见图 11-16 中。图 11-16 添加服务引用选择添加服务引用菜单选项,打开添加服务引用对话框中所示在图 11-17所示。这个对话框允许我们寻找和发现服务存在当前的解决方案或网页上。图 11-17 服务信息在图 11-17 添加服务引用对话框中,您将看到 Discover 按

25、钮。稍后,我们会单击它来找到解决方案内的服务。选中解决方案 Services 的服务选项,单击OK 按钮,如图 11-18 所示。图 11-18 发现解决方案内服务你讲在图 11-17 中看到一个标有“地址”的文本框。这也允许键入并使用一个在 web 上存在的服务 URI 地址到我们的应用程序。通过键入的 URI 并单击 Go 按钮,该应用程序将访问指定 URI 的服务及其元数据的位置,然后创建该服务的对象。继续单击发现按钮并选择服务解决方案。应用程序将访问解决方案,寻找任何服务包含到我们的解决方案中。你会在图 11-19 所示的对话框看到这些服务显示。单击已经创建了名为 AWService.

26、svc 的服务。图 11-19 AWService 和相关的类型没有更多命名空间的名称在添加服务引用对话框以外提供我们的服务。为了这个例子中,保留默认的名字。在此对话框点击 OK 之前复制 URI 是一个明智的选择,因为它将很快派上用场。然后在对话框中点击 OK 按钮。这样做将导致添加服务引用向导生成客户端对象并将它们添加到 WinForms 解决方案。现在看看我们的 WinForms 项目,可以在图 11-20 中看到服务代理已添加到我们的解决方案。图 11-20 解决方案资源管理器中的服务如果你还没有这样做,在解决方案资源管理器中单击显示所有文件按钮,我们应该查看新加入的服务文件。展开 S

27、erviceReference1 节点,您将看到生成的一些代码。打开并查看 Reference.cs 文件的代码。在 Reference.cs 文件中我们可以看到多个分部类被创建。第一类,称为 AdventureWorksEntities,表示整个服务,并允许致力于服务级别。您还会发现一个分部类为每个实体在远程服务创建,使我们可以单独使用实体。下面的代码段显示了一个分部类。public partial class AdventureWorksEntities : global:System.Data.Services.Client.DataServiceContext/ / Initializ

28、e 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 OnConte

29、xtCreated();/ / 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“)p

30、ublic partial class Contact : global:System.ComponentModel.INotifyPropertyChanged/ / Create a new Contact object.AdventureWorksEntities 类是我们已经消耗了该服务的逻辑表示形式。她不使用连接;它不会打开、关闭或者管理任何连接信息。此类只允许我们与服务工作。此时我们已经在应用程序中消耗 WCF 数据服务。现在让我们好好利用这一服务。利用服务到目前为止,我们已经创建了服务和在 WinForms 应用程序中消费该服务。我们的下一步是编写代码来利用服务查询底层数据存储。

31、在 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(“h

32、ttp:/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 跟踪服务。记得你从添加服务引用对话框复制的信息吗 ?在这里将其添加,作为此类的构造函数的参数。当你在这个项目中选择发现服务,发现回

33、传并发现服务在对话框中显示的位置处。为了使你的应用程序使用该服务,你需要包含这个 URI,使你的应用程序知道与那个服务谈话。下一节的代码循环遍历该集合的成员并给窗体上的列表框中鞋服 ContactID和标题,在我们前面的类中使用生成类型成员。让我们来运行解决方案(请确保您设置的 WinForms 项目作为解决方案的启动项目) ,当窗体显示,单击 Button1。窗体上的列表应填充在底层的Employee 表中的 ContactID 和标题,如图 11-21 所示。图 11-21 第一次查询结果虽然这第一个例子不是很复杂,它显示是多么容易在应用程序中使用 WCF数据。让我们建立在这个例子上,仅仅

34、由于它没有举例任何 LINQ 特点。下一个将利用 LINQ 来构造查询联系人示例。您应该注意的是由该服务代理创建的类和 EDM 的类之间的相似之处。他们看起来很相似。此外,因为我们针对的对象编码,拥有 LINQ 的所有优势。让我们利用 LINQ 。编辑第二个按钮的 Click 事件,并添加以下代码:try AdventureWorksEntities svc = new AdventureWorksEntities(new Uri(“http:/localhost:1089/AWService.svc“); var query = from c in svc.Contacts where c.

35、LastName.StartsWith(“K“) orderby c.LastName select c; foreach (var con in query) listBox1.Items.Add(string.Format(“0 1“, con.FirstName, con.LastName); catch (Exception ex) MessageBox.Show(ex.Message); 此段代码与第一个示例没有什么不同,除了使用 LINQ 查询制定联系人。我们仍需要实例化代表服务的类,仍将遍历结果显示在信息列表框中。然而,这里的区别是,我们使用服务代理生成的类来构建查询。运行解决方案,当窗体显示,单击 button2。该列表框将很快被所有开头字母 K 的姓氏的联系人填充,如图 11-22。图 11-22 使用 LINQ 实体查询结果本章的目的是为了说明如何使用实体框架和 WCF 数据服务构建多层应用程序。你可以通过这一章的例子看到,这两种技术奇妙的协同工作,并提供了一个非常灵活且功能强大的多层应用程序的解决方案。正如在这一章中所经历的例子,特别是最后一个例子中的示例,您还会注意到,通过 WCF 数据服务真的有没有性能损失。指导教师评语指导教师: 年 月 日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 学术论文 > 毕业论文

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报