微软RIA服务2009年7月预览版官方手册第2节(翻译:戴石麟)

2023-10-26

2         理解N层Silverlight应用项目

微软.NET RIA服务通过结合ASP.NETSilverlight平台来简化传统N层应用模式。 应用逻辑写在中间层上,通过查询、更新、定制方法和服务操作来控制对数据的访问。 .NET RIA服务特性自动地在客户层生成对应的代理类,以调用这些操作。 因为中间层和客户层基于相同的CLR(共同语言运行时库),所以开发人员可以写出在两层上运行的代码。

 

本文通过在单一Visual Studio解决方案中构造一个简单的N层应用来阐明关键概念。

 

2.1 创建项目

创建.NET RIA服务N层应用以使用File | New Project来创建Silverligh Web应用项目开始[1]:

 

接此对话框显示New Silverlight Application对话框。 如果.NET RIA服务已经安装,此对话框显示下面突出圈定的检查框:

 

默认情况下,该检查框是没有选中的。 要使用.NET RIA服务建N层应用,你必须手动选择它。

结果解决方案看起来象这样:

 

 此时,我们已经创建了一个由2个项目组成的单一解决方案:

1.       SilverlightApplication1 ——此项目包含Silverlight代码。 我们称它为客户端项目。 这将成为我们的客户层。

 

2.       SilverlightApplication1.Web——此项目包含ASP.NET Web应用代码。 我们称它为服务器项目。   这将成为我们的中间层。

该解决方案和标准Silverlight Web应用之间的主要区别是上面选择的“Enable .NET RIA Services”检查框。 此检查框在客户端和服务器项目间形成了关联,允许共享应用逻辑。 它被非正式的称作“RIA链接,在理解Silverlight客户端代码生成理解N层类库中将更详细地阐述。

2.2 转化现有Web应用

如上所述,对于是否启用“RIA链接,你可事后改变主意。 这包括修改你已经建成的现有Web应用项目。 为改变该设置,要选择客户端项目并检查其属性(右击 | Properties或用菜单项Project | SilverlightApplication1 Properties…)。 如果.NET RIA服务已经安装,则该屏将显示如下突出圈定的下拉框。

为修改WebSilverlight应用项目间的“RIA链接,要从“.NET RIA Services Link”下拉框里的可选项中选择一个Web应用。 为禁用该链接,要选择“<No Server Project Set>” 在我们的例子中,该屏仅仅确认我们早先通过选定“Enable .NET RIA Services”检查框而做出的选择。

  

2.3 从中间层呈现数据

此时,我们已经有了一个启用了新的.NET RIA服务功能的普通Silverlight Web应用项目。 为了演示该新功能,我们将首先做一些数据供我们的中间层使用。

 

2.4 从中间层访问数据

在此例中,我们的中间层将使用从数据库来的数据。 数据库的使用并不是.NET RIA服务框架所要求的。 客户层对中间层使用的数据访问技术或模式一无所知。

为了在我们的中间层使用数据库,我们将用实体框架访问AdventureWorks数据库。 我们先右击服务器项目,选Add New Item菜单项并选择Data类型:

 

 

对此应用,我们从AdventureWorks数据库中只选择2张表:

  

2.5 在中间层上创建DomainService

现在我们到了演示.NET RIA服务框架特性的最重要一步: 在中间层上创建DomainService DomainService是一个为特定数据领域呈现实体和操作的类。 开发人员也是这里增加应用逻辑。

.NET RIA服务框架包含有衔接代码在DomainService类中声明实体和操作为其它层所用。

我们选择服务器项目并选择Add New Item来创建示例DomainService Web类型下,有Domain Service Class模板。 我们选择将此新的DomainService类叫作ProductService

 

 

该模板调用一个向导来帮助构建DomainService类。 在此例中,我们现在刚创建的AdventureWorks模型,并仅呈现一个实体:Product 我们不“Enable editing”,意为Product实体是只读的[2].

 

 

在我们提交该对话框后,新的DomainService类就将在所选的项目中创建。 在此例中,我们称它为ProductService   这里是生成的代码:

 注意生成代码的下列特征:

