天天看點

Silverlight中關于DomainService操作資料的分析.

在當初搭建項目架構時.考慮到把資料通路和UI分離利用Silverlight RIA Services Class Library類庫來搭建底層資料通路. 同時頁面顯示資料格式較多. 有一部分采用綁定方式.是以用到MVVM[Module-View-ViewModule]架構比較容易, 這樣既是把MVVM架構和Ria Service資料通路混合到一塊.項目結構:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/180853609.png"></a>

說明項目結構:

HROA_Services:Silverlight RIA Services Class Library類庫 [Ria資料通路]

HROA_Controls:Silverlight項目中常用自定義控件.

HROA_Entitys:MVVM中Module層

HROA_UI:MVVM中View層

HROA_ViewModules:MVVM中ViewModule層.

HROA_UI.Web:sliverlight UI承載.

既然實際需求中UI[MVVM中View]層資料顯示樣式偏多.UI應該可定制的.MVVM架構正是從WPF的MVP[Model-View-Presenter]模式演變而來.資料綁定和ViewModule相結合突出簡單實用 容易操作. 同時把UI與業務邏輯進行分離出來. ViewModule中儲存着UI的特有屬性和調用接口.并由一個ViewModule視圖同屬性進行綁定. 形成松散的耦合. 個人直覺了解:

其實MVVM基于事件綁定機制, 在View層中隻要完成綁定即可,View會自動更新Model,Model再通知Control,這樣就可大量減少View 層中的Control代碼. 回想一個WebForm開發View層中需要編寫大量控制頁面代碼.移植和可重用性很低,導緻做了很多重複性工作,MVVM恰恰在一定程度上簡化這樣混亂結構.

A:建立DomainService.

<a target="_blank" href="http://blog.51cto.com/attachment/201201/180859883.png"></a>

通過建立向導建立時.Enable editing預設不選中.直接建立DomainService則隻自動生成1個查詢方法.選中後則自動添加增删改查4個方法. 分析這4個自動生成方法:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/180905569.jpg"></a>

各個方法傳回值定義方式如上.DomainService不僅可以生成如上常用4個方法 也支援使用者自定義方法.定義格式如下:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/180911523.png"></a>

當然在DomainService 也支援Reslove和Invoke方法.定義文法如下:

<a target="_blank" href="http://blog.51cto.com/attachment/201201/180917236.png"></a>

在技術群裡曾有人多次跟我提起 為什麼我自定義一個方法傳回值為一個Boolean值. 在調用時也用Boolean接受 總是報異常?.例如DomainService自定義:

public bool islogin()  

   {  

     return "chenkai".Equals("chenkaige");//設定傳回結果為False 

   }  

UI正确調用方式:

//調用測試  

 InvokeOperation&lt;bool&gt; getresinvoke = getdomain.islogin();  

 string getresult = getresinvoke.Value.ToString();  

接受類型應該為InvokeOperation&lt;bool&gt;,在DomainServer中自定義方法islogin并沒有帶辨別屬性UseCustomerMethod.但你可以顯性的指定它為使用者自定義方法.前面提到增删改查4個方法辨別 有個在命名上有個特點:

當在4個方法中帶了各自辨別例如 更新方法前帶了[Update]. 既是辨別該方法為更新方法.同時該方法命名可以自定義 .如下:

[Update]  

  public void UpdateUserBaseInfor(Sl_Users getuser)  

     {  

         this.ObjectContext.Sl_Users.AttachAsModified(currentSl_Users, this.ChangeSet.GetOriginal(currentSl_Users));   

     }  

另外還必須提一點.發生資料沖突[并發]解析方法:

這個問題是在項目後期通路統計圖資料遇到的.當多個使用者同時更新一張表中同一條記錄中相同字段時.DomainSErvice會提示一個異常. 其實這就是常見資料并發.在出現并發儲存資料可以采用解析方法.這點對于一個穩定系統而言也很重要,解析方法使用. 

// 解析方法儲存資料  

 public bool ResolveSysteUser(Sl_Users currentUser,Sl_Users orginalUser,Sl_Users saveUser,bool isDeleteOperator)  

 {  

    return false;  

 } 

文法定義格式: ResolveSysteUser()參數:

第一個是目前使用者實體, 第二個最初實體,第三個要儲存實體,最後一個參數必須為Bool類型.注意:在此方法定義之前 必須定義該實體的更新方法.否則資料儲存失敗并提示一個異常.

 另外DomainServer還可以定義另外兩種類型方法:服務操作方法和一個規避方法使用的IgnoreOperator屬性:

當你需要建立一個方法來操作更多資料或是這個操作方法對不依賴于預設定義CRUD[增删改查]方法 你可以适用ServiceOperator服務操作, 例如你可以用它來更新系統使用者部分資訊. 登入狀态等需要動态更新. ServerOperator.參數必須相對應實體類型. 傳回值為Void.但是如果要辨別一個方法為ServiceOperator必須在方法前制定辨別屬性[ServiceOperator].如下:

[ServiceOperation]  

 public void ApproveExpenseReport( ExpenseReport expenseReport)  

   if (expenseReport.Status == 1)   

     if (expenseReport.EntityState == System.Data.EntityState.Detached)   

       Context.Attach(expenseReport);  

     expenseReport.Status = 2;  

 }  

IgnoreOperator應用場景為忽略DomainService中特定域方法.

有些時候.我們可以把一些定義DomainService中方法顯示排除在外.不想讓系統識别它是一個域方法.但仍定義在DomainService中. 既可以 在這些方法辨別屬性加上[IgnoreOperator] 于是系統把該方法識别一個可忽略方法.

本文轉自chenkaiunion 51CTO部落格,原文連結:http://blog.51cto.com/chenkai/764904