通过一个周末的研究,对RIAService及在Silverlight上的应用渐渐的有了比较明晰的了解。
如何创建应用RIAService的Silverlight,见Silverlight 4 使用 RIASerivce (DomainService)
简述:RIAService是WCF的一个具体的用法,在VS08和10中,提供了相应的模板。
RIAService通过自动生成规范的数据库操作类,并提供一种更直接和方便的方法,让客户端程序可以直接操作数据库。
当然,虽然说是WCF的一个具体应用,但是与传统开发基于WCF操作数据的模式是有一些不同的,用WCF的老观点可能会碰很多钉子,本人走了不少弯路。
在学习RIAService的过程中,也拜读过不少先行者的文章
WCF RIA Services
Silverlight WCF RIA服务
这两篇文章都非常有用,由于是系列型的,文章地址分章节,百度一下就能找到。
根据本人归纳,RIAService可以分为以下几个部分
1、ADO.NET数据实体模型:这是数据对象,是实际的数据库对象的一个模型对象,操作他就相当于操作真实的数据库,当然,模型的组成部分在建立的时候是可以自己设置的。模型的概念我就不说了,高人很多,我也只是了解到我能用到的部分。
2、DomainService类:该类在创建时,设置对数据模型的操作方式及与客户端的关心,自动生成数据操作的添加、删除、修改、查询方法,同时也可以自定义自己的方法或函数。
3、DomainContext类:这个是在创建好DomainService类后,Silverlight项目自动生成的类,当然这个类的名字空间是在对应的RIAService所在的项目的名字空间内。说实话,数据模型和DomainService建立好以后,在SL上最需要关注的就是DomainContext类了,因为今后的操作和数据获取都是看他的了,DomainService仅是做一个默默的数据提供者。这个类也类似于WCF中生成的代理类。
4、(Entity)类:SL除了自动生成相应的DomainContext类外,还会自动生成一个数据项的类,这个类对应于数据模型的单元数据。在今后的数据操作中可以用到。
在整个RIAService中,这四个东西共同发挥作用,下面具体说说他们是怎么工作的。
数据模型就不说了,像是数据库的一个投影,操作他就等于在操作数据库。但是在RS中,我们不用直接操作他,而是靠DomianSerivce来操作。
DomianSerive可以在客户端用,也可以在服务器端用,在服务器端用还没有测试过,不过这个东西的出现主要就是为了SL服务的,所以重点还是在于研究在SL中怎么使用它。SL是客户端的,而DomianService是在服务器端的,于是,老方法,用一个代理来变相的使用他,这个代理就是DomianContext。
DomianContext才是我们需要重点研究的东西,他是一个类,包含了在SL上操作数据说需要的所有方法和属性。
以数据的增删查改举例说明
在客户端获取数据,需要使用到DomianContext的Load方法,在DomianContext中有一个(EntitySet)属性具体名称要看创建数据模型和DomianService时给数据命的名称。
在DomianContext类中有一个GetXXXQuery()的方法,这个方法对应于DomianService的查询方法,可能你会误以为直接调用这个方法,就可以得到数据了,其实不然,这个方法获得的只是一个查询实例,不会返回具体数据。
实际上DomainContext获取数据就是通过Load方法,讲数据填充到这个EntitySet属性里,这个EntitySet属性就,然后我们的数据空间就通过绑定这个EntitySet来显示数据。
Load方法需要一个参数,这个参数就是一个查询实例(EntityQuery)
代码如下
MyDomainServiceH mh = new MyDomainServiceH();
EntityQuery<TestTable> query;
query = from t in mh.GetTestTableCanQuery() select t;
mh.Load<TestTable>(query);//这个查询不做任何筛选和排序,因此也等效于mh.Load<TestTable>(mh.GetTestTableCanQuery());
dataGrid1.ItemsSource = mh.TestTables;
这样就可以写一个自定义的Linq查询来获取数据,也就是说,DomianContext通过传递一个查询作为参数来获取所需的数据,不过有个地方需要注意,DomianService中需要在查询方法上指定一个签名[Query(IsComposable = true)] 即可自定义查询。
注意mh.TestTables 在执行Load方法前,这个TestTables是空的,在执行之后,他就被装满了数据了,这个地方有点类似DataSet的填充和使用。
获取数据还是比较简单的,但是如何添加、修改、删除数据呢?
这个地方可能又会误以为执行DomainContext的添加删除和修改方法即可,但是你会发现,在DomainContext中根本没有这些方法,为什么呢?DomianService不是生成了这些方法吗?为什么DomianContext中没有对应的方法。
DomianService生成数据操作的方法并不会给DomianContext直接使用,并不是我们熟悉的传递参数调用方法就可以直接操作数据了的。
由于DomianContext是用于Sl的,Sl是客户端的,因此MS在这个地方设计得也很巧妙,不提供直接操作数据的方法给DomianContext,避免开发者忽略了数据传输频繁读取数据库的问题。
以本例来说,前面我们不是得到了mh.TestTables吗?我们一切的添加删除修改方法都操作这个东西就可以了。但是这还不够,对mh.TestTables的操作是在客户端内存中的,并没有改变数据库,DomainContext还提供了一个方法SubmitChanges();这个方法的作用就是将所有的数据变化都同步到数据库中,这样,DomianContext就采用了一种批量同步的方式来对数据库进行操作,而不用执行每一个数据操作都要反复的读取数据库和传递数据。
基本上所有的数据操作都是在EntitySet上完成,然后由DomianContext提交同步。
代码如下
//添加
TestTable tt = new TestTable();
tt.Text = DateTime.Now.ToString();
mh.TestTables.Add(tt);
mh.SubmitChanges();
//删除
mh.TestTables.Remove(mh.TestTables.Single<TestTable>(t => t.ID == 27));
mh.SubmitChanges();
//修改
mh.TestTables.Single<TestTable>(t => t.ID ==30).Text=DateTime.Now.ToString();
mh.SubmitChanges();
看到代码,就很清楚了,对数据的操作就类似对DataTable的操作一样,然后调用个SubmitChanges方法就可以将数据的变化同步到数据库了。很方便,只是稍微和传统的方式不太一样,一开始本人在次走了不少弯路。
不过,这个EntitySet不同于DataTable或者DataView,操作起来可能不太顺手,不过习惯就好,我的例子中用的Linq的方式来对数据定位并修改。
还有个地方需要注意,如果是用的多个事件来执行数据库操作,不同的DomianContext的EntitySet是不同的,也就是说,可能我们需要定义个全局的DomainContext实例来周旋于不同的事件中。当然如果不嫌性能差,在不同的事件中,也可以定义新的局部DomainContext实例来完成操作,但是注意,定义局部的DomianContext实例时,别忘记要通过Load方法获取一次EntitySet,否则,这个实例中的EntitySet将是空的,无法操作。
至此,SL使用RIAServcie的一些基础的应用就是这样了,但是在DomianService和DomianContext中还有非常多的属性和方法值得研究。本文仅是个人的体会和观点。
分享到:
相关推荐
在"SilverLight 4 调用RIA Service例程"这个主题中,我们将深入探讨如何在Silverlight 4应用中利用RIA Services进行数据通信和业务逻辑处理。以下是一些关键知识点: 1. **RIA Services的基本概念**:RIA Services...
通过研究"ExampleSilverlightApp"的源代码,我们可以了解到如何设置和使用WCF RIA服务在Silverlight应用中进行数据操作。这包括定义DomainService,创建客户端数据服务引用,使用Entity Framework和LINQ进行数据查询...
Domain Service类继承自`System.ServiceModel.DomainServices.Server.DomainService`基类,并且可以包含操作方法,这些方法对应于数据库的CRUD操作。 在"Silverlight WCF RIA服务(九)Domain Service 2 源代码"中...
由于WCF RIA Services会自动处理数据的序列化和反序列化,因此客户端代码可以直接与服务操作交互,就像它们在本地调用一个方法一样。 总的来说,调用WCF RIA Services中的存储过程需要以下几个步骤: 1. 手动导入...
WCF(Windows Communication Foundation)RIAServices,全称为Relational Data Services,是微软推出的一种用于构建RIA(Rich Internet Applications)的框架,它简化了在Silverlight或WPF应用中与服务器端数据交互...
1. **DomainService**: 这是WCF RIA服务的核心部分,它定义了服务器端的数据模型和服务操作。开发者可以在这里定义数据实体和业务逻辑,这些将被自动暴露给Silverlight客户端。 2. **Entities**: 这通常包含一个或...
3. **领域操作方法**:`.DomainService`类中的方法代表了可由客户端调用的操作,如查询、添加、更新和删除数据。这些方法在客户端的代理类中自动生成,使得客户端可以直接调用,实现与服务器的通信。 4. **数据绑定...
- **特点**:WCF RIA Services 是一种简化客户端和服务端交互的技术,提供了 DomainService 和 DomainContext 类来管理数据和服务调用。 - **应用场景**:需要构建复杂数据驱动的应用程序。 **关键问题解决** - **...
5. **Communication**: SilverlightApplication6中的通信机制,如使用WCF RIA服务调用,通常是通过异步操作实现的,确保了良好的用户体验,即使在等待服务器响应时也不阻塞用户界面。 **数据绑定和实体** 在...
本教程将通过一个实际的.NET RIA(Rich Internet Applications)服务应用案例,详细介绍如何使用Silverlight 3.0模板创建第一个项目。RIA服务允许开发者在客户端和服务器之间无缝地共享业务逻辑和数据,使得Web应用...
在Silverlight应用中使用WCF RIA服务,开发者可以方便地在服务器和客户端之间交换数据,实现业务逻辑和UI的分离。 首先,Silverlight客户端5源代码通常包括以下几个关键部分: 1. **XAML界面**:这部分定义了用户...
RIA Services是Silverlight应用程序与后端数据交互的关键组件,它的缺失会导致应用程序无法正确加载或运行。解决方案是在服务器上安装RIA Services,或作为替代方案,手动将所需程序集复制到本地并设置为“复制到...
8. **分页和排序**:在处理大量数据时,RIA服务支持分页和排序,允许用户高效地查看和操作数据。 通过【RiaServiceDemo】项目,学习者可以深入理解如何在Silverlight应用中使用RIA服务来实现数据驱动的功能,同时...
5. **发布服务**:最后,将Domain Service添加到Web项目的服务引用中,使得Silverlight客户端可以发现并使用这些服务。 接下来,我们转向报表的展示,特别是使用Silverlight的图表功能。RIA Services Charts是RIA ...
在传统的设计中,Service层通常作为业务逻辑的载体,而Repository则负责数据持久化。然而,这种设计可能导致Service过度依赖于Repository,使得Service与领域模型之间紧密耦合,不利于代码的维护和扩展。为了解决这...
WPF (Windows Presentaion Foundation) Application communicating with the WCF service exposed by a DomainService
在DDD中,通常采用仓储模式来封装数据操作。"MyServices.Data"可能包含实体框架(Entity Framework)或其他ORM工具的配置和实现,以及与数据库交互的仓储接口和实现。 4. **领域层(DomainServices)**: 这个命名...
- **内容概述**:介绍使用Silverlight创建丰富的互联网应用程序(RIA)。 - **知识点**: - Silverlight的应用场景。 - XAML和C#/VB.NET的结合。 - 客户端和服务端通信。 **24. Dynamic Data** - **内容概述**:...
此外,为了实现客户端与服务端之间的高效通信,采用了一种封装好的WCF (Windows Communication Foundation) 方式,即DomainService。这样可以简化开发流程,提高开发效率。 #### 功能说明 本软件提供了以下核心...