-          该类派生自 LinqToEntitiesDomainService,它是内建在.NET RIA服务框架内的一个抽象类[3].

-          该通用基类与我们早先创建的AdventureWorks_DataEntities类绑定。

-          DomainService类标有[EnableClientAccess] ,以指明它对客户层可见。

-          因为我们要求呈现Product实体,所以生成了一个GetProduct()查询方法。

-          GetProduct中生成了实现代码以从AdventureWorks_DataEntities对象场景获得数据。

该新的DomainService类是我们可以添加自己应用逻辑的地方。 例如,我们可以修改GetProduct()方法中的逻辑以仅仅选择库存Products 或者,我们可以给该方法增加一个参数来指定产品类型并改变我们的查询来仅仅选择那些产品。 我们还可添加新的带参数方法,以适应对我们的应用有意义的其它选择类型。

这里的重要之处是DomainService类给中间层提供了公共接口。 向导生成的代码仅仅是一个起始点,我们将在此处进入我们的应用逻辑。

第二个重要之处是我们现在可以不做任何修改地运行我们的应用,Product实体可用于中间层和客户层两者之上 使此成为可能的机制在下面阐述。

 

2.6 Silverlight客户端访问数据

还记得我们创建此应用时建立的“RIA链接吗?   现在它就开始发挥作用了。

如果我们生成此解决方案并在客户端项目中点击“Show All Files”,我们将看到这个:

 

注意客户端项目现在有一个目录,叫作Generated_Code,包含一个生成的文件。 上面的屏幕截图显示了该文件的几行。

该生成文件包含我们所统称的客户端代理类 这些类从我们在服务器项目中创建的DomainService类合成而来。

生成这些代理类的机制和它们发挥作用的方式在理解Silverlight客户端代码生成一节讲述,但是需要注意的重要方面有:

·         每当服务器上的DomainService类进行了修改,并且客户端项目或解决方案重新生成,那么这些客户端代理类就重新生成。 你不要修改这些代理类,因为它们会被覆盖。

·         对于每个由DomainService类呈现的实体类型(此例中为Product实体),都会生成一个防波堤客户端代理类。

·         每个DomainService呈现的操作都由一个生成的DomainContext类来提供客户端访问。 此例中生成了ProductContext类,它呈现了GetProductQuery()方法,能够用作DomainContextLoad()方法的参数,以调用该中间层上的DomainService(即ProductServce)中的GetProduct()查询方法。 如何查询实体。

 

2.7 Silverlight客户端使用数据

对服务器端的标有[EnableClientAccess]定制属性的每个DomainService,客户端项目中生成的文件都包含有一个DomainContext类。 Silverlight客户端可实例化这些DomainContext并与其互动。 下例显示人们如何照此在网格中显示产品。

我们向客户端项目添加一个DataGrid,如下所示:

 

 然后我们向幕后文件添加一些代码来实例化生成的DomainContext,从服务器提取产品,并将其绑定到DataGrid

  

我们现在可以运行该应用。所见如下:

 

 2.8 总结

本节对使用.NET RIA服务框架的一个NSilverlight应用项目的关键概念作了一个简述。 由此得到的要点是:

·         通过在Silverlight项目和Web项目间建立“RIA链接,可以把标准Silverlight Web应用项目变成N层应用。[4].

 

·         最简单的N层应用由一个解决方案里两个分别的项目组成; 一个用于ASP.NET服务器项目(中间层),而另一个用于Silverlight客户端项目(客户端)。

 

·         服务器项目中的DomainService 呈现一组实体和操作,适用于某一特定领域。 应用开发人员将其定制的应用逻辑放置到该DomainService类中。

 

·         在生成解决方案时,客户端代理类会自动生成到Silverlight客户端项目中[5],与服务器的DomainService呈现的实体和操作相对应。

 

·         Silverlight客户端代码与生成的DomainContext代理类互动,以获得和操纵对应的实体。

 

·         服务器和客户层都操作一组共同的实体类型,于是能够跨层共享商业逻辑和验证规则。



[1] 你也可使用Add New ProjectSilverlight应用加入到一个已有的Web应用项目。

[2]当选定“Enable Editing”时,DomainService类将呈现方法以创建、更新和删除相应的实体。

