热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何创建使用POCO定义的实体域服务WCFRIAService

本主题说明如何使用WCFRIAServices来创建使用纯旧式CLR对象(POCO)的域服务。本主题旨在说明如何构造非常基本的基于POCO的RIAServices应用程序ÿ



本主题说明如何使用 WCF RIA Services 来创建使用纯旧式 CLR 对象 (POCO) 的域服务。本主题旨在说明如何构造非常基本的基于 POCO 的 RIA Services 应用程序,该应用程序将专门说明在该过程的不同步骤中使用 RIA Services 工具(向导和对话框)时会发生的具体情况。从 POCO 提供的数据可用于从后端数据库上的依赖项中释放应用程序,以便用于可移植性或数据安全性,或者用于测试目的。具有 POCO 定义的实体的 RIA Services 完全支持自动生成的客户端代码,就像对于 Linq to SQL 或 Linq to 实体框架一样。实际上,RIA Services 对数据源而言是不可知的,因此,该 POCO 类可以在以后由从某个其他源(例如数据库)访问数据的组件替换,而无需更改该域服务本身。

本文介绍的过程除了要求 WCF RIA Services 之外,还要求若干必备程序,例如 Visual Studio 2010 和 Silverlight Developer 运行时及 SDK。但 WCF RIA Services 工具包不是必需的。有关满足上述各必备程序的详细说明,请参见WCF RIA Services 的必备条件节点内的主题。在继续此操作指南主题之前,请按照此处提供的说明安装所需的程序,以确保您尽可能少地遇到问题。

创建 RIA Services 解决方案

  1. 通过依次选择“文件”“新建”“项目”,在 Visual Studio 2010 中创建新的 RIA Services 项目。

    此时将出现“新建项目”对话框。

  2. “已安装的模板”“Silverlight”组中选择“Silverlight 应用程序”模板,然后将新项目命名为 RIAServicesPocoExample

  3. 单击“确定”

    此时将出现“新建 Silverlight 应用程序”对话框。

  4. 选中对话框底部附近的“启用 WCF RIA Services”复选框。选中此复选框可在客户端项目和服务器项目之间创建 RIA Services 链接。为了启用此连接,此工具添加了对客户端项目的以下引用:

    • System.ComponentModel.DataAnnotations

    • System.Runtime.Serialization

    • System.ServiceModel.dll

    • System.ServiceModel.DomainServices.Client

    • System.ServiceModel.DomainServices.Client.Web

    • System.ServiceModel.Web.Extensions

    • System.Windows.Browser

  5. 单击“确定”创建解决方案。

    该解决方案包含两个项目:一个客户端项目和一个服务器项目。

    • RIAServicesPocoExample:包含用于创建表示层的 Silverlight 代码的客户端项目。

    • RIAServicesPocoExample.Web:包含中间层代码服务器项目。

