Share via


產生用戶端程式碼

當您使用 WCF RIA Services 連結 Silverlight 專案與中介層專案時,RIA Services 會根據您在中介層公開的實體和作業來為用戶端應用程式產生用戶端 Proxy 類別。因為 RIA Services 產生這些類別,所以您不必將任何應用程式邏輯從中介層複製到展示層。對中介層程式碼所做的任何變更會在用戶端專案重建時與展示層程式碼同步處理。將 RIA Services 連結加入至方案時,會在該方案中加入明確組建相依性,強制伺服器專案在產生用戶端專案的程式碼之前進行建置。

產生的程式碼位於用戶端專案中名為 Generated_Code 的資料夾內。您必須選取 [方案總管] 視窗中的 [顯示所有檔案],才能查看這個資料夾。您不可以直接在 Generated_Code 資料夾中修改類別,因為這些類別在用戶端專案重建時會被覆寫。但是,您可以開啟產生的檔案來查看可供用戶端專案使用的程式碼。

RIA_GeneratedCode

產生用戶端程式碼的演算法會遵循以下基本規則:

  1. 分析所有由中介層專案為 DomainService 類別、實體類別和共用程式碼所建置或參考的組件。

  2. 為每個帶有 DomainContext 屬性附註的網域服務,產生衍生自 EnableClientAccessAttribute 類別的類別。

  3. 為每個在 DomainService 類別中的查詢方法,即具名更新方法 (UsingCustomMethod 屬性設為 true 的更新方法),或叫用作業,在網域內容中產生一個方法。

  4. 為每個由網域服務公開的實體類別,產生實體 Proxy 類別。查詢方法傳回實體類別時就會將其公開。

  5. 將標記為共用的程式碼複製至用戶端專案。

下圖顯示為中介層專案產生的用戶端程式碼。

產生用戶端程式碼

DomainService 和 DomainContext

根據以下規則,為每個 DomainService 類別產生一個衍生自 DomainContext 的類別。

  1. 產生與網域服務同命名空間的網域內容類別。

  2. 網域內容類別包含三種建構函式:

    1. 預設建構函式,使用 WebDomainClient 類別內嵌透過 HTTP 與網域服務進行通訊所需的 URI。

    2. 允許用戶端指定替代 URI 的建構函式。

    3. 允許用戶端提供自訂 DomainClient 實作 (通常用於單元測試或重新導向到傳輸層) 的建構函式。

  3. 為每個在 DomainService 類別中的查詢方法,產生可用於用戶端專案的 EntityQuery 方法來載入實體。

  4. 為每個叫用作業,產生可用來非同步叫用作業的對應 InvokeOperation 方法。

  5. 為每個標記著 Update(UsingCustomMethod=true) 屬性的方法,產生加以叫用和是否已被叫用的方法。

  6. 網域服務中執行插入、更新或刪除的公用方法會導致網域內容中產生的 EntityContainerEntitySetOperations 旗標建構,這個旗標表示用戶端允許的作業。

實體類別和實體 Proxy 類別

產生實體 Proxy 類別時會套用以下規則:

  1. 產生與中介層的實體類別同名和同命名空間的 Proxy 類別。

  2. 根實體型別衍生自實體類別。衍生的實體型別衍生自中介層公開的對應基底型別。

  3. 在 Proxy 類別中產生每個包含支援型別且未標記為 ExcludeAttribute 屬性 (Attribute) 的公用屬性 (Property),除非該屬性 (Property) 已存在於用戶端專案中。如需詳細資訊,請參閱本主題稍後<避免重複的成員>一節的說明。Object 不是支援的型別。

  4. 每個屬性 setter 都會包含執行驗證且通知用戶端該屬性正在變更和已變更的程式碼。

  5. 中繼資料屬性與產生的程式碼中的實體類別相結合。中繼資料類別不會存在於用戶端。

  6. 如果可行,自訂屬性會傳播至 Proxy 類別。如需自訂屬性存在於用戶端專案的必要條件之說明,請參閱下一節<自訂屬性>。

如果在成員之 CustomValidationAttribute 的多個執行個體中指定相同型別和驗證方法,則只會有一個 CustomValidationAttribute 傳播至該成員。

自訂屬性

如果在用戶端專案中自訂屬性沒有產生編譯錯誤,自訂屬性就會傳播至 Proxy 類別。下列條件必須滿足,才能傳播自訂屬性:

  1. 用戶端專案須有自訂屬性型別。

  2. 用戶端專案須有自訂屬性宣告中指定的任何型別。

  3. 自訂屬性 (Attribute) 型別必須向其所有屬性 (Property) 公開公用 setter,或公開允許設定沒有公用 setter 之屬性 (Property) 的建構函式。

如果必要的自訂屬性未傳播至用戶端,您可能要在用戶端專案中加入組件參考。為在用戶端專案中編譯自訂屬性所需的任何組件加入參考。您也可以在共用檔案中定義自訂屬性,以便在層間加以共用。

共用程式碼

在中介層與展示層間共用程式碼檔時,會直接將程式碼複製至用戶端專案,並不做任何變更。以 *.shared.cs*.shared.vb 模式命名檔案,即可將該檔案指定為共用檔案。內含共用檔案的中介層專案的目錄結構會複製在 [Generated_Code] 資料夾之下。

在共用程式碼檔中加入自訂型別,然後從叫用作業傳回該型別時,網域內容中產生的方法將不會傳回自訂型別,而是會傳回屬於架構的型別。例如,當您建立名為 MyCustomDictionary、實作 IDictionary 的自訂型別,並將該型別指定為網域作業的傳回型別時,網域內容中產生的方法將不會傳回 MyCustomDictionary,而是會傳回 Dictionary 物件。

如需詳細資訊,請參閱共用程式碼

避免重複的成員

產生實體 Proxy 類別時,可能已經使用部分類別將相同型別和成員定義在用戶端專案中。您可能已在共用程式碼或只存在於用戶端專案的程式碼中定義成員。RIA Services 在產生 Proxy 類別之前會先檢查現有的成員。將不會在 Proxy 類別中產生任何已定義的成員。

另請參閱

概念

網域服務
共用程式碼
資料