热门标签 | 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;。



推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了关于apache、phpmyadmin、mysql、php、emacs、path等知识点,以及如何搭建php环境。文章提供了详细的安装步骤和所需软件列表,希望能帮助读者解决与LAMP相关的技术问题。 ... [详细]
  • 利用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开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • intellij idea的安装与使用(保姆级教程)
    intellijidea的安装与使用(保姆级教程)IntelliJ在业界被公认为最好的java开发工具,尤其在智能代码助手、代码自动提示、重构、JavaEE支持、各类版本工具(gi ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • svnWebUI:一款现代化的svn服务端管理软件
    svnWebUI是一款图形化管理服务端Subversion的配置工具,适用于非程序员使用。它解决了svn用户和权限配置繁琐且不便的问题,提供了现代化的web界面,让svn服务端管理变得轻松。演示地址:http://svn.nginxwebui.cn:6060。 ... [详细]
  • Linux环境变量$PATH的作用及使用方法
    本文介绍了Linux环境变量$PATH的作用及使用方法。$PATH是一个由多个目录组成的变量,用冒号分隔。当执行一个指令时,系统会按照$PATH定义的目录顺序搜索同名的可执行文件,如果有多个同名指令,则先找到的会被执行。通过设置$PATH变量,可以在任何地方执行指令,无需输入绝对路径。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
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社区 版权所有