[3].NET RIA服务框架有针对实体框架和LING to SQL的基类。它还有 一个不区分技术的基类。

[4]在创建项目时使用“Enable .NET RIA Services”检查框

[5]多个Silverlight客户端项目可以同单个ASP.NET Web应用相关联,并且每个都会获得自己的客户端代理类。

 

转载于:https://www.cnblogs.com/sbxlm/archive/2009/10/25/1589367.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微软RIA服务2009年7月预览版官方手册第2节(翻译:戴石麟) 的相关文章

  • 求帮助安装mysql 出现红色感叹号

  • 【python】【django】cursor.fetchall()的结果是元组

    今天做测试 用django db 的connection来执行一个非常简单的查询语句 sql str select col 1 from table 1 where criteria 1 cursor connection cursor c
  • 混乱的代码是技术债吗

    翻译自 Uncle Bob 的 Blog A Mess is not a Technical Debt 主要是鲍勃大叔的观点 混乱的代码实现不是技术债 原文地址见超链接 The term Technical Debt was created
  • 成功解决安装tensorflow,安装进度1/4,爆红一大片且有很多File出现timed out

    之前安装几次 CPU tensorflow总是出现一大片红 自己发现其中一个原因是python版本和tensorflow不对应 tensorflow 2 0 0 得和python3 5 3 7对应 我之前的版本是3 8 5 会出现不兼容情况
  • 银行定期存款产品目标客户的确定——基于逻辑回归

    本篇文章将会介绍用Python分析银行定期存款产品目标客户的确定详细建模细节 业务框架分析以及模型的选择与评估分析参见上一篇文章 银行定期存款产品目标客户的确定 基于逻辑回归 建模前分析 1 导入各种模块并读取数据 2 数据预处理 维规约
  • STM32 keil中__IO得意思

    IO解释 STM32得库函数中 HAL和LL库都有 存在一个 IO得宏定义 define I volatile const lt defines read only permissions define O volatile lt defi
  • STM32配置时钟系统流程(固件库/外设标准库)

    前提 STM32F10x系列固件库 标准外设库 前言 固件库帮我们写好了 时钟系统 时钟树 的配置函数 该函数也不需要我们去调用 只要正确包含了STM32的启动文件 s文件 就行 s启动文件调用执行了时钟配置函数 先于main函数执行 s启
  • “钢铁侠”大战“机器人”!马斯克称「笼中格斗」将在 X 上直播,小扎应战:8 月 26 日如何?...

    由马斯克和扎克伯格领衔 随后引爆全网讨论的 约架 已过去快两个月 先是约定在拉斯维加斯来一场 笼中格斗 接着网友看热闹不嫌事大的做起了预告海报 最后由马斯克母亲出面叫停 当大家以为格斗一事要不了了之时 马斯克再次发声 要打 准备在 X 上直
  • 【Android】拾物App期末作业

    一 期末作业题目 校园失物 拾物APP 二 实施目的 通过本实训 使受训者可以深入理解Android相关技术 并将所学知识应用到实际的中等规模的程序设计中 同时 通过本实训 受训者可以拓展Android相关的知识 提升受训者的能力 三 实施
  • java中JDK JRE JVM的关系

    1 1 软件开发介绍 程序是为了模拟现实世界 解决显示问题而使用计算机语言编写的一系列有序的指令集合 软件 即一系列按照特定顺序组织的计算机数据和指令集合 有系统软件和应用软件之分 人机交互方式 图形化界面 GUI 命令行方式 CLI 常用
  • IO作业day5

    1 gt 使用两个线程完成两个文件的拷贝 主线程拷贝前一半内容 子线程拷贝后一半内容 并且主线程要阻塞回收子线程资源 2 gt 使用三个进程完成两个文件的拷贝 主线程拷贝前三分之一 子线程1拷贝中间三分之一 子线程2拷贝后三分之一 主线程要
  • 使用 Android 开发 MQTT 客户端

    MQTT 代表消息队列遥测传输 它是一种功能强大的消息传输协议 主要用于机器对机器 M2M 和物联网 IoT 通信上下文 MQTT 在这些情况下是首选 因为它易于实施 并且非常适合资源有限的设备 在本文中 我们将开发一个使用 MQTT 协议
  • c语言结构体简单试题,C语言6结构体练习题6

    第六章 结构体 1 下面对结构变量的叙述中错误的是 A 相同类型的结构变量间可以相互赋值 B 通过结构变量 可以任意引用它的成员 C 结构变量中某个成员与这个成员类型相同 的简单变量间可相互赋值 D 结构变量与简单变量间可以赋值 2 有枚举
  • 如何实现算法中的公平性

    机器学习的公平性问题近几年受到越来越多的关注 该领域出现了一些新的进展 机器学习训练在涉及到性别 种族等与人相关的敏感属性时 常常会由于统计性偏差 算法本身甚至是人为偏见而引入歧视性行为 由此 为消除差别影响 改进机器学习公平性 主要途径包
  • 在jsp中实现表格内设置滚动框

    当我们在页面中需要放置多条数据时 滚动框则将是一个十分不错的选择 在需要加入滚动框的表格内设置标签 table tbody style display block tbody table
  • 利用Python实现卷积神经网络的可视化

    对于深度学习这种端到端模型来说 如何说明和理解其中的训练过程是大多数研究者关注热点之一 这个问题对于那种高风险行业显得尤为重视 比如医疗 军事等 在深度学习中 这个问题被称作 黑匣子 Black Box 如果不能解释模型的工作过程 我们怎么
  • C#网络编程,多个客户端连接服务器端并发送消息

    最近学习进度到了C 网络编程 在学习这一章节的知识点 写了一些小demo 此次发表的为服务器监听端口 和多个客户端连接 获取多个客户端发来的消息 服务器端代码 using System Net using System Net Socket
  • SQL Server迭代求和

    drop table t geovindu create table t geovindu xid int IDENTITY 1 1 price money DebitCredit VARCHAR 2 adate datetime defa
  • Android学习之 Scroller的介绍与使用

    类概述 Android里Scroller类是为了实现View平滑滚动的一个Helper类 通常在自定义的View时使用 在View中定义一个私有成员mScroller new Scroller context 设置mScroller滚动的位
  • 微服务工程搭建过程中的注意点

    1 父工程pom xml文件 1 父工程的maven坐标 2 packaging使用pom 原因 在Spring Cloud微服务工程中 通常会采用多模块的方式进行开发 父工程的pom文件中的packaging标签设置为pom 是因为父工程

