2010-04-13 71 views
7

我在服務器端有無狀態服務和貧血域對象。服務器和客戶端之間的模型是POCO DTO。客戶端應該成爲MVVM。該模型可以是20個不同類別的約100個實例的圖形。客戶端編輯器包含不同的標籤頁,所有標籤頁都與模型/視圖模型實時連接。MVVM模式:模型服務器往返後的ViewModel更新

我的問題是如何傳播服務器往返後很好的方式更改。從ViewModel向DTO傳播更改非常容易。回頭來看,有可能扔掉舊的DTO並用新的DTO替換它,但它會導致很多重新繪製列表/數據模板。

我可以收集服務器端的變化並將它們傳輸到客戶端。但是,更改的字段名稱將是域/ DTO特定的,而不是ViewModel特定的。映射對我來說似乎並不平淡。如果我應該在往返之後採取必要的措施,它會破壞視圖模型的SOC /模塊性。

我正在考慮某種映射規則引擎,像automappper或發射映射器。但它解決了非常簡單的用例。我不知道它是如何映射/傳播/轉換添加項目列表或刪除。如何識別集合中的實例,以便它可以將值合併到現有實例。它也應該傳播驗證/錯誤信息。

也許我應該在DTO上實現INotifyPropertyChanged並嘗試在其上重放服務器端事件?然後將ViewModel綁定到它?綁定解決問題與收集合並好方法? PRISM的EventAgregator對此有用嗎?是否有任何事件記錄重播組件?

有服務器端邏輯的架構有更好的客戶端模式嗎?

回答

1

通常,我在Model類中保留了對DTO的引用。對於多個模型,我確保每個模型都知道如何從DTO構建自己,以及如何使用可注入的「保護程序」或其他服務提供者對象來保存自己。在模型上調用Save()時,對DTO的引用使其變得非常簡單,在將模型傳遞迴服務之前,根據模型修改舊的DTO。

希望Save()操作後其他對象的任何「更新」都可以在其他DTO中傳遞,然後應該將其加載到ViewModel使用的相應Model類中。

這樣做的缺點是你確實必須寫映射代碼,但這通常是最簡單的部分。我不相信這是做事的最佳方式,我希望看到別人的迴應。

+0

這是我在這種情況下的默認方法。通常,通過服務器事件觸發Save()後的更新,然後每個模型都可以從DTO更改觸發的更改中自行更新。 – 2010-09-29 11:57:16

0

我用了很多成功的另一種變化。我們有一個實時GUI,因此在客戶端重複重繪是不可接受的。

我們讓DTO意識到它們的屬性更改,並將PropertyChanged事件發送到ViewModel,因此會重播服務器端事件。

代碼直接寫入,單元測試等。當鍵入PropertyChangeListeners(由ViewModels實現的接口)時,它變得易於瀏覽。

此邊界也可用於將線程切換到GUI工作線程。

+1

我會擔心這樣做。擁有DTO的價值在於他們有一個擔憂 - 跨服務邊界傳輸數據 - 並且可以爲此目的進行優化。沒有方法,沒有參數化的構造函數,沒有事件 - 這些都是域對象/模型問題。 我有一個WCF項目,我們使用我們的域對象作爲DTO。它工作得很好,直到我們需要構造函數邏輯來初始化爲止(自WCF使用屬性初始化以來,該運行就沒有運行)。這種事情陷入了越來越多的愚蠢的領域問題,干擾我們的DTO,反之亦然。育。 – 2010-09-01 01:07:12

+0

你讓我意識到我的特別項目很幸運......我們確實得到了DTO和域之間偶爾有衝突的要求,但是我們能夠在DTO類中保持它們的正交性。 – louisgab 2010-09-01 13:50:03

相關問題