您的位置:首页 > 其它

SilverlightCMS开发之2数据交互之RIA_Service上

2010-09-26 21:26 381 查看
1 说清楚需求2 SL中的数据交互的方法3 RIA纵横谈[b]1说清楚需求[/b]=======================  说段废话:暑假的时候花了大概一个月时间大概把MSDN中文文档翻了个底朝天。越发觉得对Silverlight了解不够,很多东西学的肤浅,越是觉得需要深度的学习也需要广度的学习。于是就拿Silverlight Business Applications 练手。主要是有那么一两本书写的不错,《ProBusiness Applications with Silverlight 4》和 《Silverlight in action 4》,于是就开始看,也顺便把以前就想写的 Silverlight CMS 开工了!Welcome 2 My First OpenSource Project aqqcms! aqqcms.codeplex.com=======================上一篇中我记笔记式的写了一些关于Silverlight中的导航的东西。但导航的数据是伪的,做网站的都知道需要从获取数据。因为RIA是在本地运行需要远程获取,类似Ajax,所以我只说从Silverlight 程序外部的数据源获取数据的问题,不管他是如何与数据库交互的。OK。。。。不习惯写这些技术无关的废话。。。2 Silverlight中如何进行数据交互?不太严谨的依靠传输介质分类@1 WCF (或其他基于SOAP的)@2 HTTP(TEXT)@3 REST (JSON/XML...)@4 socket (二进制)#1 Silverlight中支持的WCF绑定
绑定名称网络协议编码科教互相备注
basicHttpBindingHTTP/HTTPSTEXT,MTOM可交互性基于SOAP1.1
netTcpBindingTCP二进制编码不可交互
pollingDuplexHttpBindingHTTP/??TEXT/??可交互不太清楚
customBinding自定义的绑定
#2再说WCF 中具体的1WCF Data Service 简称 Data Service2WCF RIA Service 简称 RIA ServiceWCF RIA Service 是基于 WCF Data Service 的。而在我们用的WCF Data Service ,已经包含了 RESTFul 的json 和 ATOM的东西。#3如何对这两个进行选择?RIA Service是在Data Service之上再进行扩展而成。设计被特别针对Silverlight 程序。内置强大的功能(CURD,安全等)。 自然兼容非MS就不太好了。Data Service 更适合广泛的被客户端(非MS)接收和操作,包括JS Ajax,silverlight,rss阅读器等等。资源的格式是json,xml,atom等的RESTFUL的东西。PS:RIA Service支持 SOAP,JSON,ODATA 三种格式格式的数据开放形式。更多等下会细说。@3主要是指web service ,以前的ASP.NET 的web service 和json 等。当然其中的XML 有些重复, SOAP 就是 基于XML的。http://www.w3school.com.cn/soap/soap_intro.asp@4对于SOCKET一并和netTcpBinding说一下,由于不是适用HTTP协议,所以领占端口,虽然他们的效率高,但是容易被公司的防火墙墙了。更适宜于做局域网的应用。不太适用于更广泛的应用。[b]3 RIA Service纵横谈[/b]纵向整合 :左边数据库+WCF RIA SERVICE+右边Silverlight程序(逻辑层+表现层)#1 开始创建一个Domain Service第一个箭头必选是允许客户端进入。第二个箭头是是否暴露ODATA数据第三个箭头是生成关联的metadata。ODATA?什么东东?允许 使用ODATA 协议。ODATA 是一系列 ATOM 协议的扩展,他允许 序列化 提供 HTTP-BASED 数据服务。类似于 REST ,但是还提供了CURD 等操作。作为ODATA 一个MS出的新的协议。他提供了更多的整合MS的产品,比如 SharePoint and PowerPivot。除了可以暴露OData格式外还有暴露 soap 和 json 的数据。具体做法是在webconfig中在ODATA旁边添加:<add name="Json" type="Microsoft.ServiceModel.DomainServices.Hosting.JsonEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /><!-- 加即VS自动退出 <add name="SOAP" type="Microsoft.ServiceModel.DomainServices.Hosting.SoapXmlEndpointFactory, Microsoft.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />--><add name="OData" type="System.ServiceModel.DomainServices.Hosting.ODataEndpointFactory, System.ServiceModel.DomainServices.Hosting.OData, Version=4.0.0.0, Culture=neutral,PublicKeyToken=31bf3856ad364e35" /></endpoints></domainServices>那么如何验证呢?如何访问?通过类似如下地址: http://localhost:2575/Services/RIAServiceLib-Web-Model-ChannelDS.svc/JSON/GetKF_Articles 可以返回JSON数据。前提是你的方法确实能得到值。中间那段XXX.SVC 你可以通过 F12 进 ChannelDS 查看。传说还可以通过 http://localhost:2575/Services/RIAServiceLib-Web-Model-ChannelDS.svc/ODatahttp://localhost:2575/Services/RIAServiceLib-Web-Model-ChannelDS.svc/OData/$metadata 查看。。。但是不懂为什么,我这里实验不行。对于SOAP的那段一添加VS就退出。。。OK下面说第三个箭头产生了什么。
[MetadataTypeAttribute(typeof(KF_Channel.KF_ChannelMetadata))]
public partial class KF_Channel {
public int ChannelID { get; set; }  等等.....
[/code]
}
这个到底是干啥用的?玩过ASP.NET 的 MVC 对于这些应该有些熟悉了。恩,你懂的,不懂就去园子里找下。这个很强大。通过一大堆属性(Attribute),你可以做一大堆功能。回忆一下以前做网站的对数据的通用需求。1从数据库操作数据。1.1增删查改列1.2并发锁1.3事务1.4 对关联表的操作。2数据验证。其他.....========================================1.1我们这里使用兼容 DLinq的AEF 自动生成了增删查改列。要是自己写也不太难。这里RIA Service 使用了一个 函数名转换 的一个东西。服务器方法签名在客户端被转换(不会翻译)Insert, Add, Create 开头的函数或者 标记了 [Insert()] 将被识别为插入操作。其他类似。。。[Invoke()] 等 取消使用 [igroe](查阅相关文档书籍可以知道更多)1.2这里我也没有很好的理解。给出相关的代码[ConcurrencyCheck]public DateTime ModifiedDate { get; set; }-----------------------------------------------------ProductPM originalProduct = ChangeSet.GetOriginal<ProductPM>(currentProduct);ProductPM storedProduct = GetProduct(currentProduct.ProductID);if (storedProduct.ModifiedDate != originalProduct.ModifiedDate) {ChangeSetEntry entry = ChangeSet.ChangeSetEntries.Single(p => p.Entity == currentProduct);List<string> conflicts = new List<string>();conflicts.Add("ModifiedDate");entry.ConflictMembers = conflicts;entry.IsDeleteConflict = false;entry.StoreEntity = storedProduct; }else {// Save ProductPM...}1.3 事务
public override bool Submit(ChangeSet changeSet) {             bool result = false;
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted;
using (TransactionScope transaction = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) { result = base.Submit(changeSet);  transaction.Complete();
}
return result; }
[/code]1.4关联表的操作
[Include]//包含外键
public EntityCollection<KF_Articles> KF_Articles { get; set; }
//操作
public KF_Channel GetFirst(int ChannelID) {  return this.ObjectContext.KF_Channel.Include("KF_Articles")                    .Where(_ => _.ChannelID == ChannelID)                    .FirstOrDefault();  }
2 数据验证[Required][StringLength(50)][RegularExpression(@"(?<user>[^@]+)@(?<host>.+)")]1 Required 指定需要满足某些条件2 Range 范围 --数字3 StringLength 长度 ---字符串4 RegularExpression 正则表达式5 自定义的===========================================================================[/code]
创建了一个dominservice 对这个东西大概都有了了解。
那么在客户端怎么调用?
[/code]
void GetArticles() {
channelDs = new ChannelDS();
var r1 = channelDs.GetFirstQuery(SectionID);
var r2 = channelDs.Load(r1);
r2.Completed += (S, E2) => {
var r3 = r2;
var articles = r3.Entities.FirstOrDefault().KF_Articles;
button1.Content = "共有" + articles.Count().ToString();
dataGrid1.ItemsSource = articles;

};
}
我们在dataGrid1对数据修改后,由于双向绑定。我们只需要保存就OK了
void button1_Click(object sender, RoutedEventArgs e) {
channelDs.SubmitChanges();
}
整个流程还是比较顺畅,RIA Service 在我们一个简单操作后面真的做了好多事情。
比如说C/S代码共享,还有其他很多机制。。我虽然知道的不多也觉得很多了。。无从说起。。
简单的大家都知道。。。难的我也不知道。
有了这些基本的东西都能操作了。
这里没有谈安全那些下次再说了。打了好久字了。。。相当于自我总结和自我教学相长吧。

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