随机推荐

  • Spring Framework 入门(一)

    Spring Framework各模块作用介绍 可以参考spring framework的github项目 源码地址 https github com spring projects spring framework 下面我们分别了解下各个
  • SQL所有关键字及其作用:

    以下是MySQL的所有关键字及其作用 ADD 在表中添加新的列或索引 ALL 返回满足条件的所有行 包括重复行 ALTER 修改表的结构 如添加 修改或删除列 ANALYZE 分析并收集表的统计信息 用于优化查询 AND 用于多条件查询的逻
  • wedo2.0编程模块介绍_西门子S7-200 SMART硬件和编程软件简介

    前文给大家简单的讲介绍了一下PLC编程涉及的一些概念型知识 本文开始实践 今天带来的是SIMATIC S7 200 SMART硬件和编程软件简介 SIMATIC S7 200 SMART 是西门子公司经过大量市场调研 为中国客户量身定制的一
  • Java 多线程 --- 按序打印

    Java 多线程 按序打印 方法1 控制变量 使用volatile关键字优化 方法2 synchronized wait notifyAll 方法3 信号量 给你一个类 public class Foo public void first
  • 【深度学习】参数量、模型大小、显存

    对于一个深度学习神经网络来说 其通常包含很多卷积层 用于不断提取目标的特征 或对目标进行最终定位或者分类 1 数据存储精度与存储空间 在深度学习神经网络中 最常见的数据格式是float32 占4个字节 Byte 类似地 float16 占2
  • std::condition_variable

    std condition variable std condition variable 是C 11提供的条件变量 可用于同时阻塞一个线程或多个线程 一般的 生产者线程利用支持std mutex的std lock guard std un
  • 【React Hook】一文让你彻底明白何为State Hook?

    使用 State Hook 下面的例子介绍了 Hook import React useState from react function Example 声明一个叫 count 的 state 变量 const count setCoun
  • 如何解除计算机的启动项,UEFI安全启动怎么关闭 关闭UEFI启动项的方法图解

    大家都知道现在很多电脑都预装win8系统 其系统都开启了UEFI安全启动选项 然而 对于不习惯win8操作界面的朋友来说 可能就会把win8改为win7 但是我们得知道Win8改装Win7需要在BIOS下关闭UEFI选项 如果OS选项已经关
  • ctfshow-萌赛

    目录 web 签到 给她 假声赛 web 签到 很明显的命令执行漏洞 我们把前后闭合即可 payload 1 ls 1 1 cat flag 1 给她 根据题目提示很容易就想到是 git泄露 直接用gitHack扫描题目地址 git 发现存
  • 电子科技大学人工智能期末复习笔记(二):MDP与强化学习

    目录 前言 期望最大搜索 Expectimax Search 马尔科夫决策 MDP offline 超重点 先来看一个例子 基本概念 政策 Policy 折扣 Discounting 如何停止循环 价值迭代 Value Iteration
  • LeetcodeSQL入门——知识点总结(选择/排序/修改/字符串处理/正则)

    LeetcodeSQL入门 选择 排序 修改 字符串处理 选择 sql语言对于空值的判断是IS NULL或者IS NOT NULL eg 某网站包含两个表 Customers 表和 Orders 表 编写一个 SQL 查询 找出所有从不订购
  • 剑指Offer 40

    使用优先队列 将非负数变为非正数存储 结果变成非负数 class Solution public int getLeastNumbers int arr int k if k 0 return new int 0 int nums new
  • SequenceInputStream----合并流

    这个类的作用是将多个输入流合并成一个输入流 通过SequenceInputStream类包装后形成新的一个总的输入流 1 SequenceInputStream InputStream s1 InputStream s2 和Sequence
  • 差分方程与滤波的实现

    1 滤波基础知识 2 差分方程 3 IIR滤波器 1 直接I型IIR滤波器 2 直接II型IIR滤波器
  • 备战2023蓝桥国赛-移动服务

    题目描述 解析 这道题我想复杂了 一开始我是这样想的 设dp i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位置的情况下的最小花费 state i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位
  • Typescript 之接口 interface(详解)

    一 interface的基本含义 TS新增了一个重要概念 接口 分为对象类型接口和函数类型接口 接口可以约束对象 函数 类的结构和类型 是一种代码协作必须遵守的契约 Interface 是一种描述对象或函数的东西 你可以把它理解为形状 一个
  • 使用github免费搭建个人博客后的写作及上传说明

    项目地址 我的博客github项目地址 个人博客网站 欢迎进入我的博客 本篇文章介绍如何在博客搭建好的基础上 使用它 使用它来写博客 更新博客页面 第一种方法 本地编辑 上传到github 首先 从我的github个人博客项目仓库克隆出该工
  • vscode中CommandNotFoundError: Your shell has not been properly configured to use ‘conda active的可能解决方法

    一 问题背景 如题 出现该问题后 我首先通过搜索尝试了conda init 用管理员身份运行powershell进行权限配置等方法无果 python之 vscode中激活conda虚拟环境报错或者打开虚拟环境失败 if using cond
  • 滑动时间窗口的思想和实现,环形数组,golang

    固定时间窗口 在开发限流组件的时候 我们需要统计一个时间区间内的请求数 比如以分钟为单位 所谓固定时间窗口 就是根据时间函数得到当前请求落在哪个分钟之内 我们在统计的时候只关注当前分钟之内的数量 即 0s 60s 因为流量并不是均匀的 所以
  • 微软RIA服务2009年7月预览版官方手册第2节(翻译:戴石麟)

    2 理解N层Silverlight应用项目 微软 NET RIA服务通过结合ASP NET和Silverlight平台来简化传统N层应用模式 应用逻辑写在中间层上 通过查询 更新 定制方法和服务操作来控制对数据的访问 NET RIA服务特性