创建域服务

  1. 右击服务器项目,依次选择“添加”“新建项”

  2. 在类别列表中,选择“Web”,然后选择“域服务类”模板。

  3. 将类命名为 SovereignDomainService.cs(或 SovereignDomainService.vb)。

  4. 单击“添加”

    此时将出现“添加新的域服务类”对话框。

  5. 确保选中“启用客户端访问”框。

  6. 请注意&#xff0c;“可用 DataContext/ObjectContext 类”的下拉菜单上的唯一可用选项是“<空域服务类>”实体&#xff0c;并且您无法选中“为元数据生成关联类”复选框&#xff0c;因为没有可用于将服务与之关联的数据上下文。

  7. 单击“确定”

    此向导执行若干工作。它使用关联的特性和 using 语句在一个新的 SovereignDomainService.cs (or SovereignDomainService.vb) 文件中生成一个空的SovereignDomainService 类。它还将对服务项目和配置元素的四个程序集引用添加到 Web.config 文件。

  8. 为观察此情况&#xff0c;如果 SovereignDomainService.cs&#xff08;或 SovereignDomainService.vb&#xff09;文件尚未自动打开&#xff0c;则打开该文件。请注意&#xff0c;此文件具有以下特征&#xff1a;

    1. using 语句已添加&#xff1a;

      • using System;

      • using System.Collections.Generic;

      • using System.ComponentModel;

      • using System.ComponentModel.DataAnnotations;

      • using System.Linq;

      • using System.ServiceModel.DomainServices.Hosting;

      • using System.ServiceModel.DomainServices.Server

    2. SovereignDomainService 类派生自 DomainService 类&#xff0c;后者是 RIA Services 框架中的抽象基类。这是在 RIA Services 中公开的所有域服务的基类。

    3. SovereignDomainService 类用 EnableClientAccessAttribute 特性进行标记&#xff0c;以便指示它对客户端层可见。

  9. 请注意&#xff0c;以下引用已由向导添加到服务项目&#xff1a;

    • System.ComponentModel.DataAnnotations

    • System.Runtime.Serialization

    • System.ServiceModel.DomainServices.Hosting

    • System.ServiceModel.DomainServices.Server

  10. 最后&#xff0c;打开 Web.config 文件并检查向导已添加的新元素。


    除了针对 .NET Framework 4.0 的配置元素外&#xff0c;上述每个元素都已由“添加新的域服务类”对话框添加。这些元素实现不同的 Internet Information Server (IIS) 承载和 ASP.NET 选项。

    1. 该向导在 IIS 7 承载所要求的  部分中添加一个  元素。

    2. 该向导在 IIS 6 承载所要求的 system.web 部分中添加  元素的  元素。

    3. RIA Services 域服务是 Windows Communication Foundation (WCF) 服务&#xff0c;并且在与 ASP.NET 一起承载时需要承载在 ASP.NET 兼容模式下。此要求不能在代码中设置并且必须在 Web.config 文件中指定。通过在  部分的  元素中将 aspNetCompatibilityEnabled 属性设置为 true&#xff0c;启用 ASP.NET 兼容模式。

