2010-01-27 51 views
0

Silverlight是偉大的,與RIA服務解決了很多東西但是。我們爲什麼不得不得到;在每個模型上設置?Silverlight,RIA服務和保護我們的數據在對象

我已經瞭解到,如果我們有一個客戶,並且客戶ID不應該改變,那麼Id屬性應該是隻讀的,如果客戶有一個密碼需要經過一些邏輯之後才能設置屬性應該是隻讀的,所以沒有人可以用錯誤的方式使用我的對象。

而我們應該幾乎永遠不會允許的最大的事情之一;例如invoice.Rows上的集合,因爲它可能會創建難以找到的bug。也許我想阻止invoice.Rows.Add(通過打破Demeter原則法)方法,因爲我想在方法invoice.AddRow(row)中執行一些檢查。在添加行之前。

有時候我們想在服務器端解決這個問題,例如,在服務器添加發票時通過服務發送行,但有時候我們想在客戶端生成整個發票然後發送它。我不想問服務嘿,我剛剛添加了這一行,我可以得到重新計算的總價格與增值稅和沒有增值稅等。

我是唯一一個感到迷茫,或者我的目標和目標錯誤的人,我們不應該用面向對象思想的silverlight嗎?

回答

1

對getter的需求源於序列化 - 您希望能夠在反序列化期間進行設置。

如果您的ID不是自動生成的,您還希望能夠爲新實體設置ID。

對於Order/OrderDetail,通常我們預計Order/OrderDetail表示一個組合場景 - 您可以插入包含明細的訂單,也可以更新訂單以添加/刪除/更新訂單明細。因此,如果您想要跨越整個圖形進行驗證,則可以將驗證規則附加到Order或者InsertOrder,UpdateOrder等方法。

至於重新計算總價格等,您當然可以在客戶端上執行此操作 - 例如,在Details集合上收聽收集更改通知,並重新計算Order的Total屬性。枚舉Details和執行聚合的代碼實際上可以在客戶端和服務器之間共享,因此您不會複製計算邏輯。

希望有所幫助。

+0

是的,我們需要setter,因爲在SL4中缺少序列化能力。這可以很容易地用.NET解決,那裏的序列化屬性是可用的並且可以得到;設置私有字段 那麼要設置Id,一個不應該改變的新實體的字段,那麼使用構造函數是一個很好的解決方案。 對於價格等的重新估計,我們當然希望稍後在服務器端使用相同的邏輯,這將是我認爲屬於域模型的ViewModel中的業務邏輯。但是在寫入時可能錯過了某些內容我不需要複製它。 – NPehrsson 2010-01-28 11:13:38