客戶端代碼生成
生成的代碼位於客戶端項目的Generated_Code文件夾內。想要看到這個文件夾,必須在客戶端項目的解決方案資源 管理器的窗口下,選擇“顯示所有文件 ”。我們不應直接改動此文件夾內的類,因爲在客戶端項目重新生成時,文件會被覆 蓋。然而,我們可以打開生成的文件,查看裏面可被客戶端項目利用的代碼。
生成客戶端代碼的算法遵循以下規則:
1. 分析所有的程序集,包括生成的,或中間層爲Domain service classes,Entity classes,shared code所引用的。
2. 對每個帶有EnableClientAccessAttribute屬性註釋的域服務,都生成一個從DomainContext類派生的類。
3. 對每個域服務類中的查詢方法、命名的更新方法或調用的操作,都在域上下文類中生成一個方法。
4. 對每個域服務公開的實體類,生成一個實體代理類。
5. 拷貝標記爲共享的代碼到客戶端項目。
下圖顯示了一箇中間層項目生 成的客戶端代碼
DomainService 和 DomainContext
爲 每個域服務生成的派生於Domaincontext的類,遵循下面的規則:
1. Domain Context類須與Domain service具有一樣的命名空間。
2. domain context類包含3個構造函數:
a. 默認的構造函數,嵌入了必要的URI,使用WebDomainClient(TContract)類在http上與域服務溝通
b. 允許用戶指定一個可交替的URI的構造函數。
c. 允許用戶提供一個自定義實現的DomainClient的構造函數。
3. 對每個與服務類中的查詢方法,在domain context中都會生成一個EntityQuery(TEntity)方法。
4. 對每個命名的更新方法(named update method)或調用的操作,在域上下文中都會生成對應的方法。
5. 在domain service中執行插入、更新、刪除的公共方法,會使域上下文中的EntityContainer在生成時帶有EntitySetOperations 標記,這個標記指定哪個操作在客戶端是允許的。
實體類和實體代理類
生成實體代理類 時,應遵循如下規則:
1. 代理類應該與中間層中的實體類具有一樣的名字和命名空間。
2. 實體類中所有公共成員屬性都會在代理類中生成,除非某些類型或成員屬性已經在客戶端項目中存在。
3. 每個屬性設置器都包含執行驗證和通知客戶屬性正在改變和已經改變的代碼。
4. 元數據屬性是與生成的代碼中的實體類連在一起的。客戶端不會存在元數據類。
5. 如果可能,定製的屬性會傳遞到代理類。詳情參閱下面的內容
定製的屬性
如果定製的屬性 在客戶端項目的編譯中沒有出現錯誤,那麼這個定製的屬性就可以傳遞到代理類中。爲了保證屬性能被傳遞,應滿足如下條件:
1. 在客戶端提供定製的屬性的類型。
2. 在定製屬性中指定的所有類型,在客戶端都應該提供。
3. 這個定製屬性必須對它所有的成員屬性公開公共設置器,或者公開一個可以設置那些沒有公共設置器的成員屬性的構造函數。
如果所需的定製屬性 沒有傳遞到客戶端,我們可能需要在客戶端中添加一個程序集引用。
共享代碼
當在中間層 和表示層之間共享代碼時,代碼被原封不動的拷到客戶端項目中。通過命名文件爲*.shared.cs來共享文件。
避免成 員重複
當生成實體代理類時,有可能在客戶端項目中已經定義了相同的類型和成員。我們可能已經在共享代碼或只存在於客戶 端項目中的代碼中定義了成員。RIA Service會在生成代理類之前檢查已經存在的成員。所有已經存在的成員都不在代理類中生成。