轉帖|其它|編輯:郝浩|2011-04-08 15:18:29.000|閱讀 1997 次
概述:通過一個周末的研究,對RIAService及在Silverlight上的應用漸漸的有了比較明晰的了解。RIAService通過自動生成規范的數據庫操作類,并提供一種更直接和方便的方法,讓客戶端程序可以直接操作數據庫。本文主要講述如何使用 DomainService 操作數據(RIAService),希望對大家有幫助。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
通過一個周末的研究,對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中還有非常多的屬性和方法值得研究。本文僅是個人的體會和觀點。
本站文章除注明轉載外,均為本站原創或翻譯。歡迎任何形式的轉載,但請務必注明出處、不得修改原文相關鏈接,如果存在內容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉載自:博客園