添加 POCO 类

  1. 此过程描述如何向 RIA Services 框架指出 POCO 类要用作实体类型。实体类型向应用程序的数据模型提供数据结构&#xff0c;并且每个实体类型都需要具有唯一的实体键。数据的结构由其包含的属性集指定。通过委托一个或一组属性&#xff08;这些属性必须为每个实体对象都提供一个唯一名称&#xff0c;该名称将该实体对象与相同类型的其他实体区分开来&#xff09;&#xff0c;提供实体键。这通常是通过使用元数据的某种形式的变体指定的。此过程通过将 [Key] 特性应用于某一属性来执行此操作&#xff0c;实际上该操作就是应用一个特性&#xff0c;该特性指示 RIA Services 框架该 POCO 类的实例是实体对象。

  2. 打开 SovereignDomainSevice.cs 文件。

  3. 在 RIAServicesPocoExample.Web 命名空间范围内的无存根 SovereignDomainService 类之下&#xff0c;为 Sovereign 类添加以下代码&#xff1a;


    public class Sovereign{[Key]public int UniqueId { get; set; }public string Name { get; set; }public string House { get; set; }public string Dominion { get; set; }public int ReignStart { get; set; }public int ReignEnd { get; set; }public string Sobriquet { get; set; }}

  4. 在本示例中&#xff0c;UniqueId 属性是为 Sovereign 类型的每个实体对象提供唯一名称的实体键。[Key] 特性在 System.ComponentModel.DataAnnotations 程序集中定义&#xff0c;该程序集已添加到服务器项目&#xff0c;该项目为包含它的相应命名空间具有 using 语句。该实体键也可以在元数据文件中或以其他方式指定&#xff0c;但直接在 POCO 类中指出实体键是一种十分简便的方式。

  5. 将 FetchSovereigns() 方法添加到返回 Sovereign 实例的列表的 Sovereign 类&#xff1a;


    public List FetchSovereigns(){List sovereignList &#61; new List{new Sovereign(){UniqueId &#61; 1, Name &#61; "John", House &#61; "Plantagenet", Dominion &#61; "Angevin Empire", ReignStart &#61; 1167, ReignEnd &#61; 1216, Sobriquet &#61; "Lackland"},new Sovereign(){UniqueId &#61; 2, Name &#61; "Charles", House &#61; "Stuart", Dominion &#61; "England, Scotland, & Ireland", ReignStart &#61; 1625, ReignEnd &#61; 1649, Sobriquet &#61; "The Martyr"},new Sovereign(){UniqueId &#61; 3, Name &#61; "William", House &#61; "Dunkeld", Dominion &#61; "Scotland", ReignStart &#61; 1165, ReignEnd &#61; 1249, Sobriquet &#61; "The Lion"}, new Sovereign(){UniqueId &#61; 4, Name &#61; "Elizabeth", House &#61; "Tudor", Dominion &#61; "England", ReignStart &#61; 1555, ReignEnd &#61; 1609, Sobriquet &#61; "The Virgin Queen"},new Sovereign(){UniqueId &#61; 5, Name &#61; "Ivan", House &#61; "Vasilyevich", Dominion &#61; "Russia", ReignStart &#61; 1533, ReignEnd &#61; 1584, Sobriquet &#61; "The Terrible"},new Sovereign(){UniqueId &#61; 6, Name &#61; "Charles", House &#61; "Valois", Dominion &#61; "France", ReignStart &#61; 1380, ReignEnd &#61; 1422, Sobriquet &#61; "The Mad"}};return sovereignList;}

定义域服务

  1. 此过程描述如何在可从客户端访问的域服务中创建一个查询&#xff0c;以便从 POCO 定义的实体中检索数据。RIA Services 框架需要知道其哪些方法要在客户端上可用作查询以及是否存在用于实现此目的的命名约定。以 Get 开头并且返回 IEnumerable 或 IQueryable 的方法名称由 RIA Services 框架作为查询识别。

    Tip提示&#xff1a;
    IQueryable 派生自 IEnumerable。将 IEnumerable 用于内存中集合&#xff08;例如&#xff0c;我们的 POCO 定义的实体&#xff09;并且在访问 SQL 数据库之类的基础或远程数据源时使用IQueryable

  2. 将 GetSovereign() 方法添加到 SovereignDomainService 类。

    public IEnumerable GetSovereigns(){ Sovereign sovereign &#61; new Sovereign();return sovereign.FetchSovereigns();}

  3. 这将从集合中返回所有 sovereign 实体。但是&#xff0c;通常我们仅想要返回实体的子集。为阐明这一点&#xff0c;修改此查询以便只从列表中返回在中世纪统治国家的君主&#xff0c;即sovereign.ReignEnd <&#61; 1500。下面的代码实现此目的&#xff1a;

    public IEnumerable GetSovereignsByReignEnd(int ReignedBefore){Sovereign sovereign &#61; new Sovereign();return sovereign.FetchSovereigns().Where(p &#61;> p.ReignEnd <&#61; 1500);}

  4. 生成 (Ctrl&#43;Shift&#43;B) 解决方案以便创建自动生成的客户端代理代码。

  5. “解决方案资源管理器”中&#xff0c;选择 RIAServicesPocoExample 客户端项目并且单击窗口顶部的“显示所有文件”图标&#xff0c;然后在 Generated_Code 文件夹中检查 RIAServicesPocoExample.Web.g.cs 文件。检查此文件中自动生成的代码并且注意以下项&#xff1a;

    • 从 WebContextBase 类派生的 WebContext 类将生成并用于管理应用程序上下文。

    • 将为域服务所公开的实体生成派生自 Entity 类的 Sovereign 类。客户端项目中的 Sovereign 实体类匹配服务器上的 Sovereign 实体。

    • 将生成派生自 DomainContext 类的 SovereignDomainContext 类。此类具有一个名为 GetSovereignsByReignEndQuery 的方法&#xff0c;该方法对应于域服务中创建的查询方法。

  6. 有关自动代码生成的更多信息&#xff0c;请参见客户端代码生成主题。有关如何自定义代码生成的信息&#xff0c;请参见自定义生成的代码主题。

在 Silverlight 客户端中显示查询结果

  1. 打开 MainPage.xaml。

  2. 从左侧的“工具箱”中&#xff0c;将 DataGrid 控件拖动到 XAML 视图中的 Grid 元素内。

    “工具箱”拖动“DataGrid”控件将导致命名空间 using System.Windows.Controls 语句添加到 MainPage.xaml.cs 文件&#xff0c;并且导致对 System.Windows.Controls.Data 和 System.Windows.Controls.Data.Input 程序集的引用自动添加到客户端项目。

    Caution警告&#xff1a;
    如果添加 DataGrid 而不从“工具箱”拖动它&#xff0c;则必须将对程序集的引用添加到客户端项目&#xff0c;并手动将 using 语句添加到代码隐藏文件中。

  3. 将 AutoGeneratedColums 的值更改为 True&#xff0c;将 DataGrid 元素命名为 SovereignGrid&#xff0c;并调整 Height 和 Width&#xff0c;如下面的 XAML 所示。



  4. 打开 MainPage.xaml.cs 文件。

  5. 向 using (C#) 或 Imports (Visual Basic) 添加两个语句&#xff1a;using RIAServicesPocoExample.Web; 和 using System.ServiceModel.DomainServices.Client;

    RIAServicesPocoExample.Web 命名空间是一个包含为 RIAServicesPocoExample.Web.g.cs&#xff08;或 RIAServicesPocoExample.Web.g.vb&#xff09;中的客户端项目生成的代码的命名空间。

  6. 若要实例化 SovereignDomainContext&#xff0c;请在 MainPage 类中添加代码行 private SovereignDomainContext _sovereignContext &#61; new SovereignDomainContext();

  7. 通过调用包含 LoadOperation 的 GetSovereignsQuery 方法检索客户实体&#xff1a;LoadOperation loadOp &#61; this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));

  8. 使用 SovereignGrid.ItemsSource &#61; loadOp.Entities; 将加载的实体绑定到 DataGrid

    总之&#xff0c;MainPage.xaml.cs 文件此时应包含以下代码&#xff1a;

    //Namespaces added
    using RIAServicesPocoExample.Web;
    using System.ServiceModel.DomainServices.Client;namespace RIAServicesPocoExample
    {public partial class MainPage : UserControl{private SovereignDomainContext _sovereignContext &#61; new SovereignDomainContext();public MainPage(){InitializeComponent();LoadOperation loadOp &#61; this._sovereignContext.Load(this._sovereignContext.GetSovereignsByReignEndQuery(1500));SovereignGrid.ItemsSource &#61; loadOp.Entities;}}
    }

  9. 运行 (F5) 该应用程序。

    您应该在浏览器中看到该表&#xff0c;表中仅显示中世纪&#xff08;其统治在公元 1500 年前结束&#xff09;君主的属性&#xff08;以字母顺序显示&#xff09;。



推荐阅读
  • 本文介绍了NetCore WebAPI开发的探索过程,包括新建项目、运行接口获取数据、跨平台部署等。同时还提供了客户端访问代码示例,包括Post函数、服务器post地址、api参数等。详细讲解了部署模式选择、框架依赖和独立部署的区别,以及在Windows和Linux平台上的部署方法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文介绍了禅道作为一款国产开源免费的测试管理工具的特点和功能,并提供了禅道的搭建和调试方法。禅道是一款B/S结构的项目管理工具,可以实现组织管理、后台管理、产品管理、项目管理和测试管理等功能。同时,本文还介绍了其他软件测试相关工具,如功能自动化工具和性能自动化工具,以及白盒测试工具的使用。通过本文的阅读,读者可以了解禅道的基本使用方法和优势,从而更好地进行测试管理工作。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
author-avatar
丁丽君coolboy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有