理解N層Silverlight應用程式
微軟 .NET RIA Services 通過將Asp.net和Silverlight相結合來簡化傳統的多層應用模式。使用queries,updates,自訂方法和服務作業,將應用邏輯代碼在中介層編寫, .NET RIA Services 特性自動在用戶端產生相應的代理類來調用這些操作,因為中介層和用戶端都是基於同一CLR,開發人員可以編寫代碼在兩端都能運行。
本文檔通過構建一個簡單的多層應用來解釋關鍵概念。
1.1 建立一個工程
通過建立一個Silverlight的Web應用工程來開始一個 .NET RIA Services多層應用。File | New Project[1]:
從上述對話方塊開始,如果.NET RIA Services 已經安裝了,則可以看到如下對話方塊高亮標記的複選框:
[1]可以使用Add New Project在已經存在的web應用程式中添加Silverlight應用程式。
預設情況下該複選框沒有選擇,要使用.Net RIA Services建立多層應用,我們必須手工選擇它。
解決方案結果如下所示:
此時,我們建立了一個有2個工程組成的一個解決方案:
1. SilverlightApplication1 – 此工程包括Silverlight代碼,我們把此作為用戶端工程,也就是我們的用戶端層
2. SilverlightApplication1.Web– 此工程為Asp.net Web應用程式代碼,是服務端工程,是我們的中介層。
使用Enable .Net RIA Services選擇框和標準的Silverlight應用程式的主要區別在於該選擇框建立了服務端工程和用戶端工程的聯絡,允許邏輯共用。具體參考後面介紹。
1.2 轉換一個存在的Web應用程式(Converting an existing web application)
如上提到,你可以後期改變是否建立“RIA link”. 如所示:
1.3 從中介層公布資料(Exposing data from the mid-tier)
為瞭解釋新功能,我們需要在中介層準備一些有效資料
1.4 從中介層訪問資料
這個例子,中介層需要使用資料庫中資料,資料庫不是.Net RIA Services必須的,用戶端對資料訪問計數及它的結構並不關心。
在中介層使用資料庫,我們使用Entity Framework來訪問AdventureWorks樣本資料庫,我們在伺服器端工程上添加新項,然後選擇Data分類:
為該應用程式從資料庫中選擇兩個表
為該應用程式從資料庫中選擇兩個表
1.5 在中介層建立一個DomainService
現在到了關鍵的步驟來示範.Net RIA Services架構的特性來。在中介層建立一個DomainService. 一個 DomainService是用來公布特定資料域(a specific data domain)實體和操作的類,也是開發人員添加應用邏輯的地方。.NET RIA Services架構套件括管道代碼(plumbing code)使在DomainService類中聲明的實體和操作在其他層可以訪問。
我們通過模板來建立範例的DomainService(添加新項目/Web分類/Domain Service),並設定該DomainService的名字為 ProductService:
模板請求一個嚮導協助構建DomainService類,此例我們選擇剛建立的模型,並且公布一個實體:Product,不選擇“Enabled editing”,表示Product實體唯讀。
(譯註:必須Build一下才出現下面列表)
確認對話方塊,新的DomainService將在選擇的工程中建立。下面是產生的程式碼:
注意產生代碼的特徵:
- 此類繼承自 LinqToEntitiesDomainService,(內建於 .NET RIA Services 架構中的基類)[1].
- 該泛型基類和我們先前建立的AdventureWorks_DataEntities 關聯。
- 該DomainService 類標記 [EnableClientAccess] 特性表明對用戶端層可見
- 產生一個 GetProduct() 唯一的查詢方法,用來公布Product實體。
- GetPruduct()實現代碼從AdventureWorks_DataEntities 物件內容獲得資料
這個新的DomainService 類是我們添加應用邏輯的地方。例如,我們可以修改GetProduct()方法來僅選擇庫存中的產品。或我們可以添加參數指定那個產品分類。
最重要的是讀中介層資料提供了公用介面,嚮導產生的程式碼僅僅是個起點,我們要在此添加應用邏輯。
其次,事實上不需要任何修改,我們可以運行應用程式,Product實體在用戶端和中介層都可見,下面我們將介紹是這成為可能的機制。
[1]The .NET RIA Services framework has base classes for the Entity Framework and LINQ to SQL. It also has a technology-agnostic DomainService base class.
1.6 從Silverlight用戶端訪問資料
還會想起當我們建立工程的時候的 “RIA link”吧?現在它起作用了。
如果我們編譯解決方案,並在用戶端工程上單擊 “Show All Files”,則可看到:
注意到用戶端工程有一個包含產生的檔案的檔案夾Generated_Code. 上面截屏上顯示了這個檔案的幾行代碼。
這個產生的檔案包含我們稱之為用戶端代理的類,這些類是由服務端的DomainService類綜合產生的。
這種機制我們將在 “理解Silverlight產生用戶端程式碼“章節介紹。這裡我們要意識到:
· 這些代理類只要服務端DomainService類修改或用戶端或解決方案重新編譯的時候會重建,所以不要修改此類因為它們會被覆蓋。
· 為每個DomainService類產生獨立的代理類,本樣本是Product實體。
·一個產生的DomainContext類用來提供用戶端訪問每個DomainService類公布的操作。本例中,產生一個ProductContext 類, 並且公布了一個 GetProductQuery() 方法,用來作為一· 個 DomainContext.Load() 方法的參數請求服務端的ProductService DomainService類的GetProduct查詢方法。具體參見 “How to Query Entities.”
1.7 在Silverlight用戶端使用資料
伺服器端每一個標記[EnableClientAccess]自訂特性的DomainService類都會在用戶端產生的檔案中產生一個DomainContex類。 Silverlight用戶端可以執行個體化這些DomainContext類並與之互動,下面例示在一個網格中顯示產品資訊:
像下面這樣添加一個DataGrid到用戶端工程中:
然後再後端代碼檔案中執行個體化產生的DomainContext,從服務端檢索資料並綁定到DataGrid:
這時運行應用程式,顯示如下:
1.8 小結
本章節概述了使用.Net RIA Serives架構構建多層Silverlight應用程式中關鍵概念 :
· 一個標準Silverlight Web應用程式可以通過建立“RIA Link”和Web應用程式之間建立多層應用程式。[1].
· 這個多呈應用程式最簡化形式是由一個單一解決方案中的兩個獨立工程組成,一個是Asp.net 伺服器工程(中介層),另一個是Silverlight用戶端工程(用戶端)
· 服務端的一個DomainService類公布一系列實體和操作,開發人員在這個類裡進行應用多級的定製。
· 當解決方案編譯的時候,服務端端DomainService公布的實體和操作對應的用戶端代理類自動產生並加入Silverlight用戶端工程。
· Silverlight用戶端代碼與產生的DomainContext互動獲得或操作相應的實體。
· 用戶端和服務端操作一套共有的實體類型,使跨層共用商務邏輯和驗證規則成為可能。
轉載自http://www.cnblogs.com/nineflowers/archive/2009/07/29/1534118.html